在 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) {