mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
r6528: - in tdb_fetch() we effectively disallowed zero length records by
returning NULL/0, which is the same as we used for a failure. Having
to look at tdb->ecode (which we never do) is too error prone.
Instead, tdb_fetch() should behave like malloc() and talloc(), where
zero length is not special and malloc(0) returns a valid pointer.
- similarly in data_blob(), asking for data_blob(NULL, 0) should
return a zero blob, but asking for data_blob(ptr, 0) should return a
zero length blob with a valid pointer, just like talloc() and malloc()
This change fixes the SummaryInformation stream stored in the tdb
backend when manipulated from w2k. The w2k client was using
SET_EOF_INFORMATION to create a zero-length stream, which we return
STATUS_NOT_FOUND on, as the tdb_fetch() gave us back a NULL/0 blob,
which we returned as not-found
(This used to be commit 162bbe4402
)
This commit is contained in:
parent
77255b7f9c
commit
98549af7bf
@ -29,7 +29,7 @@ DATA_BLOB data_blob_named(const void *p, size_t length, const char *name)
|
||||
{
|
||||
DATA_BLOB ret;
|
||||
|
||||
if (length == 0) {
|
||||
if (p == NULL && length == 0) {
|
||||
ZERO_STRUCT(ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1129,8 +1129,8 @@ static int tdb_update_hash(TDB_CONTEXT *tdb, TDB_DATA key, u32 hash, TDB_DATA db
|
||||
/* find an entry in the database given a key */
|
||||
/* If an entry doesn't exist tdb_err will be set to
|
||||
* TDB_ERR_NOEXIST. If a key has no data attached
|
||||
* tdb_err will not be set. Both will return a
|
||||
* zero pptr and zero dsize.
|
||||
* then the TDB_DATA will have zero length but
|
||||
* a non-zero pointer
|
||||
*/
|
||||
|
||||
TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key)
|
||||
@ -1145,11 +1145,8 @@ TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key)
|
||||
if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec)))
|
||||
return tdb_null;
|
||||
|
||||
if (rec.data_len)
|
||||
ret.dptr = tdb_alloc_read(tdb, rec_ptr + sizeof(rec) + rec.key_len,
|
||||
rec.data_len);
|
||||
else
|
||||
ret.dptr = NULL;
|
||||
ret.dptr = tdb_alloc_read(tdb, rec_ptr + sizeof(rec) + rec.key_len,
|
||||
rec.data_len);
|
||||
ret.dsize = rec.data_len;
|
||||
tdb_unlock(tdb, BUCKET(rec.full_hash), F_RDLCK);
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user