From 5256d4ccd84d6ab6b4e61bcc0317ccdaa490b916 Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Wed, 10 Jun 2026 08:31:37 +0000 Subject: [PATCH] fix(read): return errors for uninitialized devices --- temper_linux_test.go | 26 ++++++++++++++++++++++++++ temperctx_linux.go | 7 +++++++ 2 files changed, 33 insertions(+) diff --git a/temper_linux_test.go b/temper_linux_test.go index a96c63a..439789a 100644 --- a/temper_linux_test.go +++ b/temper_linux_test.go @@ -65,6 +65,32 @@ func TestCloseSafeOnNilAndZeroValue(t *testing.T) { } } +func TestReadCSafeOnNilAndZeroValue(t *testing.T) { + var nilTemper *Temper + if _, err := nilTemper.ReadC(); err != errUninitializedTemper { + t.Fatalf("ReadC() on nil Temper error = %v, want %v", err, errUninitializedTemper) + } + + var zero Temper + if _, err := zero.ReadC(); err != errUninitializedTemper { + t.Fatalf("ReadC() on zero-value Temper error = %v, want %v", err, errUninitializedTemper) + } +} + +func TestReadFWithContextSafeOnNilAndZeroValue(t *testing.T) { + ctx := context.Background() + + var nilTemper *Temper + if _, err := nilTemper.ReadFWithContext(ctx); err != errUninitializedTemper { + t.Fatalf("ReadFWithContext() on nil Temper error = %v, want %v", err, errUninitializedTemper) + } + + var zero Temper + if _, err := zero.ReadFWithContext(ctx); err != errUninitializedTemper { + t.Fatalf("ReadFWithContext() on zero-value Temper error = %v, want %v", err, errUninitializedTemper) + } +} + func TestIsInputDevice(t *testing.T) { if isInputDevice("temper999") { t.Error("expected false for non-existent hidraw device") diff --git a/temperctx_linux.go b/temperctx_linux.go index 959a505..46c8d4b 100644 --- a/temperctx_linux.go +++ b/temperctx_linux.go @@ -3,13 +3,20 @@ package temper import ( "context" "encoding/hex" + "errors" "fmt" "strconv" ) +var errUninitializedTemper = errors.New("temper device is uninitialized") + // ReadCWithContext reads the internal sensor temperature in Celsius, // respecting the provided context for cancellation/timeout. func (t *Temper) ReadCWithContext(ctx context.Context) (float32, error) { + if t == nil || t.reader == nil || t.writer == nil { + return 0, errUninitializedTemper + } + t.lock.Lock() defer t.lock.Unlock()