Skip to content

Commit

Permalink
deps: uvwasi: cherry-pick 64e59d5
Browse files Browse the repository at this point in the history
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: #31076
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
cjihrig authored and targos committed Jan 14, 2020
1 parent 0b630cf commit 8b0c191
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions deps/uvwasi/src/fd_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}


Expand Down

0 comments on commit 8b0c191

Please sign in to comment.