aboutsummaryrefslogtreecommitdiff
path: root/sys/netlink
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2025-11-24 15:55:05 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2025-11-24 15:55:05 +0000
commit828df4d36d9d5a6ca0dcc294d65572b4a0474142 (patch)
treebdd63dda9fc473f86f5b554da7b6fb5fa5a173cf /sys/netlink
parentf7ab908244e50c8c8edf314424c860e34ea3d7e9 (diff)
Diffstat (limited to 'sys/netlink')
-rw-r--r--sys/netlink/netlink_snl.h27
1 files changed, 16 insertions, 11 deletions
diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h
index 57f7e1e29d08..1e560e029718 100644
--- a/sys/netlink/netlink_snl.h
+++ b/sys/netlink/netlink_snl.h
@@ -1082,6 +1082,7 @@ 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)
@@ -1090,23 +1091,27 @@ snl_realloc_msg_buffer(struct snl_writer *nw, size_t sz)
if (nw->error)
return (false);
- if (snl_allocz(nw->ss, new_size) == NULL) {
+ new_base = snl_allocz(nw->ss, new_size);
+ if (new_base == NULL) {
nw->error = true;
return (false);
}
- nw->size = new_size;
- 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;
+ 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;
- nw->hdr = (struct nlmsghdr *)
- (void *)((char *)new_base + hdr_off);
- }
- nw->base = (char *)new_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->base = (char *)new_base;
return (true);
}