]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/check.c
read_write_all: avoid arithmetic on void pointers.
[ccan] / ccan / tdb2 / check.c
index 077fa856e4cee2981659ecd406e06c3b0ca500e6..577086689f373f75c1774d9be2fd1175180af950 100644 (file)
@@ -402,22 +402,26 @@ static enum TDB_ERROR check_hash_tree(struct tdb_context *tdb,
                check:
                        if (check) {
                                TDB_DATA key, data;
-                               key.dsize = rec_key_length(&rec);
-                               data.dsize = rec_data_length(&rec);
-                               key.dptr = (void *)tdb_access_read(tdb,
-                                                  off + sizeof(rec),
-                                                  key.dsize + data.dsize,
-                                                  false);
-                               if (TDB_PTR_IS_ERR(key.dptr)) {
-                                       ecode = TDB_PTR_ERR(key.dptr);
+                               const unsigned char *kptr;
+
+                               kptr = tdb_access_read(tdb,
+                                                      off + sizeof(rec),
+                                                      rec_key_length(&rec)
+                                                      + rec_data_length(&rec),
+                                                      false);
+                               if (TDB_PTR_IS_ERR(kptr)) {
+                                       ecode = TDB_PTR_ERR(kptr);
                                        goto fail;
                                }
-                               data.dptr = key.dptr + key.dsize;
+
+                               key = tdb_mkdata(kptr, rec_key_length(&rec));
+                               data = tdb_mkdata(kptr + key.dsize,
+                                                 rec_data_length(&rec));
                                ecode = check(key, data, private_data);
+                               tdb_access_release(tdb, kptr);
                                if (ecode != TDB_SUCCESS) {
                                        goto fail;
                                }
-                               tdb_access_release(tdb, key.dptr);
                        }
                }
        }
@@ -765,13 +769,13 @@ enum TDB_ERROR tdb_check_(struct tdb_context *tdb,
 
        ecode = tdb_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, false);
        if (ecode != TDB_SUCCESS) {
-               return ecode;
+               return tdb->last_error = ecode;
        }
 
        ecode = tdb_lock_expand(tdb, F_RDLCK);
        if (ecode != TDB_SUCCESS) {
                tdb_allrecord_unlock(tdb, F_RDLCK);
-               return ecode;
+               return tdb->last_error = ecode;
        }
 
        ecode = check_header(tdb, &recovery, &features);
@@ -812,5 +816,5 @@ out:
        tdb_unlock_expand(tdb, F_RDLCK);
        free(fr);
        free(used);
-       return ecode;
+       return tdb->last_error = ecode;
 }