TDB_DATA dbwrap_record_get_value(const struct db_record *rec)
{
+ SMB_ASSERT(rec->value_valid);
return rec->value;
}
{
NTSTATUS status;
+ /*
+ * Invalidate before rec->storev() is called, give
+ * rec->storev() the chance to re-validate rec->value.
+ */
+ rec->value_valid = false;
+
status = rec->storev(rec, dbufs, num_dbufs, flags);
if (!NT_STATUS_IS_OK(status)) {
return status;
{
NTSTATUS status;
+ /*
+ * Invalidate before rec->delete_rec() is called, give
+ * rec->delete_rec() the chance to re-validate rec->value.
+ */
+ rec->value_valid = false;
+
status = rec->delete_rec(rec);
if (!NT_STATUS_IS_OK(status)) {
return status;
struct db_record {
struct db_context *db;
TDB_DATA key, value;
+ bool value_valid;
NTSTATUS (*storev)(struct db_record *rec, const TDB_DATA *dbufs,
int num_dbufs, int flag);
NTSTATUS (*delete_rec)(struct db_record *rec);
rec_priv->node = res.node;
result->value = res.val;
+ result->value_valid = true;
if (found) {
result->key = res.key;
rec.storev = db_rbt_storev;
rec.delete_rec = db_rbt_delete;
db_rbt_parse_node(rec_priv.node, &rec.key, &rec.value);
+ rec.value_valid = true;
if (rw) {
ctx->traverse_nextp = &next;
else {
result->value.dptr = NULL;
}
+ result->value_valid = true;
return 0;
}
.db = db, .key = key,
.value = (struct TDB_DATA) { .dptr = buf,
.dsize = talloc_get_size(buf) },
+ .value_valid = true,
.storev = db_tdb_storev, .delete_rec = db_tdb_delete,
.private_data = ctx
};
rec.key = kbuf;
rec.value = dbuf;
+ rec.value_valid = true;
rec.storev = db_tdb_storev;
rec.delete_rec = db_tdb_delete;
rec.private_data = ctx->db->private_data;
rec.key = kbuf;
rec.value = dbuf;
+ rec.value_valid = true;
rec.storev = db_tdb_storev_deny;
rec.delete_rec = db_tdb_delete_deny;
rec.private_data = ctx->db->private_data;
DEBUG(0, ("talloc failed\n"));
TALLOC_FREE(result);
}
+ result->value_valid = true;
SAFE_FREE(ctdb_data.dptr);
TALLOC_FREE(result);
}
}
+ result->value_valid = true;
SAFE_FREE(ctdb_data.dptr);
rec->key = dbwrap_record_get_key(subrec->subrec);
rec->storev = dbwrap_watched_storev;
rec->delete_rec = dbwrap_watched_delete;
+ rec->value_valid = true;
subrec_value = dbwrap_record_get_value(subrec->subrec);
state->subrec.wrec.watchers = watchers;
rec.value = state->subrec.wrec.data;
+ rec.value_valid = true;
}
state->fn(&rec, state->subrec.wrec.data, state->private_data);
}
prec.value = wrec.data;
+ prec.value_valid = true;
return state->fn(&prec, state->private_data);
}