winbind: Use tdb_parse_record in wcache_fetch_seqnum
authorVolker Lendecke <vl@samba.org>
Tue, 14 Apr 2015 10:06:55 +0000 (10:06 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 16 Apr 2015 19:06:07 +0000 (21:06 +0200)
This removes a malloc use

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/winbindd/winbindd_cache.c

index 90270baf0e9b109e8a4662a8068a7d5b3606b74f..1986aad0afd4195c5e7c53f6ee66a747c0615d0e 100644 (file)
@@ -398,43 +398,54 @@ static bool wcache_server_down(struct winbindd_domain *domain)
        return ret;
 }
 
+struct wcache_seqnum_state {
+       uint32_t *seqnum;
+       uint32_t *last_seq_check;
+};
+
+static int wcache_seqnum_parser(TDB_DATA key, TDB_DATA data,
+                               void *private_data)
+{
+       struct wcache_seqnum_state *state = private_data;
+
+       if (data.dsize != 8) {
+               DEBUG(10, ("wcache_fetch_seqnum: invalid data size %d\n",
+                          (int)data.dsize));
+               return -1;
+       }
+
+       *state->seqnum = IVAL(data.dptr, 0);
+       *state->last_seq_check = IVAL(data.dptr, 4);
+       return 0;
+}
+
 static bool wcache_fetch_seqnum(const char *domain_name, uint32_t *seqnum,
                                uint32_t *last_seq_check)
 {
-       char *key;
-       TDB_DATA data;
+       struct wcache_seqnum_state state = {
+               .seqnum = seqnum, .last_seq_check = last_seq_check
+       };
+       char *keystr;
+       TDB_DATA key;
+       int ret;
 
        if (wcache->tdb == NULL) {
                DEBUG(10,("wcache_fetch_seqnum: tdb == NULL\n"));
                return false;
        }
 
-       key = talloc_asprintf(talloc_tos(), "SEQNUM/%s", domain_name);
-       if (key == NULL) {
+       keystr = talloc_asprintf(talloc_tos(), "SEQNUM/%s", domain_name);
+       if (keystr == NULL) {
                DEBUG(10, ("talloc failed\n"));
                return false;
        }
+       key = string_term_tdb_data(keystr);
 
-       data = tdb_fetch_bystring(wcache->tdb, key);
-       TALLOC_FREE(key);
-
-       if (data.dptr == NULL) {
-               DEBUG(10, ("wcache_fetch_seqnum: %s not found\n",
-                          domain_name));
-               return false;
-       }
-       if (data.dsize != 8) {
-               DEBUG(10, ("wcache_fetch_seqnum: invalid data size %d\n",
-                          (int)data.dsize));
-               SAFE_FREE(data.dptr);
-               return false;
-       }
-
-       *seqnum = IVAL(data.dptr, 0);
-       *last_seq_check = IVAL(data.dptr, 4);
-       SAFE_FREE(data.dptr);
+       ret = tdb_parse_record(wcache->tdb, key, wcache_seqnum_parser,
+                              &state);
+       TALLOC_FREE(keystr);
 
-       return true;
+       return (ret == 0);
 }
 
 static NTSTATUS fetch_cache_seqnum( struct winbindd_domain *domain, time_t now )