lib: Move the "expired" for gencache_parse calculation into gencache.c
authorVolker Lendecke <vl@samba.org>
Sat, 13 Oct 2018 11:41:59 +0000 (13:41 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 16 Oct 2018 19:20:19 +0000 (21:20 +0200)
Make it more robust

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue Oct 16 21:20:19 CEST 2018 on sn-devel-144

source3/lib/gencache.c
source3/lib/gencache.h
source3/lib/idmap_cache.c
source3/lib/namemap_cache.c
source3/lib/util.c
source3/torture/torture.c
source3/winbindd/wb_dsgetdcname.c

index b4d374bf837c67b5bf8d4a7e5cc4c158a09e94a9..787ef981ec0f9cc9965d7ad35bb07b10c2cf20d7 100644 (file)
@@ -42,6 +42,14 @@ static struct tdb_wrap *cache_notrans;
  *
  **/
 
+struct gencache_timeout {
+       time_t timeout;
+};
+
+bool gencache_timeout_expired(const struct gencache_timeout *t)
+{
+       return t->timeout <= time(NULL);
+}
 
 /**
  * Cache initialisation function. Opens cache tdb file or creates
@@ -131,7 +139,8 @@ struct gencache_have_val_state {
        bool gotit;
 };
 
-static void gencache_have_val_parser(time_t old_timeout, DATA_BLOB data,
+static void gencache_have_val_parser(const struct gencache_timeout *old_timeout,
+                                    DATA_BLOB data,
                                     void *private_data)
 {
        struct gencache_have_val_state *state =
@@ -146,7 +155,7 @@ static void gencache_have_val_parser(time_t old_timeout, DATA_BLOB data,
         * value, just extending the remaining timeout by less than 10%.
         */
 
-       cache_time_left = old_timeout - now;
+       cache_time_left = old_timeout->timeout - now;
        if (cache_time_left <= 0) {
                /*
                 * timed out, write new value
@@ -338,10 +347,11 @@ done:
        return ret == 0;
 }
 
-static void gencache_del_parser(time_t timeout, DATA_BLOB blob,
+static void gencache_del_parser(const struct gencache_timeout *t,
+                               DATA_BLOB blob,
                                void *private_data)
 {
-       if (timeout != 0) {
+       if (t->timeout != 0) {
                bool *exists = private_data;
                *exists = true;
        }
@@ -419,7 +429,9 @@ static bool gencache_pull_timeout(uint8_t *val, time_t *pres, char **payload)
 }
 
 struct gencache_parse_state {
-       void (*parser)(time_t timeout, DATA_BLOB blob, void *private_data);
+       void (*parser)(const struct gencache_timeout *timeout,
+                      DATA_BLOB blob,
+                      void *private_data);
        void *private_data;
        bool copy_to_notrans;
 };
@@ -428,21 +440,21 @@ static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
 {
        struct gencache_parse_state *state;
        DATA_BLOB blob;
-       time_t t;
+       struct gencache_timeout t;
        char *payload;
        bool ret;
 
        if (data.dptr == NULL) {
                return -1;
        }
-       ret = gencache_pull_timeout(data.dptr, &t, &payload);
+       ret = gencache_pull_timeout(data.dptr, &t.timeout, &payload);
        if (!ret) {
                return -1;
        }
        state = (struct gencache_parse_state *)private_data;
        blob = data_blob_const(
                payload, data.dsize - PTR_DIFF(payload, data.dptr));
-       state->parser(t, blob, state->private_data);
+       state->parser(&t, blob, state->private_data);
 
        if (state->copy_to_notrans) {
                tdb_store(cache_notrans->tdb, key, data, 0);
@@ -452,7 +464,8 @@ static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
 }
 
 bool gencache_parse(const char *keystr,
-                   void (*parser)(time_t timeout, DATA_BLOB blob,
+                   void (*parser)(const struct gencache_timeout *timeout,
+                                  DATA_BLOB blob,
                                   void *private_data),
                    void *private_data)
 {
@@ -511,17 +524,18 @@ struct gencache_get_data_blob_state {
        bool result;
 };
 
-static void gencache_get_data_blob_parser(time_t timeout, DATA_BLOB blob,
+static void gencache_get_data_blob_parser(const struct gencache_timeout *t,
+                                         DATA_BLOB blob,
                                          void *private_data)
 {
        struct gencache_get_data_blob_state *state =
                (struct gencache_get_data_blob_state *)private_data;
 
-       if (timeout == 0) {
+       if (t->timeout == 0) {
                state->result = false;
                return;
        }
-       state->timeout = timeout;
+       state->timeout = t->timeout;
 
        if (state->blob == NULL) {
                state->result = true;
index fa72a4aa466f35bbad9e4f5d6a7e94a9708bb0d0..3d8ebe538728410f95eac1210a0ff8f251e79da2 100644 (file)
@@ -32,8 +32,17 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout);
 bool gencache_del(const char *keystr);
 bool gencache_get(const char *keystr, TALLOC_CTX *mem_ctx, char **value,
                  time_t *ptimeout);
+
+/*
+ * This might look like overkill, but namemap_cache.c shows it's
+ * necessary :-)
+ */
+struct gencache_timeout;
+bool gencache_timeout_expired(const struct gencache_timeout *t);
+
 bool gencache_parse(const char *keystr,
-                   void (*parser)(time_t timeout, DATA_BLOB blob,
+                   void (*parser)(const struct gencache_timeout *timeout,
+                                  DATA_BLOB blob,
                                   void *private_data),
                    void *private_data);
 bool gencache_get_data_blob(const char *keystr, TALLOC_CTX *mem_ctx,
index 1e8a1ebc607be5a954b56f6d170202c677d3c0e0..187723689adc168edbeeae0e97beff82a847b32a 100644 (file)
@@ -194,7 +194,8 @@ struct idmap_cache_xid2sid_state {
        bool ret;
 };
 
-static void idmap_cache_xid2sid_parser(time_t timeout, DATA_BLOB blob,
+static void idmap_cache_xid2sid_parser(const struct gencache_timeout *timeout,
+                                      DATA_BLOB blob,
                                       void *private_data)
 {
        struct idmap_cache_xid2sid_state *state =
@@ -217,7 +218,7 @@ static void idmap_cache_xid2sid_parser(time_t timeout, DATA_BLOB blob,
                state->ret = string_to_sid(state->sid, value);
        }
        if (state->ret) {
-               *state->expired = (timeout <= time(NULL));
+               *state->expired = gencache_timeout_expired(timeout);
        }
 }
 
index f6e71cd6d169a0a413e07e61d1c383bdfcd65de0..c153aa608e232286f04b4e58dd20cf2e4be1b375 100644 (file)
@@ -94,8 +94,10 @@ struct namemap_cache_find_sid_state {
        bool ok;
 };
 
-static void namemap_cache_find_sid_parser(time_t timeout, DATA_BLOB blob,
-                                         void *private_data)
+static void namemap_cache_find_sid_parser(
+       const struct gencache_timeout *timeout,
+       DATA_BLOB blob,
+       void *private_data)
 {
        struct namemap_cache_find_sid_state *state = private_data;
        const char *strv = (const char *)blob.data;
@@ -132,7 +134,7 @@ static void namemap_cache_find_sid_parser(time_t timeout, DATA_BLOB blob,
        state->fn(domain,
                  name,
                  (enum lsa_SidType)type,
-                 timeout <= time(NULL),
+                 gencache_timeout_expired(timeout),
                  state->private_data);
 
        state->ok = true;
@@ -241,8 +243,10 @@ struct namemap_cache_find_name_state {
        bool ok;
 };
 
-static void namemap_cache_find_name_parser(time_t timeout, DATA_BLOB blob,
-                                          void *private_data)
+static void namemap_cache_find_name_parser(
+       const struct gencache_timeout *timeout,
+       DATA_BLOB blob,
+       void *private_data)
 {
        struct namemap_cache_find_name_state *state = private_data;
        const char *strv = (const char *)blob.data;
@@ -284,7 +288,7 @@ static void namemap_cache_find_name_parser(time_t timeout, DATA_BLOB blob,
 
        state->fn(&sid,
                  (enum lsa_SidType)type,
-                 timeout <= time(NULL),
+                 gencache_timeout_expired(timeout),
                  state->private_data);
 
        state->ok = true;
index 394fa5fd19186a96940f250c1605a18b101c638d..da8ec55fa6103f7c6774e76af103c811b8b5852b 100644 (file)
@@ -1242,12 +1242,14 @@ struct ra_parser_state {
        enum remote_arch_types ra;
 };
 
-static void ra_parser(time_t timeout, DATA_BLOB blob, void *priv_data)
+static void ra_parser(const struct gencache_timeout *t,
+                     DATA_BLOB blob,
+                     void *priv_data)
 {
        struct ra_parser_state *state = (struct ra_parser_state *)priv_data;
        const char *ra_str = NULL;
 
-       if (timeout <= time(NULL)) {
+       if (gencache_timeout_expired(t)) {
                return;
        }
 
index 098560968dde8347bc13db805c35db5998f38262..3053596b4391b4d5656b75c2eeb8106cd49cab88 100644 (file)
@@ -10238,7 +10238,9 @@ static bool run_local_base64(int dummy)
        return ret;
 }
 
-static void parse_fn(time_t timeout, DATA_BLOB blob, void *private_data)
+static void parse_fn(const struct gencache_timeout *t,
+                    DATA_BLOB blob,
+                    void *private_data)
 {
        return;
 }
index 2f450c7a2b4661031a317b6efbd7266b6ca4766c..cbd2cf6fd78986717780c55f265969a96c607255 100644 (file)
@@ -171,12 +171,14 @@ struct dcinfo_parser_state {
        struct netr_DsRGetDCNameInfo *dcinfo;
 };
 
-static void dcinfo_parser(time_t timeout, DATA_BLOB blob, void *private_data)
+static void dcinfo_parser(const struct gencache_timeout *timeout,
+                         DATA_BLOB blob,
+                         void *private_data)
 {
        struct dcinfo_parser_state *state = private_data;
        enum ndr_err_code ndr_err;
 
-       if (timeout <= time(NULL)) {
+       if (gencache_timeout_expired(timeout)) {
                return;
        }