>From 70d79e2c3f8bb11f0810c43bd4b742622082c28e Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 15 Dec 2011 10:50:34 +0100 Subject: [PATCH] tdb: Avoid a malloc/memcpy in _tdb_store --- lib/tdb/common/tdb.c | 27 ++++++++++----------------- 1 files changed, 10 insertions(+), 17 deletions(-) diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c index 3a3c99c..993d5ef 100644 --- a/lib/tdb/common/tdb.c +++ b/lib/tdb/common/tdb.c @@ -473,7 +473,6 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, { struct tdb_record rec; tdb_off_t rec_ptr; - char *p = NULL; int ret = -1; /* check for it existing, on insert. */ @@ -503,18 +502,6 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, if (flag != TDB_INSERT) tdb_delete_hash(tdb, key, hash); - /* Copy key+value *before* allocating free space in case malloc - fails and we are left with a dead spot in the tdb. */ - - if (!(p = (char *)malloc(key.dsize + dbuf.dsize))) { - tdb->ecode = TDB_ERR_OOM; - goto fail; - } - - memcpy(p, key.dptr, key.dsize); - if (dbuf.dsize) - memcpy(p+key.dsize, dbuf.dptr, dbuf.dsize); - if (tdb->max_dead_records != 0) { /* * Allow for some dead records per hash chain, look if we can @@ -534,7 +521,11 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, if (tdb_rec_write(tdb, rec_ptr, &rec) == -1 || tdb->methods->tdb_write( tdb, rec_ptr + sizeof(rec), - p, key.dsize + dbuf.dsize) == -1) { + key.dptr, key.dsize) == -1 + || (dbuf.dsize != 0 + && tdb->methods->tdb_write( + tdb, rec_ptr + sizeof(rec) + key.dsize, + dbuf.dptr, dbuf.dsize)) == -1) { goto fail; } goto done; @@ -577,7 +568,11 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, /* write out and point the top of the hash chain at it */ if (tdb_rec_write(tdb, rec_ptr, &rec) == -1 - || tdb->methods->tdb_write(tdb, rec_ptr+sizeof(rec), p, key.dsize+dbuf.dsize)==-1 + || tdb->methods->tdb_write(tdb, rec_ptr+sizeof(rec), + key.dptr, key.dsize) == -1 + || (dbuf.dsize != 0 + && tdb->methods->tdb_write(tdb, rec_ptr+sizeof(rec)+key.dsize, + dbuf.dptr, dbuf.dsize) == -1) || tdb_ofs_write(tdb, TDB_HASH_TOP(hash), &rec_ptr) == -1) { /* Need to tdb_unallocate() here */ goto fail; @@ -589,8 +584,6 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, if (ret == 0) { tdb_increment_seqnum(tdb); } - - SAFE_FREE(p); return ret; } -- 1.7.3.4