// Read and decode ELF identifier
var ident [16]uint8
if _, err := r.ReadAt(ident[0:], 0); err != nil {
- return nil, err
+ return nil, &FormatError{0, "cannot read ELF identifier", err}
}
if ident[0] != '\x7f' || ident[1] != 'E' || ident[2] != 'L' || ident[3] != 'F' {
return nil, &FormatError{0, "bad magic number", ident[0:4]}
"net"
"os"
"path"
+ "path/filepath"
"reflect"
"runtime"
"slices"
}
}
}
+
+func TestOpenEmptyFile(t *testing.T) {
+ name := filepath.Join(t.TempDir(), "empty")
+ if err := os.WriteFile(name, nil, 0o644); err != nil {
+ t.Fatal(err)
+ }
+
+ _, err := Open(name)
+ if err == nil {
+ t.Fatal("Open on empty file: got nil error, want non-nil")
+ }
+
+ var formatErr *FormatError
+ if !errors.As(err, &formatErr) {
+ t.Errorf("Open on empty file: got %T (%v), want *FormatError", err, err)
+ }
+}
+
+func TestNewFileShortReader(t *testing.T) {
+ tests := []struct {
+ name string
+ data []byte
+ }{
+ {"empty", []byte{}},
+ {"one byte", []byte{0x7f}},
+ {"four bytes", []byte{0x7f, 'E', 'L', 'F'}},
+ {"fifteen bytes", make([]byte, 15)},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ _, err := NewFile(bytes.NewReader(tt.data))
+ if err == nil {
+ t.Fatal("NewFile with short data: got nil error, want non-nil")
+ }
+
+ var formatErr *FormatError
+ if !errors.As(err, &formatErr) {
+ t.Errorf("NewFile with short data: got %T (%v), want *FormatError", err, err)
+ }
+ })
+ }
+}