Skip to content

Commit e12b34e

Browse files
committed
Alternate fix for tetratelabs#958.
1 parent d874ebb commit e12b34e

File tree

1 file changed

+14
-2
lines changed
  • imports/wasi_snapshot_preview1

1 file changed

+14
-2
lines changed

imports/wasi_snapshot_preview1/fs.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,20 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) Errno {
580580
return ErrnoBadf
581581
}
582582

583+
read := r.Read
583584
if isPread {
584-
if s, ok := r.(io.Seeker); ok {
585+
if ra, ok := r.(io.ReaderAt); ok {
586+
read = func(p []byte) (int, error) {
587+
n, err := ra.ReadAt(p, offset)
588+
offset += int64(n)
589+
return n, err
590+
}
591+
} else if s, ok := r.(io.Seeker); ok {
592+
currentOffset, err := s.Seek(0, io.SeekCurrent)
593+
if err != nil {
594+
return ErrnoFault
595+
}
596+
defer s.Seek(currentOffset, io.SeekStart)
585597
if _, err := s.Seek(offset, io.SeekStart); err != nil {
586598
return ErrnoFault
587599
}
@@ -606,7 +618,7 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) Errno {
606618
return ErrnoFault
607619
}
608620

609-
n, err := r.Read(b)
621+
n, err := read(b)
610622
nread += uint32(n)
611623

612624
shouldContinue, errno := fdRead_shouldContinueRead(uint32(n), l, err)

0 commit comments

Comments
 (0)