mirror of
https://github.com/samba-team/samba.git
synced 2025-02-26 21:57:41 +03:00
tdb: Use tdb_parse_record in tdb_update_hash
This avoids a tdb_fetch, thus a malloc/memcpy/free in the tdb_store path
This commit is contained in:
parent
c1e9537ed0
commit
1eefd6bafb
@ -146,6 +146,19 @@ tdb1_off_t tdb1_find_lock_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t h
|
||||
|
||||
static TDB_DATA _tdb1_fetch(struct tdb_context *tdb, TDB_DATA key);
|
||||
|
||||
static int tdb_update_hash_cmp(TDB_DATA key, TDB_DATA data, void *private_data)
|
||||
{
|
||||
TDB_DATA *dbuf = (TDB_DATA *)private_data;
|
||||
|
||||
if (dbuf->dsize != data.dsize) {
|
||||
return -1;
|
||||
}
|
||||
if (memcmp(dbuf->dptr, data.dptr, data.dsize) != 0) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* update an entry in place - this only works if the new data size
|
||||
is <= the old data size and the key exists.
|
||||
on failure return -1.
|
||||
@ -163,18 +176,9 @@ static int tdb1_update_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash
|
||||
* surprisingly common (eg. with a ldb re-index). */
|
||||
if (rec.key_len == key.dsize &&
|
||||
rec.data_len == dbuf.dsize &&
|
||||
rec.full_hash == hash) {
|
||||
TDB_DATA data = _tdb1_fetch(tdb, key);
|
||||
if (data.dsize == dbuf.dsize &&
|
||||
memcmp(data.dptr, dbuf.dptr, data.dsize) == 0) {
|
||||
if (data.dptr) {
|
||||
free(data.dptr);
|
||||
}
|
||||
rec.full_hash == hash &&
|
||||
tdb1_parse_record(tdb, key, tdb_update_hash_cmp, &dbuf) == 0) {
|
||||
return 0;
|
||||
}
|
||||
if (data.dptr) {
|
||||
free(data.dptr);
|
||||
}
|
||||
}
|
||||
|
||||
/* must be long enough key, data and tailer */
|
||||
|
Loading…
x
Reference in New Issue
Block a user