summaryrefslogtreecommitdiff
path: root/source4/lib/talloc/talloc.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-04-27 21:09:16 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:51:39 -0500
commitb06fc3b53c2f17cfa3f86ef1472a5778400c0fc9 (patch)
tree8b9b1c17953c224b23ea335a0167e74e5f57c6b5 /source4/lib/talloc/talloc.c
parent5a616802ff076814f0a105d64a469365aea6910a (diff)
downloadsamba-b06fc3b53c2f17cfa3f86ef1472a5778400c0fc9.tar.gz
samba-b06fc3b53c2f17cfa3f86ef1472a5778400c0fc9.tar.bz2
samba-b06fc3b53c2f17cfa3f86ef1472a5778400c0fc9.zip
r22539: Added _strict varients of the talloc calls to
return NULL on size == 0 varients. Jeremy. (This used to be commit 1ef269067ca501e2a4ded4ca8654c6a6cc26f385)
Diffstat (limited to 'source4/lib/talloc/talloc.c')
-rw-r--r--source4/lib/talloc/talloc.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c
index 028b44a8c7..8f7906d0d8 100644
--- a/source4/lib/talloc/talloc.c
+++ b/source4/lib/talloc/talloc.c
@@ -1087,6 +1087,28 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name)
}
+/*
+ talloc and zero memory.
+ Strict version - returns NULL if size is zero.
+*/
+void *_talloc_zero_strict(const void *ctx, size_t size, const char *name)
+{
+ void *p;
+
+ if (unlikely(size == 0)) {
+ return NULL;
+ }
+
+ p = _talloc_named_const(ctx, size, name);
+
+ if (p) {
+ memset(p, '\0', size);
+ }
+
+ return p;
+}
+
+
/*
memdup with a talloc.
*/
@@ -1102,6 +1124,26 @@ void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name
}
/*
+ memdup with a talloc.
+ Strict version - returns NULL if size is zero.
+*/
+void *_talloc_memdup_strict(const void *t, const void *p, size_t size, const char *name)
+{
+ void *newp;
+
+ if (unlikely(size == 0)) {
+ return NULL;
+ }
+
+ newp = _talloc_named_const(t, size, name);
+ if (likely(newp)) {
+ memcpy(newp, p, size);
+ }
+
+ return newp;
+}
+
+/*
strdup with a talloc
*/
char *talloc_strdup(const void *t, const char *p)
@@ -1282,6 +1324,23 @@ void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char
}
/*
+ alloc an array, checking for integer overflow in the array size.
+ Strict version - returns NULL if count or el_size are zero.
+*/
+void *_talloc_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name)
+{
+ if (count >= MAX_TALLOC_SIZE/el_size) {
+ return NULL;
+ }
+
+ if (el_size == 0 || count == 0) {
+ return NULL;
+ }
+
+ return _talloc_named_const(ctx, el_size * count, name);
+}
+
+/*
alloc an zero array, checking for integer overflow in the array size
*/
void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name)
@@ -1292,6 +1351,23 @@ void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const
return _talloc_zero(ctx, el_size * count, name);
}
+/*
+ alloc an zero array, checking for integer overflow in the array size
+ Strict version - returns NULL if count or el_size are zero.
+*/
+void *_talloc_zero_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name)
+{
+ if (count >= MAX_TALLOC_SIZE/el_size) {
+ return NULL;
+ }
+
+ if (el_size == 0 || count == 0) {
+ return NULL;
+ }
+
+ return _talloc_zero(ctx, el_size * count, name);
+}
+
/*
realloc an array, checking for integer overflow in the array size
@@ -1421,3 +1497,14 @@ int talloc_is_parent(const void *context, const void *ptr)
}
return 0;
}
+
+/*
+ Talloc wrapper that returns NULL if size == 0.
+*/
+void *talloc_strict(const void *context, size_t size, const char *name)
+{
+ if (unlikely(size == 0)) {
+ return NULL;
+ }
+ return _talloc_named_const(context, size, name);
+}