If the record has the exact size of ctdb_ltdb_header, it is deleted.
Handle it as such, otherwise calls like dbwrap_exists will
report it as still being around
Signed-off-by: Christian Ambach <ambi@samba.org>
goto fail;
}
- parser(key, make_tdb_data(&reply->data[0], reply->datalen),
- private_data);
+ /* empty record == deleted record */
+ if (reply->datalen == 0) {
+ parser(key, tdb_null, private_data);
+ } else {
+ parser(key, make_tdb_data(&reply->data[0], reply->datalen),
+ private_data);
+ }
status = NT_STATUS_OK;
fail:
TALLOC_FREE(reply);
(struct db_ctdb_ltdb_parse_state *)private_data;
if (data.dsize < sizeof(struct ctdb_ltdb_header)) {
+ /* invalid record */
return -1;
}
+
state->parser(
key, (struct ctdb_ltdb_header *)data.dptr,
make_tdb_data(data.dptr + sizeof(struct ctdb_ltdb_header),
(struct db_ctdb_parse_record_state *)private_data;
if (db_ctdb_can_use_local_hdr(header, true)) {
- state->parser(key, data, state->private_data);
+ if (data.dsize == 0) {
+ state->parser(key, tdb_null, state->private_data);
+ } else {
+ state->parser(key, data, state->private_data);
+ }
state->done = true;
} else {
/*
enum ndr_err_code ndr_err;
DATA_BLOB blob;
+
+ /* empty record */
+ if (dbuf.dptr == NULL || dbuf.dsize == 0) {
+ return NULL;
+ }
+
d = talloc(mem_ctx, struct share_mode_data);
if (d == NULL) {
DEBUG(0, ("talloc failed\n"));
value = dbwrap_record_get_value(rec);
- if (value.dptr == NULL) {
+ if (value.dptr == NULL || value.dsize == 0) {
d = fresh_share_mode_lock(mem_ctx, servicepath, smb_fname,
old_write_time);
} else {