Skip to content

Commit 5eecea3

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 f98e888 commit 5eecea3

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
@@ -661,27 +661,24 @@ void WASI::FdPread(const FunctionCallbackInfo<Value>& args) {
661661
iovs_ptr,
662662
iovs_len * UVWASI_SERDES_SIZE_iovec_t);
663663
CHECK_BOUNDS_OR_RETURN(args, mem_size, nread_ptr, UVWASI_SERDES_SIZE_size_t);
664-
uvwasi_iovec_t* iovs = UncheckedCalloc<uvwasi_iovec_t>(iovs_len);
664+
std::vector<uvwasi_iovec_t> iovs(iovs_len);
665665
uvwasi_errno_t err;
666666

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

679677
uvwasi_size_t nread;
680-
err = uvwasi_fd_pread(&wasi->uvw_, fd, iovs, iovs_len, offset, &nread);
678+
err = uvwasi_fd_pread(&wasi->uvw_, fd, iovs.data(), iovs_len, offset, &nread);
681679
if (err == UVWASI_ESUCCESS)
682680
uvwasi_serdes_write_size_t(memory, nread_ptr, nread);
683681

684-
free(iovs);
685682
args.GetReturnValue().Set(err);
686683
}
687684

@@ -764,31 +761,29 @@ void WASI::FdPwrite(const FunctionCallbackInfo<Value>& args) {
764761
mem_size,
765762
nwritten_ptr,
766763
UVWASI_SERDES_SIZE_size_t);
767-
uvwasi_ciovec_t* iovs = UncheckedCalloc<uvwasi_ciovec_t>(iovs_len);
764+
std::vector<uvwasi_ciovec_t> iovs(iovs_len);
768765
uvwasi_errno_t err;
769766

770-
if (iovs == nullptr) {
771-
args.GetReturnValue().Set(UVWASI_ENOMEM);
772-
return;
773-
}
774-
775767
err = uvwasi_serdes_readv_ciovec_t(memory,
776768
mem_size,
777769
iovs_ptr,
778-
iovs,
770+
iovs.data(),
779771
iovs_len);
780772
if (err != UVWASI_ESUCCESS) {
781-
free(iovs);
782773
args.GetReturnValue().Set(err);
783774
return;
784775
}
785776

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

791-
free(iovs);
792787
args.GetReturnValue().Set(err);
793788
}
794789

@@ -814,27 +809,24 @@ void WASI::FdRead(const FunctionCallbackInfo<Value>& args) {
814809
iovs_ptr,
815810
iovs_len * UVWASI_SERDES_SIZE_iovec_t);
816811
CHECK_BOUNDS_OR_RETURN(args, mem_size, nread_ptr, UVWASI_SERDES_SIZE_size_t);
817-
uvwasi_iovec_t* iovs = UncheckedCalloc<uvwasi_iovec_t>(iovs_len);
812+
std::vector<uvwasi_iovec_t> iovs(iovs_len);
818813
uvwasi_errno_t err;
819814

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

832825
uvwasi_size_t nread;
833-
err = uvwasi_fd_read(&wasi->uvw_, fd, iovs, iovs_len, &nread);
826+
err = uvwasi_fd_read(&wasi->uvw_, fd, iovs.data(), iovs_len, &nread);
834827
if (err == UVWASI_ESUCCESS)
835828
uvwasi_serdes_write_size_t(memory, nread_ptr, nread);
836829

837-
free(iovs);
838830
args.GetReturnValue().Set(err);
839831
}
840832

@@ -996,31 +988,24 @@ void WASI::FdWrite(const FunctionCallbackInfo<Value>& args) {
996988
mem_size,
997989
nwritten_ptr,
998990
UVWASI_SERDES_SIZE_size_t);
999-
uvwasi_ciovec_t* iovs = UncheckedCalloc<uvwasi_ciovec_t>(iovs_len);
991+
std::vector<uvwasi_ciovec_t> iovs(iovs_len);
1000992
uvwasi_errno_t err;
1001993

1002-
if (iovs == nullptr) {
1003-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1004-
return;
1005-
}
1006-
1007994
err = uvwasi_serdes_readv_ciovec_t(memory,
1008995
mem_size,
1009996
iovs_ptr,
1010-
iovs,
997+
iovs.data(),
1011998
iovs_len);
1012999
if (err != UVWASI_ESUCCESS) {
1013-
free(iovs);
10141000
args.GetReturnValue().Set(err);
10151001
return;
10161002
}
10171003

10181004
uvwasi_size_t nwritten;
1019-
err = uvwasi_fd_write(&wasi->uvw_, fd, iovs, iovs_len, &nwritten);
1005+
err = uvwasi_fd_write(&wasi->uvw_, fd, iovs.data(), iovs_len, &nwritten);
10201006
if (err == UVWASI_ESUCCESS)
10211007
uvwasi_serdes_write_size_t(memory, nwritten_ptr, nwritten);
10221008

1023-
free(iovs);
10241009
args.GetReturnValue().Set(err);
10251010
}
10261011

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

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

14591431
uvwasi_size_t nevents;
14601432
uvwasi_errno_t err = uvwasi_poll_oneoff(&wasi->uvw_,
1461-
in,
1462-
out,
1433+
in.data(),
1434+
out.data(),
14631435
nsubscriptions,
14641436
&nevents);
14651437
if (err == UVWASI_ESUCCESS) {
@@ -1471,8 +1443,6 @@ void WASI::PollOneoff(const FunctionCallbackInfo<Value>& args) {
14711443
}
14721444
}
14731445

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

@@ -1563,20 +1533,13 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15631533
ri_data_len * UVWASI_SERDES_SIZE_iovec_t);
15641534
CHECK_BOUNDS_OR_RETURN(args, mem_size, ro_datalen_ptr, 4);
15651535
CHECK_BOUNDS_OR_RETURN(args, mem_size, ro_flags_ptr, 4);
1566-
uvwasi_iovec_t* ri_data = UncheckedCalloc<uvwasi_iovec_t>(ri_data_len);
1567-
1568-
if (ri_data == nullptr) {
1569-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1570-
return;
1571-
}
1572-
1536+
std::vector<uvwasi_iovec_t> ri_data(ri_data_len);
15731537
uvwasi_errno_t err = uvwasi_serdes_readv_iovec_t(memory,
15741538
mem_size,
15751539
ri_data_ptr,
1576-
ri_data,
1540+
ri_data.data(),
15771541
ri_data_len);
15781542
if (err != UVWASI_ESUCCESS) {
1579-
free(ri_data);
15801543
args.GetReturnValue().Set(err);
15811544
return;
15821545
}
@@ -1585,7 +1548,7 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15851548
uvwasi_roflags_t ro_flags;
15861549
err = uvwasi_sock_recv(&wasi->uvw_,
15871550
sock,
1588-
ri_data,
1551+
ri_data.data(),
15891552
ri_data_len,
15901553
ri_flags,
15911554
&ro_datalen,
@@ -1595,7 +1558,6 @@ void WASI::SockRecv(const FunctionCallbackInfo<Value>& args) {
15951558
uvwasi_serdes_write_roflags_t(memory, ro_flags_ptr, ro_flags);
15961559
}
15971560

1598-
free(ri_data);
15991561
args.GetReturnValue().Set(err);
16001562
}
16011563

@@ -1632,35 +1594,27 @@ void WASI::SockSend(const FunctionCallbackInfo<Value>& args) {
16321594
mem_size,
16331595
so_datalen_ptr,
16341596
UVWASI_SERDES_SIZE_size_t);
1635-
uvwasi_ciovec_t* si_data = UncheckedCalloc<uvwasi_ciovec_t>(si_data_len);
1636-
1637-
if (si_data == nullptr) {
1638-
args.GetReturnValue().Set(UVWASI_ENOMEM);
1639-
return;
1640-
}
1641-
1597+
std::vector<uvwasi_ciovec_t> si_data(si_data_len);
16421598
uvwasi_errno_t err = uvwasi_serdes_readv_ciovec_t(memory,
16431599
mem_size,
16441600
si_data_ptr,
1645-
si_data,
1601+
si_data.data(),
16461602
si_data_len);
16471603
if (err != UVWASI_ESUCCESS) {
1648-
free(si_data);
16491604
args.GetReturnValue().Set(err);
16501605
return;
16511606
}
16521607

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

1663-
free(si_data);
16641618
args.GetReturnValue().Set(err);
16651619
}
16661620

0 commit comments

Comments
 (0)