evaluate arguments of chunk_clone/clonea/alloc/alloca only once
authorMartin Willi <martin@strongswan.org>
Wed, 9 Sep 2009 11:30:31 +0000 (13:30 +0200)
committerMartin Willi <martin@strongswan.org>
Wed, 9 Sep 2009 14:24:21 +0000 (16:24 +0200)
src/libstrongswan/chunk.h

index 8ea6c8e..f565f84 100644 (file)
@@ -181,22 +181,22 @@ static inline void chunk_clear(chunk_t *chunk)
 /**
  * Allocate a chunk on the heap
  */
 /**
  * Allocate a chunk on the heap
  */
-#define chunk_alloc(bytes) chunk_create(malloc(bytes), bytes)
+#define chunk_alloc(bytes) ({size_t x = (bytes); chunk_create(malloc(x), x);})
 
 /**
  * Allocate a chunk on the stack
  */
 
 /**
  * Allocate a chunk on the stack
  */
-#define chunk_alloca(bytes) chunk_create(alloca(bytes), bytes)
+#define chunk_alloca(bytes) ({size_t x = (bytes); chunk_create(alloca(x), x);})
 
 /**
  * Clone a chunk on heap
  */
 
 /**
  * Clone a chunk on heap
  */
-#define chunk_clone(chunk) chunk_create_clone((chunk).len ? malloc((chunk).len) : NULL, chunk)
+#define chunk_clone(chunk) ({chunk_t x = (chunk); chunk_create_clone(x.len ? malloc(x.len) : NULL, x);})
 
 /**
  * Clone a chunk on stack
  */
 
 /**
  * Clone a chunk on stack
  */
-#define chunk_clonea(chunk) chunk_create_clone(alloca((chunk).len), chunk)
+#define chunk_clonea(chunk) ({chunk_t x = (chunk); chunk_create_clone(alloca(x.len), x);})
 
 /**
  * Concatenate chunks into a chunk on heap
 
 /**
  * Concatenate chunks into a chunk on heap