queue: fix pointer truncation on LLP64 platforms

QUEUE_DATA used to cast a pointer to long and back to pointer. This can
corrupt pointers on systems where the long type isn't large enough to
store pointer, like Windows x64. This commit fixes that.

Fixes #835
This commit is contained in:
Bert Belder 2013-06-15 13:37:07 +02:00
parent 7e8d0e6d9c
commit 7d8504cf69

View File

@ -16,6 +16,8 @@
#ifndef QUEUE_H_
#define QUEUE_H_
#include <stdint.h>
typedef void *QUEUE[2];
/* Private macros. */
@ -26,7 +28,7 @@ typedef void *QUEUE[2];
/* Public macros. */
#define QUEUE_DATA(ptr, type, field) \
((type *) ((char *) (ptr) - ((long) &((type *) 0)->field)))
((type *) ((char *) (ptr) - ((uintptr_t) &((type *) 0)->field)))
#define QUEUE_FOREACH(q, h) \
for ((q) = (QUEUE *) (*(h))[0]; (q) != (h); (q) = (QUEUE *) (*(q))[0])