Message ID | 20210505211047.1496765-16-philmd@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | misc: Remove variable-length arrays on the stack | expand |
On Wed, May 05, 2021 at 11:10:39PM +0200, Philippe Mathieu-Daudé wrote: > Use autofree heap allocation instead of variable-length > array on the stack. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> fsl_etsec parts Acked-by: David Gibson <david@gibson.dropbear.id.au> > --- > hw/net/fsl_etsec/rings.c | 9 ++++----- > hw/net/rocker/rocker_of_dpa.c | 2 +- > net/dump.c | 2 +- > net/tap.c | 2 +- > 4 files changed, 7 insertions(+), 8 deletions(-) > > diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c > index 8f084464155..1abdcb5a29c 100644 > --- a/hw/net/fsl_etsec/rings.c > +++ b/hw/net/fsl_etsec/rings.c > @@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC *etsec, > uint16_t to_write; > hwaddr bufptr = bd->bufptr + > ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32); > - uint8_t padd[etsec->rx_padding]; > - uint8_t rem; > > RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx > " size:%zu(padding + crc:%u) + fcb:%u\n", > @@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC *etsec, > /* The remaining bytes are only for padding which is not actually > * allocated in the data buffer. > */ > - > - rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding); > + uint8_t rem = MIN(etsec->regs[MRBLR].value - bd->length, > + etsec->rx_padding); > > if (rem > 0) { > - memset(padd, 0x0, sizeof(padd)); > + g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding); > + > etsec->rx_padding -= rem; > *size -= rem; > bd->length += rem; > diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c > index b3b8c5bb6d4..3e400ceaef7 100644 > --- a/hw/net/rocker/rocker_of_dpa.c > +++ b/hw/net/rocker/rocker_of_dpa.c > @@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, uint32_t tbl_id) > static ssize_t of_dpa_ig(World *world, uint32_t pport, > const struct iovec *iov, int iovcnt) > { > - struct iovec iov_copy[iovcnt + 2]; > + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2); > OfDpaFlowContext fc = { > .of_dpa = world_private(world), > .in_pport = pport, > diff --git a/net/dump.c b/net/dump.c > index 4d538d82a69..b830302e27d 100644 > --- a/net/dump.c > +++ b/net/dump.c > @@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) > int64_t ts; > int caplen; > size_t size = iov_size(iov, cnt); > - struct iovec dumpiov[cnt + 1]; > + g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1); > > /* Early return in case of previous error. */ > if (s->fd < 0) { > diff --git a/net/tap.c b/net/tap.c > index bae895e2874..2b9ed8a2cd8 100644 > --- a/net/tap.c > +++ b/net/tap.c > @@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const struct iovec *iov, > { > TAPState *s = DO_UPCAST(TAPState, nc, nc); > const struct iovec *iovp = iov; > - struct iovec iov_copy[iovcnt + 1]; > + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1); > struct virtio_net_hdr_mrg_rxbuf hdr = { }; > > if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {
在 2021/5/6 上午5:10, Philippe Mathieu-Daudé 写道: > Use autofree heap allocation instead of variable-length > array on the stack. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > hw/net/fsl_etsec/rings.c | 9 ++++----- > hw/net/rocker/rocker_of_dpa.c | 2 +- > net/dump.c | 2 +- > net/tap.c | 2 +- > 4 files changed, 7 insertions(+), 8 deletions(-) > > diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c > index 8f084464155..1abdcb5a29c 100644 > --- a/hw/net/fsl_etsec/rings.c > +++ b/hw/net/fsl_etsec/rings.c > @@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC *etsec, > uint16_t to_write; > hwaddr bufptr = bd->bufptr + > ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32); > - uint8_t padd[etsec->rx_padding]; > - uint8_t rem; > > RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx > " size:%zu(padding + crc:%u) + fcb:%u\n", > @@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC *etsec, > /* The remaining bytes are only for padding which is not actually > * allocated in the data buffer. > */ > - > - rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding); > + uint8_t rem = MIN(etsec->regs[MRBLR].value - bd->length, > + etsec->rx_padding); > > if (rem > 0) { > - memset(padd, 0x0, sizeof(padd)); > + g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding); > + > etsec->rx_padding -= rem; > *size -= rem; > bd->length += rem; > diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c > index b3b8c5bb6d4..3e400ceaef7 100644 > --- a/hw/net/rocker/rocker_of_dpa.c > +++ b/hw/net/rocker/rocker_of_dpa.c > @@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, uint32_t tbl_id) > static ssize_t of_dpa_ig(World *world, uint32_t pport, > const struct iovec *iov, int iovcnt) > { > - struct iovec iov_copy[iovcnt + 2]; > + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2); > OfDpaFlowContext fc = { > .of_dpa = world_private(world), > .in_pport = pport, > diff --git a/net/dump.c b/net/dump.c > index 4d538d82a69..b830302e27d 100644 > --- a/net/dump.c > +++ b/net/dump.c > @@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) > int64_t ts; > int caplen; > size_t size = iov_size(iov, cnt); > - struct iovec dumpiov[cnt + 1]; > + g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1); > > /* Early return in case of previous error. */ > if (s->fd < 0) { > diff --git a/net/tap.c b/net/tap.c > index bae895e2874..2b9ed8a2cd8 100644 > --- a/net/tap.c > +++ b/net/tap.c > @@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const struct iovec *iov, > { > TAPState *s = DO_UPCAST(TAPState, nc, nc); > const struct iovec *iovp = iov; > - struct iovec iov_copy[iovcnt + 1]; > + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1); > struct virtio_net_hdr_mrg_rxbuf hdr = { }; > > if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {
diff --git a/hw/net/fsl_etsec/rings.c b/hw/net/fsl_etsec/rings.c index 8f084464155..1abdcb5a29c 100644 --- a/hw/net/fsl_etsec/rings.c +++ b/hw/net/fsl_etsec/rings.c @@ -381,8 +381,6 @@ static void fill_rx_bd(eTSEC *etsec, uint16_t to_write; hwaddr bufptr = bd->bufptr + ((hwaddr)(etsec->regs[TBDBPH].value & 0xF) << 32); - uint8_t padd[etsec->rx_padding]; - uint8_t rem; RING_DEBUG("eTSEC fill Rx buffer @ 0x%016" HWADDR_PRIx " size:%zu(padding + crc:%u) + fcb:%u\n", @@ -423,11 +421,12 @@ static void fill_rx_bd(eTSEC *etsec, /* The remaining bytes are only for padding which is not actually * allocated in the data buffer. */ - - rem = MIN(etsec->regs[MRBLR].value - bd->length, etsec->rx_padding); + uint8_t rem = MIN(etsec->regs[MRBLR].value - bd->length, + etsec->rx_padding); if (rem > 0) { - memset(padd, 0x0, sizeof(padd)); + g_autofree uint8_t *padd = g_malloc0(etsec->rx_padding); + etsec->rx_padding -= rem; *size -= rem; bd->length += rem; diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c index b3b8c5bb6d4..3e400ceaef7 100644 --- a/hw/net/rocker/rocker_of_dpa.c +++ b/hw/net/rocker/rocker_of_dpa.c @@ -1043,7 +1043,7 @@ static void of_dpa_flow_ig_tbl(OfDpaFlowContext *fc, uint32_t tbl_id) static ssize_t of_dpa_ig(World *world, uint32_t pport, const struct iovec *iov, int iovcnt) { - struct iovec iov_copy[iovcnt + 2]; + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 2); OfDpaFlowContext fc = { .of_dpa = world_private(world), .in_pport = pport, diff --git a/net/dump.c b/net/dump.c index 4d538d82a69..b830302e27d 100644 --- a/net/dump.c +++ b/net/dump.c @@ -68,7 +68,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) int64_t ts; int caplen; size_t size = iov_size(iov, cnt); - struct iovec dumpiov[cnt + 1]; + g_autofree struct iovec *dumpiov = g_new(struct iovec, cnt + 1); /* Early return in case of previous error. */ if (s->fd < 0) { diff --git a/net/tap.c b/net/tap.c index bae895e2874..2b9ed8a2cd8 100644 --- a/net/tap.c +++ b/net/tap.c @@ -120,7 +120,7 @@ static ssize_t tap_receive_iov(NetClientState *nc, const struct iovec *iov, { TAPState *s = DO_UPCAST(TAPState, nc, nc); const struct iovec *iovp = iov; - struct iovec iov_copy[iovcnt + 1]; + g_autofree struct iovec *iov_copy = g_new(struct iovec, iovcnt + 1); struct virtio_net_hdr_mrg_rxbuf hdr = { }; if (s->host_vnet_hdr_len && !s->using_vnet_hdr) {
Use autofree heap allocation instead of variable-length array on the stack. Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- hw/net/fsl_etsec/rings.c | 9 ++++----- hw/net/rocker/rocker_of_dpa.c | 2 +- net/dump.c | 2 +- net/tap.c | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-)