From 67125fcaa43e948d88cd3b48d017c85f538e8c80 Mon Sep 17 00:00:00 2001 From: Crypt Keeper <64215+codefromthecrypt@users.noreply.github.com> Date: Tue, 31 Jan 2023 10:22:48 +0200 Subject: [PATCH] wasi: supports rewinding a directory and fixes seek error (#1084) This allows rewinding a directory by specifying the cookie 0, after already scrolling a directory. This allows zig and clang functionality to work which expect this. This also fixes the case where a directory was allowed to be seeked. This is prohibited by the current version of wasi-testsuite. Signed-off-by: Adrian Cole Co-authored-by: Takeshi Yoneda --- .github/workflows/integration.yaml | 1 - imports/wasi_snapshot_preview1/fs.go | 30 ++++-- imports/wasi_snapshot_preview1/fs_test.go | 93 +++++++++++++++--- .../wasi_snapshot_preview1/fs_unit_test.go | 9 ++ .../testdata/cargo-wasi/wasi.rs | 5 +- .../testdata/cargo-wasi/wasi.wasm | Bin 93282 -> 94208 bytes .../testdata/zig-cc/wasi.c | 11 ++- .../testdata/zig-cc/wasi.wasm | Bin 35905 -> 36160 bytes .../testdata/zig/wasi.wasm | Bin 10732 -> 10787 bytes .../testdata/zig/wasi.zig | 14 ++- .../wasi_stdlib_test.go | 12 +++ internal/sys/fs.go | 32 +++++- internal/sys/fs_test.go | 47 +++++++++ internal/sysfs/sysfs.go | 20 ++-- internal/wasi_snapshot_preview1/errno.go | 2 + .../wasi_snapshot_preview1/logging/logging.go | 4 + 16 files changed, 242 insertions(+), 38 deletions(-) diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 1a729258..8ce5c86b 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -174,7 +174,6 @@ jobs: unicode/utf16 \ unicode/utf8 - wasi-testsuite: name: wasi-testsuite runs-on: ${{ matrix.os }} diff --git a/imports/wasi_snapshot_preview1/fs.go b/imports/wasi_snapshot_preview1/fs.go index 5def6212..9d46ad33 100644 --- a/imports/wasi_snapshot_preview1/fs.go +++ b/imports/wasi_snapshot_preview1/fs.go @@ -694,9 +694,17 @@ func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) Errno { return errno } - // expect a cookie only if we are continuing a read. if cookie == 0 && dir.CountRead > 0 { - return ErrnoInval // cookie is minimally one. + // This means that there was a previous call to the dir, but cookie is reset. + // This happens when the program calls rewinddir, for example: + // https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c#L10-L12 + // + // Since we cannot unwind fs.ReadDirFile results, we re-open while keeping the same file descriptor. + f, err := fsc.ReOpenDir(fd) + if err != nil { + return ToErrno(err) + } + rd, dir = f.File.(fs.ReadDirFile), f.ReadDir } // First, determine the maximum directory entries that can be encoded as @@ -721,10 +729,19 @@ func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) Errno { // Check if we have maxDirEntries, and read more from the FS as needed. if entryCount := len(entries); entryCount < maxDirEntries { - if l, err := rd.ReadDir(maxDirEntries - entryCount); err != io.EOF { - if err != nil { - return ErrnoIo + l, err := rd.ReadDir(maxDirEntries - entryCount) + if err == io.EOF { // EOF is not an error + } else if err != nil { + if errno = ToErrno(err); errno == ErrnoNoent { + // Only on Linux platforms, ReadDir returns ErrNotExist for the "removed while opened" + // directories. In order to provide consistent behavior, ignore it. + // See https://github.com/ziglang/zig/blob/0.10.1/lib/std/fs.zig#L635-L637 + // + // TODO: Once we have our own File type, we should punt this into the behind ReadDir method above. + } else { + return errno } + } else { dir.CountRead += uint64(len(l)) entries = append(entries, l...) // Replace the cache with up to maxDirEntries, starting at cookie. @@ -783,7 +800,6 @@ func lastDirEntries(dir *sys.ReadDir, cookie int64) (entries []fs.DirEntry, errn switch { case cookiePos < 0: // cookie is asking for results outside our window. errno = ErrnoNosys // we can't implement directory seeking backwards. - case cookiePos == 0: // cookie is asking for the next page. case cookiePos > entryCount: errno = ErrnoInval // invalid as we read that far, yet. case cookiePos > 0: // truncate so to avoid large lists. @@ -989,7 +1005,7 @@ func fdSeekFn(_ context.Context, mod api.Module, params []uint64) Errno { if f, ok := fsc.LookupFile(fd); !ok { return ErrnoBadf // fs.FS doesn't declare io.Seeker, but implementations such as os.File implement it. - } else if seeker, ok = f.File.(io.Seeker); !ok { + } else if seeker, ok = f.File.(io.Seeker); !ok || f.IsDir() { return ErrnoBadf } diff --git a/imports/wasi_snapshot_preview1/fs_test.go b/imports/wasi_snapshot_preview1/fs_test.go index cb4e156a..e52a746d 100644 --- a/imports/wasi_snapshot_preview1/fs_test.go +++ b/imports/wasi_snapshot_preview1/fs_test.go @@ -1908,6 +1908,60 @@ func Test_fdReaddir(t *testing.T) { } } +func Test_fdReaddir_Rewind(t *testing.T) { + mod, r, _ := requireProxyModule(t, wazero.NewModuleConfig().WithFS(fstest.FS)) + defer r.Close(testCtx) + + fsc := mod.(*wasm.CallContext).Sys.FS() + + fd, err := fsc.OpenFile(fsc.RootFS(), "dir", os.O_RDONLY, 0) + require.NoError(t, err) + + mem := mod.Memory() + const resultBufUsed, buf, bufSize = 0, 8, 100 + read := func(cookie, bufSize uint64) (bufUsed uint32) { + requireErrno(t, ErrnoSuccess, mod, FdReaddirName, + uint64(fd), buf, bufSize, cookie, uint64(resultBufUsed)) + + bufUsed, ok := mem.ReadUint32Le(resultBufUsed) + require.True(t, ok) + return bufUsed + } + + cookie := uint64(0) + // Initial read. + initialBufUsed := read(cookie, bufSize) + // Ensure that all is read. + require.Equal(t, len(dirent1)+len(dirent2)+len(dirent3), int(initialBufUsed)) + resultBuf, ok := mem.Read(buf, initialBufUsed) + require.True(t, ok) + require.Equal(t, append(append(dirent1, dirent2...), dirent3...), resultBuf) + + // Mask the result. + for i := range resultBuf { + resultBuf[i] = '?' + } + + // Advance the cookie beyond the existing entries. + cookie += 3 + // Nothing to read from, so bufUsed must be zero. + require.Equal(t, 0, int(read(cookie, bufSize))) + + // Ensure buffer is intact. + for i := range resultBuf { + require.Equal(t, byte('?'), resultBuf[i]) + } + + // Here, we rewind the directory by setting cookie=0 on the same file descriptor. + cookie = 0 + usedAfterRewind := read(cookie, bufSize) + // Ensure that all is read. + require.Equal(t, len(dirent1)+len(dirent2)+len(dirent3), int(usedAfterRewind)) + resultBuf, ok = mem.Read(buf, usedAfterRewind) + require.True(t, ok) + require.Equal(t, append(append(dirent1, dirent2...), dirent3...), resultBuf) +} + func Test_fdReaddir_Errors(t *testing.T) { mod, r, log := requireProxyModule(t, wazero.NewModuleConfig().WithFS(fstest.FS)) defer r.Close(testCtx) @@ -2069,8 +2123,8 @@ func Test_fdSeek(t *testing.T) { '?', }, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=4,offset=4,whence=0,result.newoffset=1) -<== errno=ESUCCESS +==> wasi_snapshot_preview1.fd_seek(fd=4,offset=4,whence=0,4557430888798830399) +<== (newoffset=4,errno=ESUCCESS) `, }, { @@ -2084,8 +2138,8 @@ func Test_fdSeek(t *testing.T) { '?', }, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=4,offset=1,whence=1,result.newoffset=1) -<== errno=ESUCCESS +==> wasi_snapshot_preview1.fd_seek(fd=4,offset=1,whence=1,4557430888798830399) +<== (newoffset=2,errno=ESUCCESS) `, }, { @@ -2099,8 +2153,8 @@ func Test_fdSeek(t *testing.T) { '?', }, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=4,offset=-1,whence=2,result.newoffset=1) -<== errno=ESUCCESS +==> wasi_snapshot_preview1.fd_seek(fd=4,offset=-1,whence=2,4557430888798830399) +<== (newoffset=5,errno=ESUCCESS) `, }, } @@ -2138,9 +2192,13 @@ func Test_fdSeek(t *testing.T) { } func Test_fdSeek_Errors(t *testing.T) { - mod, fd, log, r := requireOpenFile(t, t.TempDir(), "test_path", []byte("wazero"), true) + mod, fd, log, r := requireOpenFile(t, t.TempDir(), "test_path", []byte("wazero"), false) defer r.Close(testCtx) + fsc := mod.(*wasm.CallContext).Sys.FS() + require.NoError(t, fsc.RootFS().Mkdir("dir", 0o0700)) + dirFD := requireOpenFD(t, mod, "dir") + memorySize := mod.Memory().Size() tests := []struct { @@ -2156,8 +2214,8 @@ func Test_fdSeek_Errors(t *testing.T) { fd: 42, // arbitrary invalid fd expectedErrno: ErrnoBadf, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=42,offset=0,whence=0,result.newoffset=0) -<== errno=EBADF +==> wasi_snapshot_preview1.fd_seek(fd=42,offset=0,whence=0,0) +<== (newoffset=,errno=EBADF) `, }, { @@ -2166,8 +2224,17 @@ func Test_fdSeek_Errors(t *testing.T) { whence: 3, // invalid whence, the largest whence io.SeekEnd(2) + 1 expectedErrno: ErrnoInval, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=4,offset=0,whence=3,result.newoffset=0) -<== errno=EINVAL +==> wasi_snapshot_preview1.fd_seek(fd=4,offset=0,whence=3,0) +<== (newoffset=,errno=EINVAL) +`, + }, + { + name: "dir not file", + fd: dirFD, + expectedErrno: ErrnoBadf, + expectedLog: ` +==> wasi_snapshot_preview1.fd_seek(fd=5,offset=0,whence=0,0) +<== (newoffset=,errno=EBADF) `, }, { @@ -2176,8 +2243,8 @@ func Test_fdSeek_Errors(t *testing.T) { resultNewoffset: memorySize, expectedErrno: ErrnoFault, expectedLog: ` -==> wasi_snapshot_preview1.fd_seek(fd=4,offset=0,whence=0,result.newoffset=65536) -<== errno=EFAULT +==> wasi_snapshot_preview1.fd_seek(fd=4,offset=0,whence=0,) +<== (newoffset=,errno=EFAULT) `, }, } diff --git a/imports/wasi_snapshot_preview1/fs_unit_test.go b/imports/wasi_snapshot_preview1/fs_unit_test.go index 4567a5c1..0c267dfb 100644 --- a/imports/wasi_snapshot_preview1/fs_unit_test.go +++ b/imports/wasi_snapshot_preview1/fs_unit_test.go @@ -158,6 +158,15 @@ func Test_lastDirEntries(t *testing.T) { cookie: 1, expectedErrno: ErrnoNosys, // not implemented }, + { + name: "read from the beginning (cookie=0)", + f: &sys.ReadDir{ + CountRead: 3, + Entries: testDirEntries, + }, + cookie: 0, + expectedEntries: testDirEntries, + }, } for _, tt := range tests { diff --git a/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.rs b/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.rs index 2883787a..ed6cf1e6 100644 --- a/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.rs +++ b/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.rs @@ -14,7 +14,10 @@ fn main() { match args[1].as_str() { "ls" => { main_ls(&args[2]); - }, + if args.len() == 4 && args[3].as_str() == "repeat" { + main_ls(&args[2]); + } + } "stat" => { main_stat(); } diff --git a/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.wasm b/imports/wasi_snapshot_preview1/testdata/cargo-wasi/wasi.wasm index 967687ec929cf35e19356b4f08176226bd337aed..7a8ed41f35a6a32e3d7c042a9744d108d60f1262 100644 GIT binary patch literal 94208 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%0D;ifvXCfeh++Y(jy?T0804rIw-bG-`(Kv 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 Rb;@px99oMABpiG9{{aYlVPXIP literal 93282 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

QU2RkWXif?GX`YS}NQoB}FxDFZU|8R5Cg? z&QGJJI?U9D4s*Q*Rl-%YQ+yi8%suYi!p}d85%yMo^=YCa($j~1%QIj^Ghie{>jU#P z{%A}GwDFwjWM@?WfeH4IL2X(V0Gu9`18xLrungak%vbZ9!zpx$!2V0;dtde1E%YH5Y zvc;$i4Nr!K>gj=L*tYjNe)Of8K*-9%Gbb>STc=2b;~KtZ+e-6!xO@92wm0mmx2|vX z2F4dmRU_YVS@TH~lGNApQ{pnacn* z&-g_Pw#DIa@y+)&_*CgW+~A#@Z>w+Qcel6vOdWHYQE(zw)O}C!0+6ecvwc+x-ZXXl za;j>e3t^bjeBU*_JNcQ#B94rLOR7Cmq?Ob+^Px4Q3X}5)Fe`Q}z}q>WpJ>BZT*uU8 z5WFozf||iw_(;Mr#>Y(Lkwuu+KNzLzwgQvCDmwt@rvFy{EDMRD>WpmIs>84gdp~R; z*nj=iL+@u~ zTJ0Q*gbs0GEP(>~NSNG;^md*U7_Tw*4t`e~V`>@wPdBHB$Uf9<+j;?*f#$5?LNcL8 zmA~a5=FeL9brBDOnUod-;!{Gx`0ax7;_%TZ+Z2t}LM+ryeuUMlHc)|mPPEtzz>c-% zxEM5%@%4S|mu5XJNgz9R-;&50Rt{Z^V-7YvS#sXVYwMf}Hmo&`y^PsSHfzKAANvo~ zoGW{Vj9mxsntHZCpL4Jd4FnBCl;@i7=Fcok+uUbtY-@lnBw_mkOun*z7vGEH(GFvq z4%u=m?tAzr_;qoE|NrUNR^PP`D@GvRJ&A)JK$jl&b-+@D6&dhTOY`5$?}#8IHYQ@4 zPu#52$}}913Fdv6_I=VYb*yNBANhCl8`?EiHrg+lfr+&}DKHce0W?-gzK7o$_v=JL znw-ldo!9jhWMfO1XOL;K^*(+^vB(@WB4>}k<2RpM#uM7-YASZ0cmV)9IKHIb%b$bo z!G)dAwLIusImN)T!TYDC(HxA)m<%wnISLS%{QrWl_QPLC$v6kQK3TE`kN=9ubw*xd7BK8Q2$s(dcwF`0LngGDRK&1pwjO@m)40%tcHw;^LzRO1j(PgvbP{{y>I5uoVq|@o-XG$VKbW>p!rzOMVXW1|xv{l)vYrwTY=LHzWqJNeipUGPaaq9Yiz#;pIrb_T^;w zN6CS11VG!^ZWdVo7{iuIbRcbbE@sObNo%ZRNR+VtVEKykiRpACltvexU_pS*Y*>5C zeRAqihsi)DI>pq2LCw#7ia(D)8Nd}g>=|w#M zFl)*G!n9Ju0ZPS~ntIL(^uSXe<_jToiM%@49xpgJ(H_1K`9j^pK2vgOXH)^IgsIoE zK|!!BV0WToKEhvm_B;T4PR}8L5ytjx8=gDl91?tyUw`%-!tyIsxI@J?fKsesjouDu zCCX8aFYzk)X4@k5nE{aIk@u{Tv!S0lviaqy$2Vtd5{U)f0{Kgp_9!1YKDMI-a>K)+ zo#+{hygeYyVRukL7wT6aIh%`|?MYse!(yRC(E`VH$ruI$_*eN<5$9diALHkSLo#VL zJkHNz28K~M-_UY79O-Ib*pZk2dU(fYR nYs<9p8D})~HP7o7ft8iDlDSr~R;Q2Stb;}^E%nP*zx00rVGz6a diff --git a/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c b/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c index 152ef1c9..327f00b8 100644 --- a/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c +++ b/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c @@ -3,10 +3,11 @@ #include #include #include +#include #define formatBool(b) ((b) ? "true" : "false") -void main_ls(char *dir_name) { +void main_ls(char *dir_name, bool repeat) { DIR *d; struct dirent *dir; d = opendir(dir_name); @@ -14,6 +15,12 @@ void main_ls(char *dir_name) { while ((dir = readdir(d)) != NULL) { printf("./%s\n", dir->d_name); } + if (repeat) { + rewinddir(d); + while ((dir = readdir(d)) != NULL) { + printf("./%s\n", dir->d_name); + } + } closedir(d); } else if (errno == ENOTDIR) { printf("ENOTDIR\n"); @@ -31,7 +38,7 @@ void main_stat() { int main(int argc, char** argv) { if (strcmp(argv[1],"ls")==0) { - main_ls(argv[2]); + main_ls(argv[2], strcmp(argv[3],"repeat")==0); } else if (strcmp(argv[1],"stat")==0) { main_stat(); } else { diff --git a/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.wasm b/imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.wasm index 86a102b46ab4d54c9dc7f4b204a77122b7b56318..04de37dd0570fb3757300c34e69d411583448a27 100755 GIT binary patch delta 3469 zcmb7GYiv{39Y2qIef@+>V<14F=Ux(;kPzZL>=0PVNe75-tR+CIeQ1qiJ0#BAaSG}> zYzAecRX4iR57pF3t7zGyY|FT95mnbQtA3F)r zkk;ACdHf&0^M5I~~%x}~#gYw-JjrY$~V$LwwD zW7bN4;??o7W%Ld2+32UVNf6nRbC@iZ-YOBt$GXd>2-!}gU2uFM;gi>2x>O>=f_Z0F zJhG(s>JsKJvZL!u@FDUv9d=2rKC|xIzX1Fp$-#P)V6X-lVHOe=I%$@f0)0V$ zEy?ac{Pw-kI!hWk#|#NmKAv+ZY+r#Z?}h`?1%=I}>b1n(2@`;k0+5aY47gEYL`bOY zA3P#VVGTUp1aO5B0$dl+u7#smZ!PkOosTNd|IpCgjt{ATQvC$k{I=KU{W|3npjjB%~7{NrL-@Hm%xaaaIFo z*rKdnT!WjX`#T@khC)Y+6-yL^6DgY$7Ep zYoV6q4K>rWyzwKHbg)DOjkAODV#VI;5O!^_u2%2}iuAMNJSbHK=kg*P_J87Z%d-`n zON(&$|H7$R>{p9?yMogKZYigE75%Z=+I*Co!c@!lRNeJgWasR2m?DS;%m(jI&DS|Q zaZLTHwX^td9}mFbpvCndP$KesFgj>?bbxRTOd$*thrhWm)@h9kcGk0~YYam(t^5MS zUlXcbV|N6a6iU(2O^+wnC!kAsJ+WO&R_7c)gQmoc3BM>BP)kwC9V2XDf%_kbP+)^v zH9XJiPzcq&F~nMtRcT zHsyH;h~U1S^PuU^**`_!blM?dh_*ljVVqsm(K>pz$);TqC?1S(kwt}nzM?q%emDVm z6h@_fFanxZ6~-8Y!OUw%x?(im`-5@AF36w zaf%bDU-W=Ns6rv6Lg`TGBXuPnqpx_O#0?&}qI;CtuXvw!ZKU3G`xx_XwLV6@4ci6{ z>ZxyazeitHBl0)&Rj;Gx_mrOZtk17y^fgttQ^2}YuZMOza6YBim-YINUjL@oWxIfT zrfnB!dF{Jz@)hOIccPdQvz}ct-70zVnCjZ&(i!jJJuybltJC{7!dtIDkb);w&EBCo zlKR=+x8~0;^j5?9_1-VfQ?~DWuzX&99#f@%y`Y|?z<(v80-Df1ul~62AuY5{-M>E! zuROH>ethNHC_Jg&Ik37%>tf{-rwSpew7$HK8IiYe6?X&4ty&{L(6m`it6C#gtdTHp z;Ejg9N9G~DzB=l8SNbA>GU-mX)e2YZH6BD~%BIX5yanfTsoKy9Op~Nq;%e&GKt0pn zMlYy$`>(_Gd5%*GAW=-)1lf?`AGr znt(xgp*L!-)nXrxEZ8$SS_8aqj$(+x!aKRKMy%3m>&MFIn8dSV9UL^?o7?~wo^NLK zqSsnTP$Qq6$a(|QKk#|WA1_$(-?310Cfh%KC^5_C0Bz-HVFOMqBOB-JdC48o2e3I18SNNlpexQno7DvZHJ z472hWXp91bT|g<<)4{3wR z`xY^*iX9tGz87&iP->IOuc(<5(+At zc5aEc#N)Bf_C&0`E!&?-r_$|-R=Bpt;#&qfQ|W=0&W>1rd;ore{tz_AQlnY=V(@ch zql$gq^`1NV24jg%)pu$iZ;Qp$xl=a}Sov%!lNri4`X=&2V}*exV`926waFSNUz?XD zlVJF0GMyS3NoES;U}Lo=4UG)-r;}sj>BE`iz*Hdx-xl9!b~HVhkEt6^t}V6(lF5O? z`JqDgNSkjUpFJ`$((Zq>g4+=)<0sSO`E1;p7@tU{@`n<9B9-ZkB$HEx%+Po;Ju*I( p-7_WzmPu^WoZmV3+Ec$`fBGeReUh6XM=7o7Bqp zRNzBog*ol(S4XCa4MsPKZ5&tP*;#%#NCb(nA4qCjbVrclCgY5*Kj=hTH$K-IbiUWx z$YzN1Vdtu{UQYu8EaVKaCD=XxYY1!n4xvmvzU~dEI))T?}ZnXi!z1Pq7g zcjx)Y#xk%Ev~pH$Vjap(YZV!|W+wxvO;7+skDY8ecM115jwqI#~SWI1@-rU@P$nzpS$bM*poU8s6a4Z6yREdi%&8HUIT6Wpt z4mE+FSEee&u1=sINJk^!3@E~Jgzi}Oo9-r`A6s7Wo#HEswVk=?**g?!m4{=(Ul-6v{}caHg_?AJ6tQqs|c?~0GfxG zi-Zaax`58;r>0qM1Zk{uLFvDj9zrieH$Rd zYr9jBsMEG*cuwTJv*+sk`}Am7Zx+P3=v>?T-FfM*eY>mgt1l|rpg5Q_A_e~Nhed;O z_-Nk&Wwa&;_nSQ9vBgT1yP3xx#)ud8LwM)L{?&a715Xq&LwL4A3P=7OCslrdPq7w6 zR;WpSpk)76vQU#))g)m!Ai4N~$LArZ4y>n_+>Z|g>*hskQw{LmlfnwBaoK;3C4*vNOx8>Lq-trX|=*VOT#t$ZkbA$O-N{B}AqtPLF z){`}AM~Dt9YljEDOXnwvL3jc-+PC20QA*;Wo_(ubzzdkcm`r zxFb!#gOK;Bzs75^R7ek{3MBeiF|8mm1B|v;J?8 z4bGXLTJAGH`6FZ9F=yAQy}UEg<^1NLCS$40t*M`~W(fvR^hoiAkX^N!`mlBvSMI3G)862WA$Sjr6Nlj)IsG21i0Raje= iDQ$kdlvMkz^>fz6Z1&K$(0umJiPJ+>uG+pfSN{bfsTd&u diff --git a/imports/wasi_snapshot_preview1/testdata/zig/wasi.wasm b/imports/wasi_snapshot_preview1/testdata/zig/wasi.wasm index dd8a330d1b799329ebe99270b7917144864550ac..d6a3e0faf1052f2136cac44d662605b58809b217 100755 GIT binary patch delta 4162 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 K&M5w%#{La27VcO8 diff --git a/imports/wasi_snapshot_preview1/testdata/zig/wasi.zig b/imports/wasi_snapshot_preview1/testdata/zig/wasi.zig index 3c68c763..2d49425d 100644 --- a/imports/wasi_snapshot_preview1/testdata/zig/wasi.zig +++ b/imports/wasi_snapshot_preview1/testdata/zig/wasi.zig @@ -22,9 +22,10 @@ pub fn main() !void { return; }, }; - var iter = dir.iterate(); - while (try iter.next()) |entry| { - try stdout.print("./{s}\n", .{entry.name}); + + try ls(dir); + if (args.len > 3 and std.mem.eql(u8, args[3], "repeat")) { + try ls(dir); } } else if (std.mem.eql(u8, args[1], "stat")) { try stdout.print("stdin isatty: {}\n", .{os.isatty(0)}); @@ -40,3 +41,10 @@ pub fn main() !void { } } } + +fn ls(dir: std.fs.IterableDir) !void { + var iter = dir.iterate(); + while (try iter.next()) |entry| { + try stdout.print("./{s}\n", .{entry.name}); + } +} diff --git a/imports/wasi_snapshot_preview1/wasi_stdlib_test.go b/imports/wasi_snapshot_preview1/wasi_stdlib_test.go index dd75fa0b..7962e306 100644 --- a/imports/wasi_snapshot_preview1/wasi_stdlib_test.go +++ b/imports/wasi_snapshot_preview1/wasi_stdlib_test.go @@ -80,6 +80,18 @@ ENOTDIR `, "\n"+console) }) + t.Run("directory with entries - read twice", func(t *testing.T) { + console := compileAndRun(t, moduleConfig.WithArgs("wasi", "ls", ".", "repeat"), bin) + require.Equal(t, ` +./- +./a- +./ab- +./- +./a- +./ab- +`, "\n"+console) + }) + t.Run("directory with tons of entries", func(t *testing.T) { testFS := fstest.MapFS{} count := 8096 diff --git a/internal/sys/fs.go b/internal/sys/fs.go index d69d68ba..2d361d36 100644 --- a/internal/sys/fs.go +++ b/internal/sys/fs.go @@ -170,6 +170,10 @@ type FileEntry struct { // ReadDir is present when this File is a fs.ReadDirFile and `ReadDir` // was called. ReadDir *ReadDir + + openPath string + openFlag int + openPerm fs.FileMode } // IsDir returns true if the file is a directory. @@ -298,7 +302,7 @@ func (c *FSContext) OpenFile(fs sysfs.FS, path string, flag int, perm fs.FileMod if f, err := fs.OpenFile(path, flag, perm); err != nil { return 0, err } else { - fe := &FileEntry{FS: fs, File: f} + fe := &FileEntry{openPath: path, FS: fs, File: f, openFlag: flag, openPerm: perm} if path == "/" || path == "." { fe.Name = "" } else { @@ -309,6 +313,32 @@ func (c *FSContext) OpenFile(fs sysfs.FS, path string, flag int, perm fs.FileMod } } +// ReOpenDir re-opens the directory while keeping the same file descriptor. +// TODO: this might not be necessary once we have our own File type. +func (c *FSContext) ReOpenDir(fd uint32) (*FileEntry, error) { + f, ok := c.openedFiles.Lookup(fd) + if !ok { + return nil, syscall.EBADF + } else if !f.IsDir() { + return nil, syscall.EISDIR + } + + if err := f.File.Close(); err != nil { + return nil, err + } + + // Re-opens with the same parameters as before. + opened, err := f.FS.OpenFile(f.openPath, f.openFlag, f.openPerm) + if err != nil { + return nil, err + } + + // Reset the state. + f.File = opened + f.ReadDir.CountRead, f.ReadDir.Entries = 0, nil + return f, nil +} + // LookupFile returns a file if it is in the table. func (c *FSContext) LookupFile(fd uint32) (*FileEntry, bool) { f, ok := c.openedFiles.Lookup(fd) diff --git a/internal/sys/fs_test.go b/internal/sys/fs_test.go index bf69fd61..4a96c6a1 100644 --- a/internal/sys/fs_test.go +++ b/internal/sys/fs_test.go @@ -7,6 +7,7 @@ import ( "io" "io/fs" "os" + "syscall" "testing" "testing/fstest" @@ -181,3 +182,49 @@ func TestContext_Close_Error(t *testing.T) { // Paths should clear even under error require.Zero(t, fsc.openedFiles.Len(), "expected no opened files") } + +func TestFSContext_ReOpenDir(t *testing.T) { + tmpDir := t.TempDir() + dirFs := sysfs.NewDirFS(tmpDir) + + const dirName = "dir" + err := dirFs.Mkdir(dirName, 0o700) + require.NoError(t, err) + + fsc, err := NewFSContext(nil, nil, nil, dirFs) + require.NoError(t, err) + defer func() { + require.NoError(t, fsc.Close(context.Background())) + }() + + t.Run("ok", func(t *testing.T) { + dirFd, err := fsc.OpenFile(dirFs, dirName, os.O_RDONLY, 0o600) + require.NoError(t, err) + + ent, ok := fsc.LookupFile(dirFd) + require.True(t, ok) + + // Set arbitrary state. + ent.ReadDir = &ReadDir{Entries: make([]fs.DirEntry, 10), CountRead: 12345} + + // Then reopen the same file descriptor. + ent, err = fsc.ReOpenDir(dirFd) + require.NoError(t, err) + + // Verify the read dir state has been reset. + require.Equal(t, &ReadDir{}, ent.ReadDir) + }) + + t.Run("non existing ", func(t *testing.T) { + _, err = fsc.ReOpenDir(12345) + require.ErrorIs(t, err, syscall.EBADF) + }) + + t.Run("not dir", func(t *testing.T) { + const fileName = "dog" + fd, err := fsc.OpenFile(dirFs, fileName, os.O_CREATE, 0o600) + require.NoError(t, err) + _, err = fsc.ReOpenDir(fd) + require.ErrorIs(t, err, syscall.EISDIR) + }) +} diff --git a/internal/sysfs/sysfs.go b/internal/sysfs/sysfs.go index d0097d14..8f3a3e5a 100644 --- a/internal/sysfs/sysfs.go +++ b/internal/sysfs/sysfs.go @@ -110,6 +110,16 @@ type FS interface { // - syscall.EISDIR: `path` exists, but is a directory. Unlink(path string) error + // Truncate is similar to syscall.Truncate, except the path is relative to + // this file system. + // + // # Errors + // + // The following errors are expected: + // - syscall.EINVAL: `path` is invalid or size is negative. + // - syscall.ENOENT: `path` doesn't exist + Truncate(name string, size int64) error + // Utimes is similar to syscall.UtimesNano, except the path is relative to // this file system. // @@ -125,16 +135,6 @@ type FS interface { // - syscall.UtimesNano cannot change the ctime. Also, neither WASI nor // runtime.GOOS=js support changing it. Hence, ctime it is absent here. Utimes(path string, atimeNsec, mtimeNsec int64) error - - // Truncate is similar to syscall.Truncate, except the path is relative to - // this file system. - // - // # Errors - // - // The following errors are expected: - // - syscall.EINVAL: `path` is invalid or size is negative. - // - syscall.ENOENT: `path` doesn't exist - Truncate(name string, size int64) error } // StatPath is a convenience that calls FS.OpenFile until there is a stat diff --git a/internal/wasi_snapshot_preview1/errno.go b/internal/wasi_snapshot_preview1/errno.go index e51536e1..94b3faec 100644 --- a/internal/wasi_snapshot_preview1/errno.go +++ b/internal/wasi_snapshot_preview1/errno.go @@ -283,6 +283,8 @@ func ToErrno(err error) Errno { return ErrnoNosys case errors.Is(err, syscall.ENOTDIR): return ErrnoNotdir + case errors.Is(err, syscall.EPERM), errors.Is(err, fs.ErrPermission): + return ErrnoPerm default: return ErrnoIo } diff --git a/internal/wasi_snapshot_preview1/logging/logging.go b/internal/wasi_snapshot_preview1/logging/logging.go index 62392016..88c799ac 100644 --- a/internal/wasi_snapshot_preview1/logging/logging.go +++ b/internal/wasi_snapshot_preview1/logging/logging.go @@ -150,6 +150,10 @@ func Config(fnd api.FunctionDefinition) (pSampler logging.ParamSampler, pLoggers logger = logMemI32(idx).Log rLoggers = append(rLoggers, resultParamLogger(name, logger)) continue + case "result.newoffset": + name = resultParamName(name) + logger = logMemI64(idx).Log + rLoggers = append(rLoggers, resultParamLogger(name, logger)) case "result.filestat": name = resultParamName(name) logger = logFilestat(idx).Log