summaryrefslogtreecommitdiff
path: root/lib/tdb/common
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-07-30 13:10:33 -0700
committerJeremy Allison <jra@samba.org>2009-07-30 13:10:33 -0700
commit36c0f0f99aee940668b84c2c70b27f4993d9e6ee (patch)
tree7228468014803d7b21f05b3b048e02d8bc349b80 /lib/tdb/common
parenta88c281ddc52bfb20cf65245a703233426bb4592 (diff)
downloadsamba-36c0f0f99aee940668b84c2c70b27f4993d9e6ee.tar.gz
samba-36c0f0f99aee940668b84c2c70b27f4993d9e6ee.tar.bz2
samba-36c0f0f99aee940668b84c2c70b27f4993d9e6ee.zip
realloc() has that horrible overloaded free semantic when size is 0:
current code does a free of the old record in this case, then fail.
Diffstat (limited to 'lib/tdb/common')
-rw-r--r--lib/tdb/common/tdb.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c
index b59bb1571c..b78f74cc69 100644
--- a/lib/tdb/common/tdb.c
+++ b/lib/tdb/common/tdb.c
@@ -584,8 +584,13 @@ int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf)
if (dbuf.dptr == NULL) {
dbuf.dptr = (unsigned char *)malloc(new_dbuf.dsize);
} else {
- unsigned char *new_dptr = (unsigned char *)realloc(dbuf.dptr,
- dbuf.dsize + new_dbuf.dsize);
+ unsigned int new_len = dbuf.dsize + new_dbuf.dsize;
+ unsigned char *new_dptr;
+
+ /* realloc '0' is special: don't do that. */
+ if (new_len == 0)
+ new_len = 1;
+ new_dptr = (unsigned char *)realloc(dbuf.dptr, new_len);
if (new_dptr == NULL) {
free(dbuf.dptr);
}