Skip to content

Commit 33984d6

Browse files
cjihrigcodebytere
authored andcommitted
wasi: simplify WASI memory management
This commit migrates the WASI C++ code from UncheckedCalloc() to std::vectors. PR-URL: #33525 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: David Carlier <[email protected]> Reviewed-By: Jiawen Geng <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]>
1 parent 5e5be99 commit 33984d6

File tree

1 file changed

+35
-81
lines changed

1 file changed

+35
-81
lines changed

src/node_wasi.cc

+35-81
Original file line numberDiff line numberDiff line change
@@ -660,27 +660,24 @@ void WASI::FdPread(const FunctionCallbackInfo<Value>& args) {
660660
iovs_ptr,
661661
iovs_len * UVWASI_SERDES_SIZE_iovec_t);
662662
CHECK_BOUNDS_OR_RETURN(args, mem_size, nread_ptr, UVWASI_SERDES_SIZE_size_t);
663-
uvwasi_iovec_t* iovs = UncheckedCalloc<uvwasi_iovec_t>(iovs_len);
663+
std::vector<uvwasi_iovec_t> iovs(iovs_len);
664664
uvwasi_errno_t err;
665665

666-
if (iovs == nullptr) {
667-
args.GetReturnValue().Set(UVWASI_ENOMEM);
668-
return;
669-
}
670-
671-
err = uvwasi_serdes_readv_iovec_t(memory, mem_size, iovs_ptr, iovs, iovs_len);
666+
err = uvwasi_serdes_readv_iovec_t(memory,
667+
mem_size,
668+
iovs_ptr,
669+
iovs.data(),
670+
iovs_len);
672671
if (err != UVWASI_ESUCCESS) {
673-
free(iovs);
674672
args.GetReturnValue().Set(err);
675673
return;
676674
}
677675

678676
uvwasi_size_t nread;
679-
err = uvwasi_fd_pread(&wasi->uvw_, fd, iovs, iovs_len, offset, &nread);
677+
err = uvwasi_fd_pread(&wasi->uvw_, fd, iovs.data(), iovs_len, offset, &nread);
680678
if (err == UVWASI_ESUCCESS)
681679
uvwasi_serdes_write_size_t(memory, nread_ptr, nread);
682680

683-
free(iovs);
684681
args.GetReturnValue().Set(err);
685682
}
686683

@@ -763,31 +760,29 @@ void WASI::FdPwrite(const FunctionCallbackInfo<Value>& args) {
763760
mem_size,
764761
nwritten_ptr,
765762
UVWASI_SERDES_SIZE_size_t);
766-
uvwasi_ciovec_t* iovs = UncheckedCalloc<uvwasi_ciovec_t>(iovs_len);
763+
std::vector<uvwasi_ciovec_t> iovs(iovs_len);
767764
uvwasi_errno_t err;
768765

769-
if (iovs == nullptr) {
770-
args.GetReturnValue().Set(UVWASI_ENOMEM);
771-
return;
772-
}
773-
774766
err = uvwasi_serdes_readv_ciovec_t(memory,
775767
mem_size,
776768
iovs_ptr,
777-
iovs,
769+
iovs.data(),
778770
iovs_len);
779771
if (err != UVWASI_ESUCCESS) {
780-
free(iovs);
781772
args.GetReturnValue().Set(err);
782773
return;
783774
}
784775

785776
uvwasi_size_t nwritten;
786-
err = uvwasi_fd_pwrite(&wasi->uvw_, fd, iovs, iovs_len, offset, &nwritten);
777+
err = uvwasi_fd_pwrite(&wasi->uvw_,
778+
fd,
779+
iovs.data(),
780+
iovs_len,
781+
offset,
782+
&nwritten);
787783
if (err == UVWASI_ESUCCESS)
788784
uvwasi_serdes_write_size_t(memory, nwritten_ptr, nwritten);
789785

790-
free(iovs);
791786
args.GetReturnValue().Set(err);
792787
}
793788

@@ -813,27 +808,24 @@ void WASI::FdRead(const FunctionCallbackInfo<Value>& args) {
813808
iovs_ptr,
814809
iovs_len * UVWASI_SERDES_SIZE_iovec_t);
815810
CHECK_BOUNDS_OR_RETURN(args, mem_size, nread_ptr, UVWASI_SERDES_SIZE_size_t);
816-
uvwasi_iovec_t* iovs = UncheckedCalloc<uvwasi_iovec_t>(iovs_len);
811+
std::vector<uvwasi_iovec_t> iovs(iovs_len);
817812
uvwasi_errno_t err;
818813

819-
if (iovs == nullptr) {
820-
args.GetReturnValue().Set(UVWASI_ENOMEM);
821-
return;
822-
}
823-
824-
err = uvwasi_serdes_readv_iovec_t(memory, mem_size, iovs_ptr, iovs, iovs_len);
814+
err = uvwasi_serdes_readv_iovec_t(memory,
815+
mem_size,
816+
iovs_ptr,
817+
iovs.data(),
818+
iovs_len);
825819
if (err != UVWASI_ESUCCESS) {
826-
free(iovs);
827820
args.GetReturnValue().Set(err);
828821
return;
829822
}
830823

831824
uvwasi_size_t nread;
832-
err = uvwasi_fd_read(&wasi->uvw_, fd, iovs, iovs_len, &nread);
825+
err = uvwasi_fd_read(&wasi->uvw_, fd, iovs.data(), iovs_len, &nread);
833826
if (err == UVWASI_ESUCCESS)
834827
uvwasi_serdes_write_size_t(memory, nread_ptr, nread);
835828

836-
free(iovs);
837829
args.GetReturnValue().Set(err);
838830
}
839831

@@ -995,31 +987,24 @@ void WASI::FdWrite(const FunctionCallbackInfo<Value>& args) {
995987
mem_size,
996988
nwritten_ptr,
997989
UVWASI_SERDES_SIZE_size_t);
998-
uvwasi_ciovec_t* iovs = UncheckedCalloc<uvwasi_ciovec_t>(iovs_len);
990+
std::vector<uvwasi_ciovec_t> iovs(iovs_len);
999991
uvwasi_errno_t err;
1000992

1001-
if (iovs == nullptr) {
1002-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1003-
return;
1004-
}
1005-
1006993
err = uvwasi_serdes_readv_ciovec_t(memory,
1007994
mem_size,
1008995
iovs_ptr,
1009-
iovs,
996+
iovs.data(),
1010997
iovs_len);
1011998
if (err != UVWASI_ESUCCESS) {
1012-
free(iovs);
1013999
args.GetReturnValue().Set(err);
10141000
return;
10151001
}
10161002

10171003
uvwasi_size_t nwritten;
1018-
err = uvwasi_fd_write(&wasi->uvw_, fd, iovs, iovs_len, &nwritten);
1004+
err = uvwasi_fd_write(&wasi->uvw_, fd, iovs.data(), iovs_len, &nwritten);
10191005
if (err == UVWASI_ESUCCESS)
10201006
uvwasi_serdes_write_size_t(memory, nwritten_ptr, nwritten);
10211007

1022-
free(iovs);
10231008
args.GetReturnValue().Set(err);
10241009
}
10251010

@@ -1434,21 +1419,8 @@ void WASI::PollOneoff(const FunctionCallbackInfo<Value>& args) {
14341419
mem_size,
14351420
nevents_ptr,
14361421
UVWASI_SERDES_SIZE_size_t);
1437-
uvwasi_subscription_t* in =
1438-
UncheckedCalloc<uvwasi_subscription_t>(nsubscriptions);
1439-
1440-
if (in == nullptr) {
1441-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1442-
return;
1443-
}
1444-
1445-
uvwasi_event_t* out = UncheckedCalloc<uvwasi_event_t>(nsubscriptions);
1446-
1447-
if (out == nullptr) {
1448-
free(in);
1449-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1450-
return;
1451-
}
1422+
std::vector<uvwasi_subscription_t> in(nsubscriptions);
1423+
std::vector<uvwasi_event_t> out(nsubscriptions);
14521424

14531425
for (uint32_t i = 0; i < nsubscriptions; ++i) {
14541426
uvwasi_serdes_read_subscription_t(memory, in_ptr, &in[i]);
@@ -1457,8 +1429,8 @@ void WASI::PollOneoff(const FunctionCallbackInfo<Value>& args) {
14571429

14581430
uvwasi_size_t nevents;
14591431
uvwasi_errno_t err = uvwasi_poll_oneoff(&wasi->uvw_,
1460-
in,
1461-
out,
1432+
in.data(),
1433+
out.data(),
14621434
nsubscriptions,
14631435
&nevents);
14641436
if (err == UVWASI_ESUCCESS) {
@@ -1470,8 +1442,6 @@ void WASI::PollOneoff(const FunctionCallbackInfo<Value>& args) {
14701442
}
14711443
}
14721444

1473-
free(in);
1474-
free(out);
14751445
args.GetReturnValue().Set(err);
14761446
}
14771447

@@ -1562,20 +1532,13 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15621532
ri_data_len * UVWASI_SERDES_SIZE_iovec_t);
15631533
CHECK_BOUNDS_OR_RETURN(args, mem_size, ro_datalen_ptr, 4);
15641534
CHECK_BOUNDS_OR_RETURN(args, mem_size, ro_flags_ptr, 4);
1565-
uvwasi_iovec_t* ri_data = UncheckedCalloc<uvwasi_iovec_t>(ri_data_len);
1566-
1567-
if (ri_data == nullptr) {
1568-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1569-
return;
1570-
}
1571-
1535+
std::vector<uvwasi_iovec_t> ri_data(ri_data_len);
15721536
uvwasi_errno_t err = uvwasi_serdes_readv_iovec_t(memory,
15731537
mem_size,
15741538
ri_data_ptr,
1575-
ri_data,
1539+
ri_data.data(),
15761540
ri_data_len);
15771541
if (err != UVWASI_ESUCCESS) {
1578-
free(ri_data);
15791542
args.GetReturnValue().Set(err);
15801543
return;
15811544
}
@@ -1584,7 +1547,7 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15841547
uvwasi_roflags_t ro_flags;
15851548
err = uvwasi_sock_recv(&wasi->uvw_,
15861549
sock,
1587-
ri_data,
1550+
ri_data.data(),
15881551
ri_data_len,
15891552
ri_flags,
15901553
&ro_datalen,
@@ -1594,7 +1557,6 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15941557
uvwasi_serdes_write_roflags_t(memory, ro_flags_ptr, ro_flags);
15951558
}
15961559

1597-
free(ri_data);
15981560
args.GetReturnValue().Set(err);
15991561
}
16001562

@@ -1631,35 +1593,27 @@ void WASI::SockSend(const FunctionCallbackInfo<Value>& args) {
16311593
mem_size,
16321594
so_datalen_ptr,
16331595
UVWASI_SERDES_SIZE_size_t);
1634-
uvwasi_ciovec_t* si_data = UncheckedCalloc<uvwasi_ciovec_t>(si_data_len);
1635-
1636-
if (si_data == nullptr) {
1637-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1638-
return;
1639-
}
1640-
1596+
std::vector<uvwasi_ciovec_t> si_data(si_data_len);
16411597
uvwasi_errno_t err = uvwasi_serdes_readv_ciovec_t(memory,
16421598
mem_size,
16431599
si_data_ptr,
1644-
si_data,
1600+
si_data.data(),
16451601
si_data_len);
16461602
if (err != UVWASI_ESUCCESS) {
1647-
free(si_data);
16481603
args.GetReturnValue().Set(err);
16491604
return;
16501605
}
16511606

16521607
uvwasi_size_t so_datalen;
16531608
err = uvwasi_sock_send(&wasi->uvw_,
16541609
sock,
1655-
si_data,
1610+
si_data.data(),
16561611
si_data_len,
16571612
si_flags,
16581613
&so_datalen);
16591614
if (err == UVWASI_ESUCCESS)
16601615
uvwasi_serdes_write_size_t(memory, so_datalen_ptr, so_datalen);
16611616

1662-
free(si_data);
16631617
args.GetReturnValue().Set(err);
16641618
}
16651619

0 commit comments

Comments
 (0)