[lxc-devel] [PATCH 1/4] coverity: don't reference beyond structure

Dwight Engen dwight.engen at oracle.com
Fri May 3 17:47:59 UTC 2013


On Fri, 3 May 2013 12:23:29 -0500
Serge Hallyn <serge.hallyn at ubuntu.com> wrote:

> Quoting Dwight Engen (dwight.engen at oracle.com):
> > On Fri, 3 May 2013 11:17:08 -0500
> > Serge Hallyn <serge.hallyn at ubuntu.com> wrote:
> > 
> > > can that be correct?  That changes the value of the
> > > pointer.  NLMSG_DATA adds aligned sizeof(struct nlmsghdr).
> > 
> > The current code is relying on the fact that our genlmsg looks like
> > this:
> > 
> > struct genlmsg {
> > 	struct nlmsghdr nlmsghdr;
> > 	struct genlmsghdr genlmsghdr;
> > };
> > 
> > so NLMSG_DATA(&request->nlmsghdr) == genlmsghdr (I think sizeof
> > struct nlmsghdr will make genlmsghdr be aligned anyway?). Right now
> > lxc doesn't use this code so I cannot test it in lxc, but let me
> > write a test program that dumps the pointers using the old way and
> > the new way. We do have a 2*PAGE_SIZE buffer these point to so I'm
> > sure its not overflowing, so maybe we do just want to ignore
> > coverity.
> 
> Thanks, I'll go ahead and apply the rest and hold off on this one.

Yeah I agree we should hold off. The following test program shows them
equivalent, but using NLMSG_DATA may be more appropriate. The commented
out __attribute__ ((aligned(4))); in genl.h make me suspicous this has
come up before. Maybe I can look into a way to make coverity happy
instead.


#include <stdio.h>
#include <linux/netlink.h>
#include <linux/genetlink.h>

struct genlmsg {
	struct nlmsghdr nlmsghdr;
	struct genlmsghdr genlmsghdr;
};

int main(int argc, char *argv[])
{
	struct genlmsg *request = NULL;
	struct genlmsghdr *p1,*p2;

	printf("sizeof request:%lu\n", sizeof(*request));
	printf("sizeof nlmsghdr:%lu\n", sizeof(request->nlmsghdr));

	p1 = NLMSG_DATA(&request->nlmsghdr);
	p2 = &request->genlmsghdr;
	printf("p1:%p p2:%p\n", p1, p2);
	return 0;
}




More information about the lxc-devel mailing list