diff options
author | Stef Walter <stefw@gnome.org> | 2012-04-16 15:04:59 +0200 |
---|---|---|
committer | Stef Walter <stefw@gnome.org> | 2012-08-23 14:15:33 +0200 |
commit | 2421956502379899736ef7e9fa8b1893c2de7cd7 (patch) | |
tree | 2c4a6df05fba38138f16560627b80ab6094d9477 /p11-kit/rpc-message.c | |
parent | 20f5e072d9bbe1d4d0fb359da9dfdd69c1bf701c (diff) | |
download | p11-kit-wip/rpc-layer.tar.gz |
WIP daemonwip/rpc-layer
Diffstat (limited to 'p11-kit/rpc-message.c')
-rw-r--r-- | p11-kit/rpc-message.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/p11-kit/rpc-message.c b/p11-kit/rpc-message.c index 7045e85..810d417 100644 --- a/p11-kit/rpc-message.c +++ b/p11-kit/rpc-message.c @@ -44,10 +44,50 @@ _p11_rpc_message_init (RpcMessage *msg, void _p11_rpc_message_clear (RpcMessage *msg) { + void *allocated; + void **data; + assert (msg != NULL); assert (msg->buffer.allocator); _p11_buffer_uninit (&msg->buffer); + + /* Free up the extra allocated memory */ + allocated = msg->extra; + while (allocated != NULL) { + data = (void **)allocated; + + /* Pointer to the next allocation */ + allocated = *data; + (msg->buffer.allocator) (data, 0); + } + msg->extra = NULL; +} + +void * +_p11_rpc_message_alloc_extra (RpcMessage *msg, + size_t length) +{ + void **data; + + assert (msg != NULL); + + if (length > 0x7fffffff) + return NULL; + + data = (msg->buffer.allocator) (NULL, sizeof (void *) + length); + if (data == NULL) + return NULL; + + /* Munch up the memory to help catch bugs */ + memset (data, 0xff, sizeof (void *) + length); + + /* Store pointer to next allocated block at beginning */ + *data = msg->extra; + msg->extra = data; + + /* Data starts after first pointer */ + return (void *)(data + 1); } void |