]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:dbwrap_watch: use value_valid = false during dbwrap_watched_do_locked_fn()
authorStefan Metzmacher <metze@samba.org>
Fri, 24 Jun 2022 09:57:05 +0000 (09:57 +0000)
committerRalph Boehme <slow@samba.org>
Tue, 26 Jul 2022 13:40:33 +0000 (13:40 +0000)
This matches db_tdb_do_locked() and the fetch_locked based fallback in
dbwrap_do_locked().

Calling dbwrap_record_get_value() is not allowed from within
dbwrap_do_locked()!

Now that rec.value is only internal, use it to remember the initial
payload value. This will simplify further code changes as it
makes the fetch_locked case.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/lib/dbwrap/dbwrap_watch.c

index e54d74df43f80e632ddeb0d28860cff2911d7d4e..3f2034e36240f0af02c4102b0711d0dcef49d55b 100644 (file)
@@ -375,11 +375,10 @@ static void dbwrap_watched_do_locked_fn(
 {
        struct dbwrap_watched_do_locked_state *state =
                (struct dbwrap_watched_do_locked_state *)private_data;
-       TDB_DATA value = {0};
        struct db_record rec = {
                .db = state->db,
                .key = dbwrap_record_get_key(subrec),
-               .value_valid = true,
+               .value_valid = false,
                .storev = dbwrap_watched_do_locked_storev,
                .delete_rec = dbwrap_watched_do_locked_delete,
                .private_data = state
@@ -391,14 +390,16 @@ static void dbwrap_watched_do_locked_fn(
        };
        state->wakeup_value = subrec_value;
 
-       ok = dbwrap_watch_rec_parse(subrec_value, NULL, NULL, &value);
+       ok = dbwrap_watch_rec_parse(subrec_value,
+                                   NULL, NULL,
+                                   &rec.value);
        if (!ok) {
                dbwrap_watch_log_invalid_record(rec.db, rec.key, subrec_value);
                /* wipe invalid data */
-               value = (TDB_DATA) { .dptr = NULL, .dsize = 0 };
+               rec.value = (TDB_DATA) { .dptr = NULL, .dsize = 0 };
        }
 
-       state->fn(&rec, value, state->private_data);
+       state->fn(&rec, rec.value, state->private_data);
 
        db_watched_subrec_destructor(&state->subrec);
 }