Skip to content

Commit

Permalink
Error on ambiguous fstflags (#242)
Browse files Browse the repository at this point in the history
* Error on ambiguous fstflags

This commit adds a check to the validator macro for `fstflags` to return
`inval` if the caller requests both `atim` and `atim_now` or both `mtim`
and `mtim_now` because the request is ambiguous.  This behavior is
consistent across other runtimes (WasmEdge, Wasmtime, WAMR).
  • Loading branch information
yagehu committed Dec 11, 2023
1 parent 1da5f32 commit ff7e84f
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 6 deletions.
15 changes: 9 additions & 6 deletions src/uvwasi.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,13 @@

#define VALIDATE_FSTFLAGS_OR_RETURN(flags) \
do { \
if ((flags) & ~(UVWASI_FILESTAT_SET_ATIM | \
UVWASI_FILESTAT_SET_ATIM_NOW | \
UVWASI_FILESTAT_SET_MTIM | \
UVWASI_FILESTAT_SET_MTIM_NOW)) { \
uvwasi_fstflags_t f = flags; \
if (((f) & ~(UVWASI_FILESTAT_SET_ATIM | UVWASI_FILESTAT_SET_ATIM_NOW | \
UVWASI_FILESTAT_SET_MTIM | UVWASI_FILESTAT_SET_MTIM_NOW)) || \
((f) & (UVWASI_FILESTAT_SET_ATIM | UVWASI_FILESTAT_SET_ATIM_NOW)) \
== (UVWASI_FILESTAT_SET_ATIM | UVWASI_FILESTAT_SET_ATIM_NOW) || \
((f) & (UVWASI_FILESTAT_SET_MTIM | UVWASI_FILESTAT_SET_MTIM_NOW)) \
== (UVWASI_FILESTAT_SET_MTIM | UVWASI_FILESTAT_SET_MTIM_NOW)) { \
return UVWASI_EINVAL; \
} \
} while (0)
Expand Down Expand Up @@ -1775,8 +1778,6 @@ uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi,
if (uvwasi == NULL || path == NULL)
return UVWASI_EINVAL;

VALIDATE_FSTFLAGS_OR_RETURN(fst_flags);

err = uvwasi_fd_table_get(uvwasi->fds,
fd,
&wrap,
Expand All @@ -1785,6 +1786,8 @@ uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi,
if (err != UVWASI_ESUCCESS)
return err;

VALIDATE_FSTFLAGS_OR_RETURN(fst_flags);

err = uvwasi__resolve_path(uvwasi,
wrap,
path,
Expand Down
47 changes: 47 additions & 0 deletions test/test-fstflags-validate.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "test-common.h"
#include "uv.h"
#include "uvwasi.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>

#define TEST_TMP_DIR "./out/tmp"

int main(void) {
#if !defined(_WIN32) && !defined(__ANDROID__)
uvwasi_t uvwasi;
uvwasi_options_t init_options;
uvwasi_errno_t err;
uv_fs_t req;
int r;

setup_test_environment();

r = uv_fs_mkdir(NULL, &req, TEST_TMP_DIR, 0777, NULL);
uv_fs_req_cleanup(&req);
assert(r == 0 || r == UV_EEXIST);

uvwasi_options_init(&init_options);
init_options.preopenc = 1;
init_options.preopens = calloc(1, sizeof(uvwasi_preopen_t));
init_options.preopens[0].mapped_path = "/var";
init_options.preopens[0].real_path = TEST_TMP_DIR;

err = uvwasi_init(&uvwasi, &init_options);
assert(err == 0);

err = uvwasi_fd_filestat_set_times(&uvwasi, 3, 100, 200,
UVWASI_FILESTAT_SET_ATIM |
UVWASI_FILESTAT_SET_ATIM_NOW);
assert(err == UVWASI_EINVAL);

err = uvwasi_fd_filestat_set_times(&uvwasi, 3, 100, 200,
UVWASI_FILESTAT_SET_MTIM |
UVWASI_FILESTAT_SET_MTIM_NOW);
assert(err == UVWASI_EINVAL);

uvwasi_destroy(&uvwasi);
free(init_options.preopens);
#endif /* !defined(_WIN32) && !defined(__ANDROID__) */
return 0;
}

0 comments on commit ff7e84f

Please sign in to comment.