Skip to content

Commit

Permalink
Error if creating symlink to absolute path
Browse files Browse the repository at this point in the history
This commit adds an absolute path check to `path_symlink`. This behavior
is specified by [WASI][1].

[1]: https://github.com/WebAssembly/wasi-filesystem/blob/main/path-resolution.md#symlinks

fixes #271

Signed-off-by: Yage Hu <me@huyage.dev>
  • Loading branch information
yagehu committed Jun 12, 2024
1 parent afffaaa commit d633344
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/uvwasi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2401,6 +2401,11 @@ uvwasi_errno_t uvwasi_path_symlink(uvwasi_t* uvwasi,
memcpy(truncated_old_path, old_path, old_path_len);
truncated_old_path[old_path_len] = '\0';

if (old_path_len > 0 && old_path[0] == '/') {
uv_mutex_unlock(&wrap->mutex);
return UVWASI_EPERM;
}

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

#define TEST_TMP_DIR "./out/tmp"
#define LINK_CONTENT "/absolute"
#define TEST_FILE "./out/tmp/test-path-symlink-absolute-path.link"

int main(void) {
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_path_symlink(&uvwasi,
LINK_CONTENT,
strlen(LINK_CONTENT) + 1,
3,
TEST_FILE,
strlen(TEST_FILE) + 1);
assert(err == UVWASI_EPERM);

uvwasi_destroy(&uvwasi);
free(init_options.preopens);

return 0;
}

0 comments on commit d633344

Please sign in to comment.