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 nodejs#271

Signed-off-by: Yage Hu <me@huyage.dev>
  • Loading branch information
yagehu committed Jun 12, 2024
1 parent afffaaa commit c7a1fd4
Show file tree
Hide file tree
Showing 2 changed files with 53 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
48 changes: 48 additions & 0 deletions test/test-path-symlink-absolute-path.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#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_fd_t fd;
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 c7a1fd4

Please sign in to comment.