realloc() has that horrible overloaded free semantic when size is 0:
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 30 Jul 2009 20:10:33 +0000 (13:10 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 30 Jul 2009 20:10:33 +0000 (13:10 -0700)
current code does a free of the old record in this case, then fail.

lib/tdb/common/tdb.c

index b59bb1571c3af92f4f75a1f19e3448ed706694db..b78f74cc693e9f4fd3b26ba2e06b078f31bb0965 100644 (file)
@@ -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);
                }