Browse Source

tdb2: make tdb_name() valid early in tdb_open()

Otherwise tdb_name() can be NULL in log functions.  And we might as
well allocate it with the tdb, as well.
Rusty Russell 15 years ago
parent
commit
66ead2bcb7
1 changed files with 7 additions and 4 deletions
  1. 7 4
      ccan/tdb2/open.c

+ 7 - 4
ccan/tdb2/open.c

@@ -321,13 +321,18 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
 	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;
 	}
-	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;
@@ -590,7 +595,6 @@ fail_errno:
 #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) {
@@ -631,7 +635,6 @@ int tdb_close(struct tdb_context *tdb)
 		else
 			tdb_munmap(tdb->file);
 	}
-	free(cast_const(char *, tdb->name));
 	if (tdb->file) {
 		struct tdb_file **i;