The branch, master has been updated via d3c689f lib: Use "mem_ctx" arg in gencache_get via 32037e0 Add a talloc context to sitename_fetch(). via 6b915bf Add a talloc context to saf_fetch(). via 8a7246a lib: Add a "mem_ctx" arg to gencache_get (unused so far) via f630360 gencache: Fix SAFE_FREE vs data_blob_free via aaa6a68 torture3: Test getting a blob as a string via 1173fed lib: Add "mem_ctx" to gencache_get_data_blob via 46131cb torture3: Fix a const warning from 6096a59 smbd: Add a paranoia check to oplock_timeout_handler
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d3c689fc5c80431b7e72150f72465b3d255a6f02 Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:57:59 2013 +0200 lib: Use "mem_ctx" arg in gencache_get Signed-off-by: Volker Lendecke <v...@samba.org> Signed-off-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Sep 5 20:09:21 CEST 2013 on sn-devel-104 commit 32037e0533f720ebbd3f49c5951c4ef30aac9985 Author: Jeremy Allison <j...@samba.org> Date: Wed Sep 4 13:58:18 2013 -0700 Add a talloc context to sitename_fetch(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 6b915bfd0f4194453c1b01158f2c2772b2a2df2f Author: Jeremy Allison <j...@samba.org> Date: Wed Sep 4 13:39:31 2013 -0700 Add a talloc context to saf_fetch(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> commit 8a7246ac2c5b27cc29e6ca23c1e2e0f43e298eb5 Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:56:23 2013 +0200 lib: Add a "mem_ctx" arg to gencache_get (unused so far) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f630360b7ff07ffd2a22f16d50293949860418ca Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:46:34 2013 +0200 gencache: Fix SAFE_FREE vs data_blob_free Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit aaa6a688cfc44ca681098a8ee66551689e8894a9 Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:44:50 2013 +0200 torture3: Test getting a blob as a string Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1173fed9165dffb79cfb119b6e80e379a6fd85ba Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:22:43 2013 +0200 lib: Add "mem_ctx" to gencache_get_data_blob Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 46131cb8023a883238b67e668be2afbc4adcf1f5 Author: Volker Lendecke <v...@samba.org> Date: Wed Sep 4 08:22:08 2013 +0200 torture3: Fix a const warning Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/auth/user_util.c | 5 +-- source3/include/proto.h | 8 +++-- source3/lib/gencache.c | 42 ++++++++++++++++---------- source3/lib/idmap_cache.c | 14 ++++---- source3/lib/wins_srv.c | 2 +- source3/libads/ldap.c | 15 ++++------ source3/libads/sitename_cache.c | 8 ++-- source3/libads/sitename_cache.h | 2 +- source3/libsmb/conncache.c | 4 +- source3/libsmb/dsgetdcname.c | 7 ++-- source3/libsmb/namecache.c | 8 ++-- source3/libsmb/namequery.c | 22 +++++++------- source3/libsmb/namequery_dc.c | 14 ++++---- source3/libsmb/trustdom_cache.c | 10 +++--- source3/passdb/account_pol.c | 4 +- source3/rpc_server/spoolss/srv_spoolss_nt.c | 7 ++-- source3/torture/torture.c | 31 ++++++++++++++----- source3/utils/net_cache.c | 2 +- source3/utils/net_lookup.c | 17 +++------- source3/winbindd/winbindd_ads.c | 4 ++- source3/winbindd/winbindd_cm.c | 23 +++++++------- 21 files changed, 135 insertions(+), 114 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/auth/user_util.c b/source3/auth/user_util.c index 082c885..70ab5ad 100644 --- a/source3/auth/user_util.c +++ b/source3/auth/user_util.c @@ -96,14 +96,13 @@ static bool fetch_map_from_gencache(TALLOC_CTX *ctx, if (key == NULL) { return false; } - found = gencache_get(key, &value, NULL); + found = gencache_get(key, ctx, &value, NULL); TALLOC_FREE(key); if (!found) { return false; } TALLOC_FREE(*p_user_out); - *p_user_out = talloc_strdup(ctx, value); - SAFE_FREE(value); + *p_user_out = value; if (!*p_user_out) { return false; } diff --git a/source3/include/proto.h b/source3/include/proto.h index 078d039..df65711 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -107,12 +107,14 @@ struct file_id vfs_file_id_from_sbuf(connection_struct *conn, const SMB_STRUCT_S bool gencache_set(const char *keystr, const char *value, time_t timeout); bool gencache_del(const char *keystr); -bool gencache_get(const char *keystr, char **valstr, time_t *timeout); +bool gencache_get(const char *keystr, TALLOC_CTX *mem_ctx, char **value, + time_t *ptimeout); bool gencache_parse(const char *keystr, void (*parser)(time_t timeout, DATA_BLOB blob, void *private_data), void *private_data); -bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, +bool gencache_get_data_blob(const char *keystr, TALLOC_CTX *mem_ctx, + DATA_BLOB *blob, time_t *timeout, bool *was_expired); bool gencache_stabilize(void); bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob, time_t timeout); @@ -823,7 +825,7 @@ bool namecache_status_fetch(const char *keyname, bool saf_store( const char *domain, const char *servername ); bool saf_join_store( const char *domain, const char *servername ); bool saf_delete( const char *domain ); -char *saf_fetch( const char *domain ); +char *saf_fetch(TALLOC_CTX *mem_ctx, const char *domain ); struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct nmb_name *name, diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c index 08adf21..2c5e9ab 100644 --- a/source3/lib/gencache.c +++ b/source3/lib/gencache.c @@ -368,7 +368,8 @@ bool gencache_del(const char *keystr) * element. */ - exists = gencache_get_data_blob(keystr, &value, NULL, &was_expired); + exists = gencache_get_data_blob(keystr, NULL, &value, NULL, + &was_expired); if (!exists && was_expired) { /* @@ -469,6 +470,7 @@ bool gencache_parse(const char *keystr, } struct gencache_get_data_blob_state { + TALLOC_CTX *mem_ctx; DATA_BLOB *blob; time_t timeout; bool result; @@ -491,7 +493,8 @@ static void gencache_get_data_blob_parser(time_t timeout, DATA_BLOB blob, return; } - *state->blob = data_blob(blob.data, blob.length); + *state->blob = data_blob_talloc(state->mem_ctx, blob.data, + blob.length); if (state->blob->data == NULL) { state->result = false; return; @@ -511,13 +514,15 @@ static void gencache_get_data_blob_parser(time_t timeout, DATA_BLOB blob, * @retval False for failure **/ -bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob, +bool gencache_get_data_blob(const char *keystr, TALLOC_CTX *mem_ctx, + DATA_BLOB *blob, time_t *timeout, bool *was_expired) { struct gencache_get_data_blob_state state; bool expired = false; state.result = false; + state.mem_ctx = mem_ctx; state.blob = blob; if (!gencache_parse(keystr, gencache_get_data_blob_parser, &state)) { @@ -700,30 +705,27 @@ static int stabilize_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA val, * @retval False for failure **/ -bool gencache_get(const char *keystr, char **value, time_t *ptimeout) +bool gencache_get(const char *keystr, TALLOC_CTX *mem_ctx, char **value, + time_t *ptimeout) { DATA_BLOB blob; bool ret = False; - ret = gencache_get_data_blob(keystr, &blob, ptimeout, NULL); + ret = gencache_get_data_blob(keystr, mem_ctx, &blob, ptimeout, NULL); if (!ret) { return false; } if ((blob.data == NULL) || (blob.length == 0)) { - SAFE_FREE(blob.data); + data_blob_free(&blob); return false; } if (blob.data[blob.length-1] != '\0') { /* Not NULL terminated, can't be a string */ - SAFE_FREE(blob.data); + data_blob_free(&blob); return false; } if (value) { - *value = SMB_STRDUP((char *)blob.data); - data_blob_free(&blob); - if (*value == NULL) { - return false; - } + *value = talloc_move(mem_ctx, (char **)&blob.data); return true; } data_blob_free(&blob); @@ -777,8 +779,11 @@ static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key, keystr = (char *)key.dptr; } else { /* ensure 0-termination */ - keystr = SMB_STRNDUP((char *)key.dptr, key.dsize); + keystr = talloc_strndup(talloc_tos(), (char *)key.dptr, key.dsize); free_key = keystr; + if (keystr == NULL) { + goto done; + } } if (!gencache_pull_timeout((char *)data.dptr, &timeout, &endptr)) { @@ -800,7 +805,7 @@ static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key, timeout, state->private_data); done: - SAFE_FREE(free_key); + TALLOC_FREE(free_key); return 0; } @@ -856,8 +861,11 @@ static void gencache_iterate_fn(const char *key, DATA_BLOB value, valstr = (char *)value.data; } else { /* ensure 0-termination */ - valstr = SMB_STRNDUP((char *)value.data, value.length); + valstr = talloc_strndup(talloc_tos(), (char *)value.data, value.length); free_val = valstr; + if (valstr == NULL) { + goto done; + } } DEBUG(10, ("Calling function with arguments " @@ -866,7 +874,9 @@ static void gencache_iterate_fn(const char *key, DATA_BLOB value, state->fn(key, valstr, timeout, state->private_data); - SAFE_FREE(free_val); + done: + + TALLOC_FREE(free_val); } void gencache_iterate(void (*fn)(const char *key, const char *value, diff --git a/source3/lib/idmap_cache.c b/source3/lib/idmap_cache.c index edf37a8..ffd3c19 100644 --- a/source3/lib/idmap_cache.c +++ b/source3/lib/idmap_cache.c @@ -48,7 +48,7 @@ bool idmap_cache_find_sid2unixid(const struct dom_sid *sid, struct unixid *id, if (key == NULL) { return false; } - ret = gencache_get(key, &value, &timeout); + ret = gencache_get(key, talloc_tos(), &value, &timeout); if (!ret) { goto done; } @@ -128,7 +128,7 @@ bool idmap_cache_find_sid2unixid(const struct dom_sid *sid, struct unixid *id, done: TALLOC_FREE(key); - SAFE_FREE(value); + TALLOC_FREE(value); return ret; } @@ -209,7 +209,7 @@ bool idmap_cache_find_uid2sid(uid_t uid, struct dom_sid *sid, bool *expired) if (key == NULL) { return false; } - ret = gencache_get(key, &value, &timeout); + ret = gencache_get(key, talloc_tos(), &value, &timeout); TALLOC_FREE(key); if (!ret) { return false; @@ -218,7 +218,7 @@ bool idmap_cache_find_uid2sid(uid_t uid, struct dom_sid *sid, bool *expired) if (value[0] != '-') { ret = string_to_sid(sid, value); } - SAFE_FREE(value); + TALLOC_FREE(value); if (ret) { *expired = (timeout <= time(NULL)); } @@ -246,7 +246,7 @@ bool idmap_cache_find_gid2sid(gid_t gid, struct dom_sid *sid, bool *expired) if (key == NULL) { return false; } - ret = gencache_get(key, &value, &timeout); + ret = gencache_get(key, talloc_tos(), &value, &timeout); TALLOC_FREE(key); if (!ret) { return false; @@ -255,7 +255,7 @@ bool idmap_cache_find_gid2sid(gid_t gid, struct dom_sid *sid, bool *expired) if (value[0] != '-') { ret = string_to_sid(sid, value); } - SAFE_FREE(value); + TALLOC_FREE(value); if (ret) { *expired = (timeout <= time(NULL)); } @@ -431,7 +431,7 @@ static bool idmap_cache_del_xid(char t, int xid) time_t timeout; bool ret = true; - if (!gencache_get(key, &sid_str, &timeout)) { + if (!gencache_get(key, mem_ctx, &sid_str, &timeout)) { DEBUG(3, ("no entry: %s\n", key)); ret = false; goto done; diff --git a/source3/lib/wins_srv.c b/source3/lib/wins_srv.c index fb5587f..6f7d5b3 100644 --- a/source3/lib/wins_srv.c +++ b/source3/lib/wins_srv.c @@ -101,7 +101,7 @@ bool wins_srv_is_dead(struct in_addr wins_ip, struct in_addr src_ip) /* If the key exists then the WINS server has been marked as dead */ - result = gencache_get(keystr, NULL, NULL); + result = gencache_get(keystr, NULL, NULL, NULL); SAFE_FREE(keystr); DEBUG(4, ("wins_srv_is_dead: %s is %s\n", inet_ntoa(wins_ip), diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index c8ef5b5..12aacd4 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -414,7 +414,7 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads) return NT_STATUS_NO_LOGON_SERVERS; } - sitename = sitename_fetch(realm); + sitename = sitename_fetch(talloc_tos(), realm); again: @@ -429,7 +429,7 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads) goto again; } - SAFE_FREE(sitename); + TALLOC_FREE(sitename); return status; } @@ -464,7 +464,7 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads) if ( ads_try_connect(ads, server, false) ) { SAFE_FREE(ip_list); - SAFE_FREE(sitename); + TALLOC_FREE(sitename); return NT_STATUS_OK; } @@ -481,7 +481,7 @@ static NTSTATUS ads_find_dc(ADS_STRUCT *ads) if (sitename) { DEBUG(1,("ads_find_dc: failed to find a valid DC on our site (%s), " "trying to find another DC\n", sitename)); - SAFE_FREE(sitename); + TALLOC_FREE(sitename); namecache_delete(realm, 0x1C); goto again; } @@ -563,9 +563,9 @@ ADS_STATUS ads_connect_gc(ADS_STRUCT *ads) if (!realm) realm = lp_realm(); - if ((sitename = sitename_fetch(realm)) == NULL) { + if ((sitename = sitename_fetch(frame, realm)) == NULL) { ads_lookup_site(); - sitename = sitename_fetch(realm); + sitename = sitename_fetch(frame, realm); } dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL); @@ -581,8 +581,6 @@ ADS_STATUS ads_connect_gc(ADS_STRUCT *ads) realm, sitename, &gcs_list, &num_gcs); - SAFE_FREE(sitename); - if (!NT_STATUS_IS_OK(nt_status)) { ads_status = ADS_ERROR_NT(nt_status); goto done; @@ -618,7 +616,6 @@ ADS_STATUS ads_connect_gc(ADS_STRUCT *ads) } while (!done); done: - SAFE_FREE(sitename); talloc_destroy(frame); return ads_status; diff --git a/source3/libads/sitename_cache.c b/source3/libads/sitename_cache.c index cb1bae5..b064aea 100644 --- a/source3/libads/sitename_cache.c +++ b/source3/libads/sitename_cache.c @@ -79,7 +79,7 @@ bool sitename_store(const char *realm, const char *sitename) Caller must free. ****************************************************************************/ -char *sitename_fetch(const char *realm) +char *sitename_fetch(TALLOC_CTX *mem_ctx, const char *realm) { char *sitename = NULL; time_t timeout; @@ -95,7 +95,7 @@ char *sitename_fetch(const char *realm) key = sitename_key(query_realm); - ret = gencache_get( key, &sitename, &timeout ); + ret = gencache_get( key, mem_ctx, &sitename, &timeout ); SAFE_FREE(key); if ( !ret ) { DEBUG(5,("sitename_fetch: No stored sitename for %s\n", @@ -122,7 +122,7 @@ bool stored_sitename_changed(const char *realm, const char *sitename) return False; } - new_sitename = sitename_fetch(realm); + new_sitename = sitename_fetch(talloc_tos(), realm); if (sitename && new_sitename && !strequal(sitename, new_sitename)) { ret = True; @@ -130,7 +130,7 @@ bool stored_sitename_changed(const char *realm, const char *sitename) (!sitename && new_sitename)) { ret = True; } - SAFE_FREE(new_sitename); + TALLOC_FREE(new_sitename); return ret; } diff --git a/source3/libads/sitename_cache.h b/source3/libads/sitename_cache.h index 4e62f00..9044964 100644 --- a/source3/libads/sitename_cache.h +++ b/source3/libads/sitename_cache.h @@ -22,7 +22,7 @@ #define _LIBADS_SITENAME_CACHE_H_ bool sitename_store(const char *realm, const char *sitename); -char *sitename_fetch(const char *realm); +char *sitename_fetch(TALLOC_CTX *mem_ctx, const char *realm); bool stored_sitename_changed(const char *realm, const char *sitename); #endif /* _LIBADS_SITENAME_CACHE_H_ */ diff --git a/source3/libsmb/conncache.c b/source3/libsmb/conncache.c index 6635318..9bf4c56 100644 --- a/source3/libsmb/conncache.c +++ b/source3/libsmb/conncache.c @@ -143,13 +143,13 @@ NTSTATUS check_negative_conn_cache( const char *domain, const char *server) if (key == NULL) goto done; - if (gencache_get(key, &value, NULL)) + if (gencache_get(key, talloc_tos(), &value, NULL)) result = negative_conn_cache_valuedecode(value); done: DEBUG(9,("check_negative_conn_cache returning result %d for domain %s " "server %s\n", NT_STATUS_V(result), domain, server)); TALLOC_FREE(key); - SAFE_FREE(value); + TALLOC_FREE(value); return result; } diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c index 6818b01..71995fd 100644 --- a/source3/libsmb/dsgetdcname.c +++ b/source3/libsmb/dsgetdcname.c @@ -334,12 +334,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx, return NT_STATUS_NO_MEMORY; } - if (!gencache_get_data_blob(key, &blob, NULL, NULL)) { + if (!gencache_get_data_blob(key, NULL, &blob, NULL, NULL)) { return NT_STATUS_NOT_FOUND; } info = talloc_zero(mem_ctx, struct netr_DsRGetDCNameInfo); if (!info) { + data_blob_free(&blob); return NT_STATUS_NO_MEMORY; } @@ -1184,7 +1185,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, bool retry_query_with_null = false; if ((site_name == NULL) || (site_name[0] == '\0')) { - ptr_to_free = sitename_fetch(domain_name); + ptr_to_free = sitename_fetch(mem_ctx, domain_name); if (ptr_to_free != NULL) { retry_query_with_null = true; } @@ -1201,7 +1202,7 @@ NTSTATUS dsgetdcname(TALLOC_CTX *mem_ctx, flags, info); - SAFE_FREE(ptr_to_free); + TALLOC_FREE(ptr_to_free); if (!NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { return status; diff --git a/source3/libsmb/namecache.c b/source3/libsmb/namecache.c index 8571dfa..1e61584 100644 --- a/source3/libsmb/namecache.c +++ b/source3/libsmb/namecache.c @@ -156,7 +156,7 @@ bool namecache_fetch(const char *name, return False; } - if (!gencache_get(key, &value, &timeout)) { + if (!gencache_get(key, talloc_tos(), &value, &timeout)) { DEBUG(5, ("no entry for %s#%02X found.\n", name, name_type)); SAFE_FREE(key); return False; @@ -170,7 +170,7 @@ bool namecache_fetch(const char *name, *num_names = ipstr_list_parse(value, ip_list); SAFE_FREE(key); - SAFE_FREE(value); + TALLOC_FREE(value); return *num_names > 0; /* true only if some ip has been fetched */ } @@ -294,7 +294,7 @@ bool namecache_status_fetch(const char *keyname, if (!key) return False; - if (!gencache_get(key, &value, &timeout)) { + if (!gencache_get(key, talloc_tos(), &value, &timeout)) { DEBUG(5, ("namecache_status_fetch: no entry for %s found.\n", key)); SAFE_FREE(key); @@ -306,6 +306,6 @@ bool namecache_status_fetch(const char *keyname, strlcpy(srvname_out, value, 16); SAFE_FREE(key); - SAFE_FREE(value); + TALLOC_FREE(value); return True; } diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index d86c0ed..f2fffde 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -165,7 +165,7 @@ bool saf_delete( const char *domain ) /**************************************************************************** ****************************************************************************/ -char *saf_fetch( const char *domain ) +char *saf_fetch(TALLOC_CTX *mem_ctx, const char *domain ) { char *server = NULL; time_t timeout; @@ -183,7 +183,7 @@ char *saf_fetch( const char *domain ) return NULL; } - ret = gencache_get( key, &server, &timeout ); + ret = gencache_get( key, mem_ctx, &server, &timeout ); -- Samba Shared Repository