@@ -187,12 +187,29 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
187
187
int preopen ,
188
188
struct uvwasi_fd_wrap_t * * wrap ) {
189
189
struct uvwasi_fd_wrap_t * entry ;
190
- struct uvwasi_fd_wrap_t * new_fds ;
190
+ struct uvwasi_fd_wrap_t * * new_fds ;
191
191
uvwasi_errno_t err ;
192
192
uint32_t new_size ;
193
193
int index ;
194
194
uint32_t i ;
195
195
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' ;
196
213
197
214
uv_rwlock_wrlock (& table -> rwlock );
198
215
@@ -201,12 +218,13 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
201
218
new_size = table -> size * 2 ;
202
219
new_fds = uvwasi__realloc (uvwasi , table -> fds , new_size * sizeof (* new_fds ));
203
220
if (new_fds == NULL ) {
221
+ uvwasi__free (uvwasi , entry );
204
222
err = UVWASI_ENOMEM ;
205
223
goto exit ;
206
224
}
207
225
208
226
for (i = table -> size ; i < new_size ; ++ i )
209
- new_fds [i ]. valid = 0 ;
227
+ new_fds [i ] = NULL ;
210
228
211
229
index = table -> size ;
212
230
table -> fds = new_fds ;
@@ -215,20 +233,21 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
215
233
/* The table is big enough, so find an empty slot for the new data. */
216
234
index = -1 ;
217
235
for (i = 0 ; i < table -> size ; ++ i ) {
218
- if (table -> fds [i ]. valid != 1 ) {
236
+ if (table -> fds [i ] == NULL ) {
219
237
index = i ;
220
238
break ;
221
239
}
222
240
}
223
241
224
242
/* index should never be -1. */
225
243
if (index == -1 ) {
244
+ uvwasi__free (uvwasi , entry );
226
245
err = UVWASI_ENOSPC ;
227
246
goto exit ;
228
247
}
229
248
}
230
249
231
- entry = & table -> fds [index ];
250
+ table -> fds [index ] = entry ;
232
251
233
252
r = uv_mutex_init (& entry -> mutex );
234
253
if (r != 0 ) {
@@ -238,13 +257,12 @@ static uvwasi_errno_t uvwasi__fd_table_insert(uvwasi_t* uvwasi,
238
257
239
258
entry -> id = index ;
240
259
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 ;
243
262
entry -> type = type ;
244
263
entry -> rights_base = rights_base ;
245
264
entry -> rights_inheriting = rights_inheriting ;
246
265
entry -> preopen = preopen ;
247
- entry -> valid = 1 ;
248
266
table -> used ++ ;
249
267
250
268
if (wrap != NULL )
@@ -281,7 +299,7 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi,
281
299
table -> size = init_size ;
282
300
table -> fds = uvwasi__calloc (uvwasi ,
283
301
init_size ,
284
- sizeof (struct uvwasi_fd_wrap_t ));
302
+ sizeof (struct uvwasi_fd_wrap_t * ));
285
303
286
304
if (table -> fds == NULL ) {
287
305
err = UVWASI_ENOMEM ;
@@ -325,9 +343,20 @@ uvwasi_errno_t uvwasi_fd_table_init(uvwasi_t* uvwasi,
325
343
326
344
327
345
void 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
+
328
349
if (table == NULL )
329
350
return ;
330
351
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
+
331
360
uvwasi__free (uvwasi , table -> fds );
332
361
table -> fds = NULL ;
333
362
table -> size = 0 ;
@@ -430,9 +459,9 @@ uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
430
459
goto exit ;
431
460
}
432
461
433
- entry = & table -> fds [id ];
462
+ entry = table -> fds [id ];
434
463
435
- if (entry -> valid != 1 || entry -> id != id ) {
464
+ if (entry == NULL || entry -> id != id ) {
436
465
err = UVWASI_EBADF ;
437
466
goto exit ;
438
467
}
@@ -453,7 +482,8 @@ uvwasi_errno_t uvwasi_fd_table_get(const struct uvwasi_fd_table_t* table,
453
482
}
454
483
455
484
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 ,
457
487
const uvwasi_fd_t id ) {
458
488
struct uvwasi_fd_wrap_t * entry ;
459
489
uvwasi_errno_t err ;
@@ -468,15 +498,16 @@ uvwasi_errno_t uvwasi_fd_table_remove(struct uvwasi_fd_table_t* table,
468
498
goto exit ;
469
499
}
470
500
471
- entry = & table -> fds [id ];
501
+ entry = table -> fds [id ];
472
502
473
- if (entry -> valid != 1 || entry -> id != id ) {
503
+ if (entry == NULL || entry -> id != id ) {
474
504
err = UVWASI_EBADF ;
475
505
goto exit ;
476
506
}
477
507
478
508
uv_mutex_destroy (& entry -> mutex );
479
- entry -> valid = 0 ;
509
+ uvwasi__free (uvwasi , entry );
510
+ table -> fds [id ] = NULL ;
480
511
table -> used -- ;
481
512
err = UVWASI_ESUCCESS ;
482
513
exit :
0 commit comments