From f9ac648388a8cad6be98bb4508762059d9c0d47b Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 1 Dec 2019 01:55:31 +0100 Subject: [PATCH] add custom allocator option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a good idea for libraries in general, and helps with tracking memory allocated by uvwasi in Node.js. The allocator struct format is identical to the one used by nghttp2 and related libraries, which makes things a bit easier because we’ve added generic support for that format in the QUIC repo. --- app.c | 1 + include/fd_table.h | 13 +- include/uvwasi.h | 15 ++- src/fd_table.c | 34 +++-- src/uvwasi.c | 156 +++++++++++++++++------ src/uvwasi_alloc.h | 11 ++ test/test-args-get.c | 1 + test/test-basic-file-io.c | 1 + test/test-ebadf-input-validation.c | 1 + test/test-environ-get.c | 1 + test/test-fd-prestat-dir-name.c | 1 + test/test-path-create-remove-directory.c | 1 + test/test-random-get.c | 1 + 13 files changed, 180 insertions(+), 57 deletions(-) create mode 100644 src/uvwasi_alloc.h diff --git a/app.c b/app.c index b2b7d26..325ed2d 100644 --- a/app.c +++ b/app.c @@ -40,6 +40,7 @@ int main(void) { init_options.preopens = calloc(1, sizeof(uvwasi_preopen_t)); init_options.preopens[0].mapped_path = "/var"; init_options.preopens[0].real_path = "."; + init_options.allocator = NULL; r = uvwasi_init(uvw, &init_options); assert(r == 0); diff --git a/include/fd_table.h b/include/fd_table.h index 4a39247..42a5f0d 100644 --- a/include/fd_table.h +++ b/include/fd_table.h @@ -16,6 +16,7 @@ # define PATH_MAX_BYTES (PATH_MAX) #endif +struct uvwasi_s; struct uvwasi_fd_wrap_t { uvwasi_fd_t id; @@ -37,14 +38,18 @@ struct uvwasi_fd_table_t { uv_rwlock_t rwlock; }; -uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_fd_table_t* table, +uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_s* uvwasi, + struct uvwasi_fd_table_t* table, uint32_t init_size); -void uvwasi_fd_table_free(struct uvwasi_fd_table_t* table); -uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_fd_table_t* table, +void uvwasi_fd_table_free(struct uvwasi_s* uvwasi, + struct uvwasi_fd_table_t* table); +uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_s* uvwasi, + struct uvwasi_fd_table_t* table, const uv_file fd, const char* path, const char* real_path); -uvwasi_errno_t uvwasi_fd_table_insert_fd(struct uvwasi_fd_table_t* table, +uvwasi_errno_t uvwasi_fd_table_insert_fd(struct uvwasi_s* uvwasi, + struct uvwasi_fd_table_t* table, const uv_file fd, const int flags, const char* path, diff --git a/include/uvwasi.h b/include/uvwasi.h index f794115..2a4e389 100644 --- a/include/uvwasi.h +++ b/include/uvwasi.h @@ -22,6 +22,18 @@ extern "C" { UVWASI_STRINGIFY(UVWASI_VERSION_PATCH) #define UVWASI_VERSION_WASI "snapshot_0" +typedef void* (*uvwasi_malloc)(size_t size, void* mem_user_data); +typedef void (*uvwasi_free)(void* ptr, void* mem_user_data); +typedef void* (*uvwasi_calloc)(size_t nmemb, size_t size, void* mem_user_data); +typedef void* (*uvwasi_realloc)(void* ptr, size_t size, void* mem_user_data); + +typedef struct uvwasi_mem_s { + void* mem_user_data; + uvwasi_malloc malloc; + uvwasi_free free; + uvwasi_calloc calloc; + uvwasi_realloc realloc; +} uvwasi_mem_t; typedef struct uvwasi_s { struct uvwasi_fd_table_t fds; @@ -33,6 +45,7 @@ typedef struct uvwasi_s { char** env; char* env_buf; size_t env_buf_size; + const uvwasi_mem_t* allocator; } uvwasi_t; typedef struct uvwasi_preopen_s { @@ -47,9 +60,9 @@ typedef struct uvwasi_options_s { size_t argc; char** argv; char** envp; + const uvwasi_mem_t* allocator; } uvwasi_options_t; - // Embedder API. uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options); void uvwasi_destroy(uvwasi_t* uvwasi); diff --git a/src/fd_table.c b/src/fd_table.c index 35c7810..f716495 100644 --- a/src/fd_table.c +++ b/src/fd_table.c @@ -10,6 +10,7 @@ #include "fd_table.h" #include "wasi_types.h" #include "uv_mapping.h" +#include "uvwasi_alloc.h" #define UVWASI__RIGHTS_ALL (UVWASI_RIGHT_FD_DATASYNC | \ @@ -175,7 +176,8 @@ static uvwasi_errno_t uvwasi__get_type_and_rights(uv_file fd, } -static uvwasi_errno_t uvwasi__fd_table_insert(struct uvwasi_fd_table_t* table, +static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi, + struct uvwasi_fd_table_t* table, uv_file fd, const char* mapped_path, const char* real_path, @@ -197,7 +199,7 @@ static uvwasi_errno_t uvwasi__fd_table_insert(struct uvwasi_fd_table_t* table, /* Check that there is room for a new item. If there isn't, grow the table. */ if (table->used >= table->size) { new_size = table->size * 2; - new_fds = realloc(table->fds, new_size * sizeof(*new_fds)); + new_fds = uvwasi__realloc(uvwasi, table->fds, new_size * sizeof(*new_fds)); if (new_fds == NULL) { err = UVWASI_ENOMEM; goto exit; @@ -255,7 +257,8 @@ static uvwasi_errno_t uvwasi__fd_table_insert(struct uvwasi_fd_table_t* table, } -uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_fd_table_t* table, +uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi, + struct uvwasi_fd_table_t* table, uint32_t init_size) { struct uvwasi_fd_wrap_t* wrap; uvwasi_filetype_t type; @@ -276,7 +279,9 @@ uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_fd_table_t* table, table->used = 0; table->size = init_size; - table->fds = calloc(init_size, sizeof(struct uvwasi_fd_wrap_t)); + table->fds = uvwasi__calloc(uvwasi, + init_size, + sizeof(struct uvwasi_fd_wrap_t)); if (table->fds == NULL) { err = UVWASI_ENOMEM; @@ -293,7 +298,8 @@ uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_fd_table_t* table, if (err != UVWASI_ESUCCESS) goto error_exit; - err = uvwasi__fd_table_insert(table, + err = uvwasi__fd_table_insert(uvwasi, + table, i, "", "", @@ -313,16 +319,16 @@ uvwasi_errno_t uvwasi_fd_table_init(struct uvwasi_fd_table_t* table, return UVWASI_ESUCCESS; error_exit: - uvwasi_fd_table_free(table); + uvwasi_fd_table_free(uvwasi, table); return err; } -void uvwasi_fd_table_free(struct uvwasi_fd_table_t* table) { +void uvwasi_fd_table_free(uvwasi_t* uvwasi, struct uvwasi_fd_table_t* table) { if (table == NULL) return; - free(table->fds); + uvwasi__free(uvwasi, table->fds); table->fds = NULL; table->size = 0; table->used = 0; @@ -330,7 +336,8 @@ void uvwasi_fd_table_free(struct uvwasi_fd_table_t* table) { } -uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_fd_table_t* table, +uvwasi_errno_t uvwasi_fd_table_insert_preopen(uvwasi_t* uvwasi, + struct uvwasi_fd_table_t* table, const uv_file fd, const char* path, const char* real_path) { @@ -349,7 +356,8 @@ uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_fd_table_t* table, if (type != UVWASI_FILETYPE_DIRECTORY) return UVWASI_ENOTDIR; - err = uvwasi__fd_table_insert(table, + err = uvwasi__fd_table_insert(uvwasi, + table, fd, path, real_path, @@ -365,7 +373,8 @@ uvwasi_errno_t uvwasi_fd_table_insert_preopen(struct uvwasi_fd_table_t* table, } -uvwasi_errno_t uvwasi_fd_table_insert_fd(struct uvwasi_fd_table_t* table, +uvwasi_errno_t uvwasi_fd_table_insert_fd(uvwasi_t* uvwasi, + struct uvwasi_fd_table_t* table, const uv_file fd, const int flags, const char* path, @@ -385,7 +394,8 @@ uvwasi_errno_t uvwasi_fd_table_insert_fd(struct uvwasi_fd_table_t* table, if (r != UVWASI_ESUCCESS) return r; - r = uvwasi__fd_table_insert(table, + r = uvwasi__fd_table_insert(uvwasi, + table, fd, path, path, diff --git a/src/uvwasi.c b/src/uvwasi.c index da157a1..0f7c4c5 100644 --- a/src/uvwasi.c +++ b/src/uvwasi.c @@ -19,11 +19,56 @@ #define UVWASI__READDIR_NUM_ENTRIES 1 #include "uvwasi.h" +#include "uvwasi_alloc.h" #include "uv.h" #include "uv_mapping.h" #include "fd_table.h" #include "clocks.h" +static void* default_malloc(size_t size, void* mem_user_data) { + return malloc(size); +} + +static void default_free(void* ptr, void* mem_user_data) { + free(ptr); +} + +static void* default_calloc(size_t nmemb, size_t size, void* mem_user_data) { + return calloc(nmemb, size); +} + +static void* default_realloc(void* ptr, size_t size, void* mem_user_data) { + return realloc(ptr, size); +} + +void* uvwasi__malloc(const uvwasi_t* uvwasi, size_t size) { + return uvwasi->allocator->malloc(size, uvwasi->allocator->mem_user_data); +} + +void uvwasi__free(const uvwasi_t* uvwasi, void* ptr) { + uvwasi->allocator->free(ptr, uvwasi->allocator->mem_user_data); +} + +void* uvwasi__calloc(const uvwasi_t* uvwasi, size_t nmemb, size_t size) { + return uvwasi->allocator->calloc(nmemb, + size, + uvwasi->allocator->mem_user_data); +} + +void* uvwasi__realloc(const uvwasi_t* uvwasi, void* ptr, size_t size) { + return uvwasi->allocator->realloc(ptr, + size, + uvwasi->allocator->mem_user_data); +} + +static const uvwasi_mem_t default_allocator = { + NULL, + default_malloc, + default_free, + default_calloc, + default_realloc, +}; + static int uvwasi__is_absolute_path(const char* path, size_t path_len) { /* It's expected that only Unix style paths will be generated by WASI. */ @@ -31,7 +76,8 @@ static int uvwasi__is_absolute_path(const char* path, size_t path_len) { } -static uvwasi_errno_t uvwasi__resolve_path(const struct uvwasi_fd_wrap_t* fd, +static uvwasi_errno_t uvwasi__resolve_path(const uvwasi_t* uvwasi, + const struct uvwasi_fd_wrap_t* fd, const char* path, size_t path_len, char* resolved_path, @@ -55,7 +101,7 @@ static uvwasi_errno_t uvwasi__resolve_path(const struct uvwasi_fd_wrap_t* fd, if (1 == input_is_absolute) { /* TODO(cjihrig): Revisit this. Copying is probably not necessary here. */ abs_size = path_len; - abs_path = malloc(abs_size); + abs_path = uvwasi__malloc(uvwasi, abs_size); if (abs_path == NULL) { err = UVWASI_ENOMEM; goto exit; @@ -65,7 +111,7 @@ static uvwasi_errno_t uvwasi__resolve_path(const struct uvwasi_fd_wrap_t* fd, } else { /* Resolve the relative path to fd's real path. */ abs_size = path_len + strlen(fd->real_path) + 2; - abs_path = malloc(abs_size); + abs_path = uvwasi__malloc(uvwasi, abs_size); if (abs_path == NULL) { err = UVWASI_ENOMEM; goto exit; @@ -143,7 +189,7 @@ static uvwasi_errno_t uvwasi__resolve_path(const struct uvwasi_fd_wrap_t* fd, } exit: - free(abs_path); + uvwasi__free(uvwasi, abs_path); return err; } @@ -182,13 +228,17 @@ static uvwasi_errno_t uvwasi__lseek(uv_file fd, } -static uvwasi_errno_t uvwasi__setup_iovs(uv_buf_t** buffers, +static uvwasi_errno_t uvwasi__setup_iovs(const uvwasi_t* uvwasi, + uv_buf_t** buffers, const uvwasi_iovec_t* iovs, size_t iovs_len) { uv_buf_t* bufs; size_t i; - bufs = malloc(iovs_len * sizeof(*bufs)); + if ((iovs_len * sizeof(*bufs)) / (sizeof(*bufs)) != iovs_len) + return UVWASI_ENOMEM; + + bufs = uvwasi__malloc(uvwasi, iovs_len * sizeof(*bufs)); if (bufs == NULL) return UVWASI_ENOMEM; @@ -200,13 +250,17 @@ static uvwasi_errno_t uvwasi__setup_iovs(uv_buf_t** buffers, } -static uvwasi_errno_t uvwasi__setup_ciovs(uv_buf_t** buffers, +static uvwasi_errno_t uvwasi__setup_ciovs(const uvwasi_t* uvwasi, + uv_buf_t** buffers, const uvwasi_ciovec_t* iovs, size_t iovs_len) { uv_buf_t* bufs; size_t i; - bufs = malloc(iovs_len * sizeof(*bufs)); + if ((iovs_len * sizeof(*bufs)) / (sizeof(*bufs)) != iovs_len) + return UVWASI_ENOMEM; + + bufs = uvwasi__malloc(uvwasi, iovs_len * sizeof(*bufs)); if (bufs == NULL) return UVWASI_ENOMEM; @@ -233,6 +287,10 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { if (uvwasi == NULL || options == NULL || options->fd_table_size == 0) return UVWASI_EINVAL; + uvwasi->allocator = options->allocator; + if (uvwasi->allocator == NULL) + uvwasi->allocator = &default_allocator; + uvwasi->argv_buf = NULL; uvwasi->argv = NULL; uvwasi->env_buf = NULL; @@ -247,13 +305,13 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { uvwasi->argv_buf_size = args_size; if (args_size > 0) { - uvwasi->argv_buf = malloc(args_size); + uvwasi->argv_buf = uvwasi__malloc(uvwasi, args_size); if (uvwasi->argv_buf == NULL) { err = UVWASI_ENOMEM; goto exit; } - uvwasi->argv = calloc(options->argc, sizeof(char*)); + uvwasi->argv = uvwasi__calloc(uvwasi, options->argc, sizeof(char*)); if (uvwasi->argv == NULL) { err = UVWASI_ENOMEM; goto exit; @@ -281,13 +339,13 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { uvwasi->env_buf_size = env_buf_size; if (env_buf_size > 0) { - uvwasi->env_buf = malloc(env_buf_size); + uvwasi->env_buf = uvwasi__malloc(uvwasi, env_buf_size); if (uvwasi->env_buf == NULL) { err = UVWASI_ENOMEM; goto exit; } - uvwasi->env = calloc(env_count, sizeof(char*)); + uvwasi->env = uvwasi__calloc(uvwasi, env_count, sizeof(char*)); if (uvwasi->env == NULL) { err = UVWASI_ENOMEM; goto exit; @@ -310,7 +368,7 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { } } - err = uvwasi_fd_table_init(&uvwasi->fds, options->fd_table_size); + err = uvwasi_fd_table_init(uvwasi, &uvwasi->fds, options->fd_table_size); if (err != UVWASI_ESUCCESS) goto exit; @@ -333,7 +391,8 @@ uvwasi_errno_t uvwasi_init(uvwasi_t* uvwasi, uvwasi_options_t* options) { goto exit; } - err = uvwasi_fd_table_insert_preopen(&uvwasi->fds, + err = uvwasi_fd_table_insert_preopen(uvwasi, + &uvwasi->fds, open_req.result, options->preopens[i].mapped_path, realpath_req.ptr); @@ -356,11 +415,11 @@ void uvwasi_destroy(uvwasi_t* uvwasi) { if (uvwasi == NULL) return; - uvwasi_fd_table_free(&uvwasi->fds); - free(uvwasi->argv_buf); - free(uvwasi->argv); - free(uvwasi->env_buf); - free(uvwasi->env); + uvwasi_fd_table_free(uvwasi, &uvwasi->fds); + uvwasi__free(uvwasi, uvwasi->argv_buf); + uvwasi__free(uvwasi, uvwasi->argv); + uvwasi__free(uvwasi, uvwasi->env_buf); + uvwasi__free(uvwasi, uvwasi->env); uvwasi->argv_buf = NULL; uvwasi->argv = NULL; uvwasi->env_buf = NULL; @@ -921,7 +980,7 @@ uvwasi_errno_t uvwasi_fd_pread(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__setup_iovs(&bufs, iovs, iovs_len); + err = uvwasi__setup_iovs(uvwasi, &bufs, iovs, iovs_len); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -931,7 +990,7 @@ uvwasi_errno_t uvwasi_fd_pread(uvwasi_t* uvwasi, uv_mutex_unlock(&wrap->mutex); uvread = req.result; uv_fs_req_cleanup(&req); - free(bufs); + uvwasi__free(uvwasi, bufs); if (r < 0) return uvwasi__translate_uv_error(r); @@ -1024,7 +1083,7 @@ uvwasi_errno_t uvwasi_fd_pwrite(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__setup_ciovs(&bufs, iovs, iovs_len); + err = uvwasi__setup_ciovs(uvwasi, &bufs, iovs, iovs_len); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -1034,7 +1093,7 @@ uvwasi_errno_t uvwasi_fd_pwrite(uvwasi_t* uvwasi, uv_mutex_unlock(&wrap->mutex); uvwritten = req.result; uv_fs_req_cleanup(&req); - free(bufs); + uvwasi__free(uvwasi, bufs); if (r < 0) return uvwasi__translate_uv_error(r); @@ -1063,7 +1122,7 @@ uvwasi_errno_t uvwasi_fd_read(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__setup_iovs(&bufs, iovs, iovs_len); + err = uvwasi__setup_iovs(uvwasi, &bufs, iovs, iovs_len); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -1073,7 +1132,7 @@ uvwasi_errno_t uvwasi_fd_read(uvwasi_t* uvwasi, uv_mutex_unlock(&wrap->mutex); uvread = req.result; uv_fs_req_cleanup(&req); - free(bufs); + uvwasi__free(uvwasi, bufs); if (r < 0) return uvwasi__translate_uv_error(r); @@ -1351,7 +1410,7 @@ uvwasi_errno_t uvwasi_fd_write(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__setup_ciovs(&bufs, iovs, iovs_len); + err = uvwasi__setup_ciovs(uvwasi, &bufs, iovs, iovs_len); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -1361,7 +1420,7 @@ uvwasi_errno_t uvwasi_fd_write(uvwasi_t* uvwasi, uv_mutex_unlock(&wrap->mutex); uvwritten = req.result; uv_fs_req_cleanup(&req); - free(bufs); + uvwasi__free(uvwasi, bufs); if (r < 0) return uvwasi__translate_uv_error(r); @@ -1392,7 +1451,7 @@ uvwasi_errno_t uvwasi_path_create_directory(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, 0); + err = uvwasi__resolve_path(uvwasi, wrap, path, path_len, resolved_path, 0); if (err != UVWASI_ESUCCESS) goto exit; @@ -1434,7 +1493,12 @@ uvwasi_errno_t uvwasi_path_filestat_get(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, flags); + err = uvwasi__resolve_path(uvwasi, + wrap, + path, + path_len, + resolved_path, + flags); if (err != UVWASI_ESUCCESS) goto exit; @@ -1485,7 +1549,12 @@ uvwasi_errno_t uvwasi_path_filestat_set_times(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, flags); + err = uvwasi__resolve_path(uvwasi, + wrap, + path, + path_len, + resolved_path, + flags); if (err != UVWASI_ESUCCESS) goto exit; @@ -1555,7 +1624,8 @@ uvwasi_errno_t uvwasi_path_link(uvwasi_t* uvwasi, } } - err = uvwasi__resolve_path(old_wrap, + err = uvwasi__resolve_path(uvwasi, + old_wrap, old_path, old_path_len, resolved_old_path, @@ -1563,7 +1633,8 @@ uvwasi_errno_t uvwasi_path_link(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) goto exit; - err = uvwasi__resolve_path(new_wrap, + err = uvwasi__resolve_path(uvwasi, + new_wrap, new_path, new_path_len, resolved_new_path, @@ -1666,7 +1737,8 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(dirfd_wrap, + err = uvwasi__resolve_path(uvwasi, + dirfd_wrap, path, path_len, resolved_path, @@ -1684,7 +1756,8 @@ uvwasi_errno_t uvwasi_path_open(uvwasi_t* uvwasi, return uvwasi__translate_uv_error(r); } - err = uvwasi_fd_table_insert_fd(&uvwasi->fds, + err = uvwasi_fd_table_insert_fd(uvwasi, + &uvwasi->fds, r, flags, resolved_path, @@ -1741,7 +1814,7 @@ uvwasi_errno_t uvwasi_path_readlink(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, 0); + err = uvwasi__resolve_path(uvwasi, wrap, path, path_len, resolved_path, 0); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -1789,7 +1862,7 @@ uvwasi_errno_t uvwasi_path_remove_directory(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, 0); + err = uvwasi__resolve_path(uvwasi, wrap, path, path_len, resolved_path, 0); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; @@ -1854,7 +1927,8 @@ uvwasi_errno_t uvwasi_path_rename(uvwasi_t* uvwasi, } } - err = uvwasi__resolve_path(old_wrap, + err = uvwasi__resolve_path(uvwasi, + old_wrap, old_path, old_path_len, resolved_old_path, @@ -1862,7 +1936,8 @@ uvwasi_errno_t uvwasi_path_rename(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) goto exit; - err = uvwasi__resolve_path(new_wrap, + err = uvwasi__resolve_path(uvwasi, + new_wrap, new_path, new_path_len, resolved_new_path, @@ -1910,7 +1985,8 @@ uvwasi_errno_t uvwasi_path_symlink(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, + err = uvwasi__resolve_path(uvwasi, + wrap, new_path, new_path_len, resolved_new_path, @@ -1952,7 +2028,7 @@ uvwasi_errno_t uvwasi_path_unlink_file(uvwasi_t* uvwasi, if (err != UVWASI_ESUCCESS) return err; - err = uvwasi__resolve_path(wrap, path, path_len, resolved_path, 0); + err = uvwasi__resolve_path(uvwasi, wrap, path, path_len, resolved_path, 0); if (err != UVWASI_ESUCCESS) { uv_mutex_unlock(&wrap->mutex); return err; diff --git a/src/uvwasi_alloc.h b/src/uvwasi_alloc.h new file mode 100644 index 0000000..1486f31 --- /dev/null +++ b/src/uvwasi_alloc.h @@ -0,0 +1,11 @@ +#ifndef __UVWASI_ALLOC_H__ +#define __UVWASI_ALLOC_H__ + +#include "uvwasi.h" + +void* uvwasi__malloc(const uvwasi_t* uvwasi, size_t size); +void uvwasi__free(const uvwasi_t* uvwasi, void* ptr); +void* uvwasi__calloc(const uvwasi_t* uvwasi, size_t nmemb, size_t size); +void* uvwasi__realloc(const uvwasi_t* uvwasi, void* ptr, size_t size); + +#endif diff --git a/test/test-args-get.c b/test/test-args-get.c index 3d70ec7..79ec30b 100644 --- a/test/test-args-get.c +++ b/test/test-args-get.c @@ -21,6 +21,7 @@ int main(void) { init_options.envp = NULL; init_options.preopenc = 0; init_options.preopens = NULL; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0); diff --git a/test/test-basic-file-io.c b/test/test-basic-file-io.c index 5b14108..45c3b17 100644 --- a/test/test-basic-file-io.c +++ b/test/test-basic-file-io.c @@ -37,6 +37,7 @@ int main(void) { 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; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0); diff --git a/test/test-ebadf-input-validation.c b/test/test-ebadf-input-validation.c index a3b2092..46f7d0a 100644 --- a/test/test-ebadf-input-validation.c +++ b/test/test-ebadf-input-validation.c @@ -28,6 +28,7 @@ int main(void) { init_options.envp = NULL; init_options.preopenc = 0; init_options.preopens = NULL; + init_options.allocator = NULL; err = uvwasi_init(&uvw, &init_options); assert(err == 0); diff --git a/test/test-environ-get.c b/test/test-environ-get.c index 1742fa0..b235226 100644 --- a/test/test-environ-get.c +++ b/test/test-environ-get.c @@ -26,6 +26,7 @@ int main(void) { init_options.envp = (char**) environ; init_options.preopenc = 0; init_options.preopens = NULL; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0); diff --git a/test/test-fd-prestat-dir-name.c b/test/test-fd-prestat-dir-name.c index 14946a0..783484d 100644 --- a/test/test-fd-prestat-dir-name.c +++ b/test/test-fd-prestat-dir-name.c @@ -27,6 +27,7 @@ int main(void) { 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; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0); diff --git a/test/test-path-create-remove-directory.c b/test/test-path-create-remove-directory.c index 4567c9b..83a731d 100644 --- a/test/test-path-create-remove-directory.c +++ b/test/test-path-create-remove-directory.c @@ -29,6 +29,7 @@ int main(void) { 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; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0); diff --git a/test/test-random-get.c b/test/test-random-get.c index ab983be..13cc6e8 100644 --- a/test/test-random-get.c +++ b/test/test-random-get.c @@ -19,6 +19,7 @@ int main(void) { init_options.envp = NULL; init_options.preopenc = 0; init_options.preopens = NULL; + init_options.allocator = NULL; err = uvwasi_init(&uvwasi, &init_options); assert(err == 0);