X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-rtnl%2Frtnl-message.c;h=941bd963824231f373f973b32cd4bc39b30b4c3f;hp=85cf55a3cdcc2df8cad09e0d5445512078f82b89;hb=8e337e6438e1168d9a3bf8e623a26b2211290c24;hpb=8e1519bddb5eefedac2d9c4bf6f6e6b4d5e8ce81 diff --git a/src/libsystemd-rtnl/rtnl-message.c b/src/libsystemd-rtnl/rtnl-message.c index 85cf55a3c..941bd9638 100644 --- a/src/libsystemd-rtnl/rtnl-message.c +++ b/src/libsystemd-rtnl/rtnl-message.c @@ -187,6 +187,7 @@ static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, uint32_t rta_length, message_length; struct nlmsghdr *new_hdr; struct rtattr *rta; + char *padding; assert_return(m, -EINVAL); assert_return(m->hdr, -EINVAL); @@ -194,10 +195,9 @@ static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, assert_return(data, -EINVAL); assert_return(data_length > 0, -EINVAL); - /* get the size of the new rta attribute (without padding at the end) */ + /* get the size of the new rta attribute (with padding at the end) */ rta_length = RTA_LENGTH(data_length); - /* get the new message size (with padding between the old message and the new attrib, - * but no padding after) + /* get the new message size (with padding at the end) */ message_length = m->hdr->nlmsg_len + RTA_ALIGN(rta_length); @@ -218,7 +218,9 @@ static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, /* we don't deal with the case where the user lies about the type and gives us * too little data (so don't do that) */ - memcpy(RTA_DATA(rta), data, data_length); + padding = mempcpy(RTA_DATA(rta), data, data_length); + /* make sure also the padding at the end of the message is initialized */ + memset(padding, '\0', (unsigned char *) m->hdr + m->hdr->nlmsg_len - (unsigned char *) padding); return 0; }