@@ -187,12 +187,29 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
187187int preopen ,
188188struct uvwasi_fd_wrap_t * * wrap ) {
189189struct uvwasi_fd_wrap_t * entry ;
190- struct uvwasi_fd_wrap_t * new_fds ;
190+ struct uvwasi_fd_wrap_t * * new_fds ;
191191uvwasi_errno_t err ;
192192uint32_t new_size ;
193193int index ;
194194uint32_t i ;
195195int r ;
196+ size_t mp_len ;
197+ char * mp_copy ;
198+ size_t rp_len ;
199+ char * rp_copy ;
200+
201+ mp_len = strlen (mapped_path );
202+ rp_len = strlen (real_path );
203+ entry = (struct uvwasi_fd_wrap_t * )
204+ uvwasi__malloc (uvwasi , sizeof (* entry ) + mp_len + rp_len + 2 );
205+ if (entry == NULL ) return UVWASI_ENOMEM ;
206+
207+ mp_copy = (char * )(entry + 1 );
208+ rp_copy = mp_copy + mp_len + 1 ;
209+ memcpy (mp_copy , mapped_path , mp_len );
210+ mp_copy [mp_len ] = '\0' ;
211+ memcpy (rp_copy , real_path , rp_len );
212+ rp_copy [rp_len ] = '\0' ;
196213
197214uv_rwlock_wrlock (& table -> rwlock );
198215
@@ -201,12 +218,13 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
201218new_size = table -> size * 2 ;
202219new_fds = uvwasi__realloc (uvwasi , table -> fds , new_size * sizeof (* new_fds ));
203220if (new_fds == NULL ) {
221+ uvwasi__free (uvwasi , entry );
204222err = UVWASI_ENOMEM ;
205223 goto exit ;
206224 }
207225
208226for (i = table -> size ; i < new_size ; ++ i )
209- new_fds [i ]. valid = 0 ;
227+ new_fds [i ] = NULL ;
210228
211229index = table -> size ;
212230table -> fds = new_fds ;
@@ -215,20 +233,21 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
215233/* The table is big enough, so find an empty slot for the new data. */
216234index = -1 ;
217235for (i = 0 ; i < table -> size ; ++ i ) {
218- if (table -> fds [i ]. valid != 1 ) {
236+ if (table -> fds [i ]== NULL ) {
219237index = i ;
220238break ;
221239 }
222240 }
223241
224242/* index should never be -1. */
225243if (index == -1 ) {
244+ uvwasi__free (uvwasi , entry );
226245err = UVWASI_ENOSPC ;
227246 goto exit ;
228247 }
229248 }
230249
231- entry = & table -> fds [index ];
250+ table -> fds [index ]= entry ;
232251
233252r = uv_mutex_init (& entry -> mutex );
234253if (r != 0 ) {
@@ -238,13 +257,12 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
238257
239258entry -> id = index ;
240259entry -> fd = fd ;
241- strcpy ( entry -> path , mapped_path ) ;
242- strcpy ( entry -> real_path , real_path ) ;
260+ entry -> path = mp_copy ;
261+ entry -> real_path = rp_copy ;
243262entry -> type = type ;
244263entry -> rights_base = rights_base ;
245264entry -> rights_inheriting = rights_inheriting ;
246265entry -> preopen = preopen ;
247- entry -> valid = 1 ;
248266table -> used ++ ;
249267
250268if (wrap != NULL )
@@ -281,7 +299,7 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi,
281299table -> size = init_size ;
282300table -> fds = uvwasi__calloc (uvwasi ,
283301init_size ,
284- sizeof (struct uvwasi_fd_wrap_t ));
302+ sizeof (struct uvwasi_fd_wrap_t * ));
285303
286304if (table -> fds == NULL ) {
287305err = UVWASI_ENOMEM ;
@@ -325,9 +343,20 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi,
325343
326344
327345void uvwasi_fd_table_free (uvwasi_t * uvwasi , struct uvwasi_fd_table_t * table ) {
346+ struct uvwasi_fd_wrap_t * entry ;
347+ uint32_t i ;
348+
328349if (table == NULL )
329350return ;
330351
352+ for (i = 0 ; i < table -> size ; i ++ ) {
353+ entry = table -> fds [i ];
354+ if (entry == NULL ) continue ;
355+
356+ uv_mutex_destroy (& entry -> mutex );
357+ uvwasi__free (uvwasi , entry );
358+ }
359+
331360uvwasi__free (uvwasi , table -> fds );
332361table -> fds = NULL ;
333362table -> size = 0 ;
@@ -430,9 +459,9 @@ uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
430459 goto exit ;
431460 }
432461
433- entry = & table -> fds [id ];
462+ entry = table -> fds [id ];
434463
435- if (entry -> valid != 1 || entry -> id != id ) {
464+ if (entry == NULL || entry -> id != id ) {
436465err = UVWASI_EBADF ;
437466 goto exit ;
438467 }
@@ -453,7 +482,8 @@ uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
453482}
454483
455484
456- uvwasi_errno_t uvwasi_fd_table_remove (struct uvwasi_fd_table_t * table ,
485+ uvwasi_errno_t uvwasi_fd_table_remove (uvwasi_t * uvwasi ,
486+ struct uvwasi_fd_table_t * table ,
457487const uvwasi_fd_t id ) {
458488struct uvwasi_fd_wrap_t * entry ;
459489uvwasi_errno_t err ;
@@ -468,15 +498,16 @@ uvwasi_errno_t uvwasi_fd_table_remove(struct uvwasi_fd_table_t* table,
468498 goto exit ;
469499 }
470500
471- entry = & table -> fds [id ];
501+ entry = table -> fds [id ];
472502
473- if (entry -> valid != 1 || entry -> id != id ) {
503+ if (entry == NULL || entry -> id != id ) {
474504err = UVWASI_EBADF ;
475505 goto exit ;
476506 }
477507
478508uv_mutex_destroy (& entry -> mutex );
479- entry -> valid = 0 ;
509+ uvwasi__free (uvwasi , entry );
510+ table -> fds [id ] = NULL ;
480511table -> used -- ;
481512err = UVWASI_ESUCCESS ;
482513exit :
0 commit comments