@@ -187,12 +187,29 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
187187 int preopen ,
188188 struct uvwasi_fd_wrap_t * * wrap ) {
189189 struct uvwasi_fd_wrap_t * entry ;
190- struct uvwasi_fd_wrap_t * new_fds ;
190+ struct uvwasi_fd_wrap_t * * new_fds ;
191191 uvwasi_errno_t err ;
192192 uint32_t new_size ;
193193 int index ;
194194 uint32_t i ;
195195 int 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
197214 uv_rwlock_wrlock (& table -> rwlock );
198215
@@ -201,12 +218,13 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
201218 new_size = table -> size * 2 ;
202219 new_fds = uvwasi__realloc (uvwasi , table -> fds , new_size * sizeof (* new_fds ));
203220 if (new_fds == NULL ) {
221+ uvwasi__free (uvwasi , entry );
204222 err = UVWASI_ENOMEM ;
205223 goto exit ;
206224 }
207225
208226 for (i = table -> size ; i < new_size ; ++ i )
209- new_fds [i ]. valid = 0 ;
227+ new_fds [i ] = NULL ;
210228
211229 index = table -> size ;
212230 table -> 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. */
216234 index = -1 ;
217235 for (i = 0 ; i < table -> size ; ++ i ) {
218- if (table -> fds [i ]. valid != 1 ) {
236+ if (table -> fds [i ] == NULL ) {
219237 index = i ;
220238 break ;
221239 }
222240 }
223241
224242 /* index should never be -1. */
225243 if (index == -1 ) {
244+ uvwasi__free (uvwasi , entry );
226245 err = UVWASI_ENOSPC ;
227246 goto exit ;
228247 }
229248 }
230249
231- entry = & table -> fds [index ];
250+ table -> fds [index ] = entry ;
232251
233252 r = uv_mutex_init (& entry -> mutex );
234253 if (r != 0 ) {
@@ -238,13 +257,12 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
238257
239258 entry -> id = index ;
240259 entry -> 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 ;
243262 entry -> type = type ;
244263 entry -> rights_base = rights_base ;
245264 entry -> rights_inheriting = rights_inheriting ;
246265 entry -> preopen = preopen ;
247- entry -> valid = 1 ;
248266 table -> used ++ ;
249267
250268 if (wrap != NULL )
@@ -281,7 +299,7 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi,
281299 table -> size = init_size ;
282300 table -> fds = uvwasi__calloc (uvwasi ,
283301 init_size ,
284- sizeof (struct uvwasi_fd_wrap_t ));
302+ sizeof (struct uvwasi_fd_wrap_t * ));
285303
286304 if (table -> fds == NULL ) {
287305 err = 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+
328349 if (table == NULL )
329350 return ;
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+
331360 uvwasi__free (uvwasi , table -> fds );
332361 table -> fds = NULL ;
333362 table -> 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 ) {
436465 err = 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 ,
457487 const uvwasi_fd_t id ) {
458488 struct uvwasi_fd_wrap_t * entry ;
459489 uvwasi_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 ) {
474504 err = UVWASI_EBADF ;
475505 goto exit ;
476506 }
477507
478508 uv_mutex_destroy (& entry -> mutex );
479- entry -> valid = 0 ;
509+ uvwasi__free (uvwasi , entry );
510+ table -> fds [id ] = NULL ;
480511 table -> used -- ;
481512 err = UVWASI_ESUCCESS ;
482513exit :
0 commit comments