From 8f4339b8af06a2d0d5b48fd414cf6583d80b5e2f Mon Sep 17 00:00:00 2001 From: cjihrig Date: Mon, 23 Dec 2019 21:59:30 -0500 Subject: [PATCH] deps: uvwasi: cherry-pick 64e59d5 Original commit message: This commit ensures that multiple calls to uvwasi_destroy() are possible. Prior to this commit, subsequent calls to destroy() would abort because the file table's rwlock was incorrectly being destroyed multiple times. PR-URL: https://github.com/nodejs/node/pull/31076 Reviewed-By: Jiawen Geng Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Chengzhong Wu Reviewed-By: Rich Trott --- deps/uvwasi/src/fd_table.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/deps/uvwasi/src/fd_table.c b/deps/uvwasi/src/fd_table.c index 0abddb5a21dd36..aad40e7407b259 100644 --- a/deps/uvwasi/src/fd_table.c +++ b/deps/uvwasi/src/fd_table.c @@ -357,11 +357,20 @@ void uvwasi_fd_table_free(uvwasi_t* uvwasi, struct uvwasi_fd_table_t* table) { uvwasi__free(uvwasi, entry); } - uvwasi__free(uvwasi, table->fds); - table->fds = NULL; - table->size = 0; - table->used = 0; - uv_rwlock_destroy(&table->rwlock); + if (table->fds != NULL) { + /* It's fine to call uvwasi__free() multiple times on table->fds. However, + it is not fine to call uv_rwlock_destroy() multiple times. Guard against + that by ensuring that table->fds is not NULL. Technically, it's possible + that uvwasi_fd_table_init() initialized the rwlock successfully, but + failed to initialize fds. However, the only way that's possible is if + the application already ran out of memory. + */ + uvwasi__free(uvwasi, table->fds); + table->fds = NULL; + table->size = 0; + table->used = 0; + uv_rwlock_destroy(&table->rwlock); + } }