This allows potentially NULL pointers to be referenced, without an if ()
for every use. (previously, it would segfault).
Update doco, and allow talloc_unlink to match.
Andrew Bartlett
*/
void *talloc_reference(const void *context, const void *ptr)
{
*/
void *talloc_reference(const void *context, const void *ptr)
{
- struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr);
+ struct talloc_chunk *tc;
struct talloc_reference_handle *handle;
struct talloc_reference_handle *handle;
+ if (ptr == NULL) return NULL;
+
+ tc = talloc_chunk_from_ptr(ptr);
handle = talloc_named_const(context, sizeof(*handle), TALLOC_MAGIC_REFERENCE);
handle = talloc_named_const(context, sizeof(*handle), TALLOC_MAGIC_REFERENCE);
if (handle == NULL) return NULL;
/* note that we hang the destructor off the handle, not the
if (handle == NULL) return NULL;
/* note that we hang the destructor off the handle, not the
struct talloc_chunk *tc_p, *new_p;
void *new_parent;
struct talloc_chunk *tc_p, *new_p;
void *new_parent;
+ if (ptr == NULL) {
+ return -1;
+ }
+
if (context == NULL) {
context = null_context;
}
if (context == NULL) {
context = null_context;
}
talloc_free(r1);
talloc_report_full(NULL, stdout);
talloc_free(r1);
talloc_report_full(NULL, stdout);
+ printf("Testing NULL\n");
+ if (talloc_reference(root, NULL)) {
+ return False;
+ }
+
CHECK_BLOCKS(root, 1);
CHECK_SIZE(root, 0);
CHECK_BLOCKS(root, 1);
CHECK_SIZE(root, 0);
talloc_unlink(NULL, p2);
talloc_unlink(root, p1);
talloc_unlink(NULL, p2);
talloc_unlink(root, p1);
+ /* Test that talloc_unlink is a no-op */
+
+ if (talloc_unlink(root, NULL) != -1) {
+ printf("failed: talloc_unlink(root, NULL) == -1\n");
+ return False;
+ }
talloc_report(root, stdout);
talloc_report(NULL, stdout);
talloc_report(root, stdout);
talloc_report(NULL, stdout);
which case it will return NULL (each additional reference consumes
around 48 bytes of memory on intel x86 platforms).
which case it will return NULL (each additional reference consumes
around 48 bytes of memory on intel x86 platforms).
+If "ptr" is NULL, then the function is a no-op, and simply returns NULL.
+
After creating a reference you can free it in one of the following
ways:
After creating a reference you can free it in one of the following
ways:
with this pointer, or must be a direct parent of ptr.
Note that if the parent has already been removed using talloc_free()
with this pointer, or must be a direct parent of ptr.
Note that if the parent has already been removed using talloc_free()
-then this function will fail and will return -1.
+then this function will fail and will return -1. Likewise, if "ptr"
+is NULL, then the function will make no modifications and return -1.
Usually you can just use talloc_free() instead of talloc_unlink(), but
sometimes it is useful to have the additional control on which parent
Usually you can just use talloc_free() instead of talloc_unlink(), but
sometimes it is useful to have the additional control on which parent