diff --git a/lib/libifconfig/libifconfig_carp.c b/lib/libifconfig/libifconfig_carp.c --- a/lib/libifconfig/libifconfig_carp.c +++ b/lib/libifconfig/libifconfig_carp.c @@ -55,7 +55,7 @@ { .type = CARP_NL_STATE, .off = _OUT(carpr_state), .cb = snl_attr_get_uint32 }, { .type = CARP_NL_ADVBASE, .off = _OUT(carpr_advbase), .cb = snl_attr_get_int32 }, { .type = CARP_NL_ADVSKEW, .off = _OUT(carpr_advskew), .cb = snl_attr_get_int32 }, - { .type = CARP_NL_KEY, .off = _OUT(carpr_key), .cb = snl_attr_get_string }, + { .type = CARP_NL_KEY, .off = _OUT(carpr_key), .cb = snl_attr_cpy_string, .arg = (void *)CARP_KEY_LEN }, { .type = CARP_NL_ADDR, .off = _OUT(carpr_addr), .cb = snl_attr_get_in_addr }, { .type = CARP_NL_ADDR6, .off = _OUT(carpr_addr6), .cb = snl_attr_get_in6_addr }, }; @@ -176,6 +176,7 @@ &carpr->carpr_addr); snl_add_msg_attr(&nw, CARP_NL_ADDR6, sizeof(carpr->carpr_addr6), &carpr->carpr_addr6); + snl_add_msg_attr_string(&nw, CARP_NL_KEY, carpr->carpr_key); hdr = snl_finalize_msg(&nw); if (hdr == NULL) { diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h --- a/sys/netlink/netlink_snl.h +++ b/sys/netlink/netlink_snl.h @@ -588,6 +588,22 @@ return (true); } +static inline bool +snl_attr_cpy_string(struct snl_state *ss, struct nlattr *nla, + const void *arg, void *target) +{ + bool ret; + char *tmp; + + ret = snl_attr_get_string(ss, nla, NULL, &tmp); + if (! ret) + return (ret); + + strlcpy(target, tmp, (size_t)arg); + + return (true); +} + static inline bool snl_attr_get_nested(struct snl_state *ss, struct nlattr *nla, const void *arg, void *target) {