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:
parent
7e8d0e6d9c
commit
7d8504cf69
@ -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])
|
||||
|
||||
Loading…
Reference in New Issue
Block a user