From 6a19b3dea8655eb8fce3b16ab0cd99eded00410c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 14 Apr 2015 10:06:55 +0000 Subject: [PATCH] winbind: Use tdb_parse_record in wcache_fetch_seqnum This removes a malloc use Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/winbindd/winbindd_cache.c | 57 +++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/source3/winbindd/winbindd_cache.c b/source3/winbindd/winbindd_cache.c index 90270baf0e9..1986aad0afd 100644 --- a/source3/winbindd/winbindd_cache.c +++ b/source3/winbindd/winbindd_cache.c @@ -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 ) -- 2.11.4.GIT