From patchwork Thu Dec 13 22:04:09 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/8] lib/blkid/list.h: Fix undefined behavior in list_entry() macro Date: Thu, 13 Dec 2012 12:04:09 -0000 From: Sami Liedes X-Patchwork-Id: 206256 Message-Id: <20121213220408.GI9713@sli.dy.fi> To: linux-ext4@vger.kernel.org Update list_entry() macro, which is basically the same as the container_of() macro in the kernel, to use offsetof() to fix undefined behavior. Caught using clang -fsanitize=undefined. Signed-off-by: Sami Liedes --- lib/blkid/list.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/blkid/list.h b/lib/blkid/list.h index c1cbfec..d15228e 100644 --- a/lib/blkid/list.h +++ b/lib/blkid/list.h @@ -148,8 +148,9 @@ _INLINE_ void list_splice(struct list_head *list, struct list_head *head) * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ -#define list_entry(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) +#define list_entry(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) /** * list_for_each - iterate over elements in a list