diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2025-12-09 19:55:46 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2025-12-09 19:55:46 +0000 |
| commit | 12165ac8407cef2c0b96035a1a956e3a7fe48cec (patch) | |
| tree | 851e1b59f4ad0d60a7adc8f735fe1a66bc3643b5 | |
| parent | cf39b51d36d82214ebdfd03055d321ddd2d85274 (diff) | |
Revert "netlink: Fix overallocation of netlink message buffers"
This patch was based on an incorrect assumption that the linear buffer
chain for an snl_writer only contained the netlink message body.
This reverts commit 828df4d36d9d5a6ca0dcc294d65572b4a0474142.
Sponsored by: AFRL, DARPA
| -rw-r--r-- | sys/netlink/netlink_snl.h | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h index 1e560e029718..57f7e1e29d08 100644 --- a/sys/netlink/netlink_snl.h +++ b/sys/netlink/netlink_snl.h @@ -1082,7 +1082,6 @@ snl_init_writer(struct snl_state *ss, struct snl_writer *nw) static inline bool snl_realloc_msg_buffer(struct snl_writer *nw, size_t sz) { - void *new_base; uint32_t new_size = nw->size * 2; while (new_size < nw->size + sz) @@ -1091,27 +1090,23 @@ snl_realloc_msg_buffer(struct snl_writer *nw, size_t sz) if (nw->error) return (false); - new_base = snl_allocz(nw->ss, new_size); - if (new_base == NULL) { + if (snl_allocz(nw->ss, new_size) == NULL) { nw->error = true; return (false); } + nw->size = new_size; - if (new_base == nw->ss->lb->base) { - /* Claim the entire linear buffer. */ - nw->size = nw->ss->lb->size; - nw->ss->lb->offset = nw->ss->lb->size; - } else - nw->size = new_size; - - memcpy(new_base, nw->base, nw->offset); - if (nw->hdr != NULL) { - int hdr_off = (char *)(nw->hdr) - nw->base; + void *new_base = nw->ss->lb->base; + if (new_base != nw->base) { + memcpy(new_base, nw->base, nw->offset); + if (nw->hdr != NULL) { + int hdr_off = (char *)(nw->hdr) - nw->base; - nw->hdr = (struct nlmsghdr *) - (void *)((char *)new_base + hdr_off); + nw->hdr = (struct nlmsghdr *) + (void *)((char *)new_base + hdr_off); + } + nw->base = (char *)new_base; } - nw->base = (char *)new_base; return (true); } |
