tdb2: make tdb_name() valid early in tdb_open()
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 7 Apr 2011 11:18:33 +0000 (20:48 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 7 Apr 2011 11:18:33 +0000 (20:48 +0930)
Otherwise tdb_name() can be NULL in log functions.  And we might as
well allocate it with the tdb, as well.

ccan/tdb2/open.c

index 7cbac0afa0c3cf39d7b2122c89b03e784ab5a574..37e20907fedfc1a9f512c449dea8b8e727ebcf9a 100644 (file)
@@ -321,13 +321,18 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
        tdb_bool_err berr;
        enum TDB_ERROR ecode;
 
        tdb_bool_err berr;
        enum TDB_ERROR ecode;
 
-       tdb = malloc(sizeof(*tdb));
+       tdb = malloc(sizeof(*tdb) + (name ? strlen(name) + 1 : 0));
        if (!tdb) {
                /* Can't log this */
                errno = ENOMEM;
                return NULL;
        }
        if (!tdb) {
                /* Can't log this */
                errno = ENOMEM;
                return NULL;
        }
-       tdb->name = NULL;
+       /* Set name immediately for logging functions. */
+       if (name) {
+               tdb->name = strcpy((char *)(tdb + 1), name);
+       } else {
+               tdb->name = NULL;
+       }
        tdb->direct_access = 0;
        tdb->flags = tdb_flags;
        tdb->log_fn = NULL;
        tdb->direct_access = 0;
        tdb->flags = tdb_flags;
        tdb->log_fn = NULL;
@@ -590,7 +595,6 @@ fail_errno:
 #ifdef TDB_TRACE
        close(tdb->tracefd);
 #endif
 #ifdef TDB_TRACE
        close(tdb->tracefd);
 #endif
-       free(cast_const(char *, tdb->name));
        if (tdb->file) {
                tdb_lock_cleanup(tdb);
                if (--tdb->file->refcnt == 0) {
        if (tdb->file) {
                tdb_lock_cleanup(tdb);
                if (--tdb->file->refcnt == 0) {
@@ -631,7 +635,6 @@ int tdb_close(struct tdb_context *tdb)
                else
                        tdb_munmap(tdb->file);
        }
                else
                        tdb_munmap(tdb->file);
        }
-       free(cast_const(char *, tdb->name));
        if (tdb->file) {
                struct tdb_file **i;
 
        if (tdb->file) {
                struct tdb_file **i;