[SCM] Samba Shared Repository - branch v3-6-test updated

Volker Lendecke vlendec at samba.org
Mon Nov 29 05:10:11 MST 2010


The branch, v3-6-test has been updated
       via  357377d s3: Properly print binary values "net cache"
       via  6662a18 s3: Add gencache_iterate_blobs
       via  576cefd s3: Convert gencache_get_data_blob to gencache_parse
       via  f0e470d s3: Add gencache_parse
       via  9c66cff s3: Use localtime_r, libreplace defines it
       via  262dd7d libwbclient: Correctly order the wbcAllocateMemory args
       via  e0a080d libwbclient: Fix a division by zero
      from  19d20dc s3:winbind correct a copy&paste error

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 357377d309a05bb8b54d04944a0bd43b8414868d
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 28 13:14:38 2010 +0100

    s3: Properly print binary values "net cache"
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sun Nov 28 15:03:26 CET 2010 on sn-devel-104

commit 6662a18f8b0fc02c9018983758ee74811a807925
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 15:48:21 2010 +0100

    s3: Add gencache_iterate_blobs

commit 576cefdd5e5887d08cc9fa380e5de986e1c6c898
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 11:36:52 2010 +0100

    s3: Convert gencache_get_data_blob to gencache_parse

commit f0e470d82aea84cc4c3e19e7b0bb533bbbfd29bc
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 00:40:25 2010 +0100

    s3: Add gencache_parse

commit 9c66cff6cbd19ffd58983748b32f8d44d20f8ef1
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 19:52:11 2010 +0100

    s3: Use localtime_r, libreplace defines it
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sat Nov 27 20:50:27 CET 2010 on sn-devel-104

commit 262dd7d6215d1b5d6570bf3e602f343183f0e63d
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 19:07:40 2010 +0100

    libwbclient: Correctly order the wbcAllocateMemory args
    
    In these cases, it does not make a functional difference.
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sat Nov 27 19:56:02 CET 2010 on sn-devel-104

commit e0a080dcfaea689272a3dad41e9f9e33bae266bd
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 27 19:02:33 2010 +0100

    libwbclient: Fix a division by zero
    
    If wbinfo -r returns no groups, wbcAllocateMemory divides by zero

-----------------------------------------------------------------------

Summary of changes:
 nsswitch/libwbclient/wbc_pam.c  |   10 +-
 nsswitch/libwbclient/wbc_pwd.c  |    2 +-
 nsswitch/libwbclient/wbc_util.c |   12 +-
 source3/include/proto.h         |    7 +
 source3/lib/gencache.c          |  298 ++++++++++++++++++++++++---------------
 source3/utils/net_cache.c       |   48 ++++---
 6 files changed, 232 insertions(+), 145 deletions(-)


Changeset truncated at 500 lines:

diff --git a/nsswitch/libwbclient/wbc_pam.c b/nsswitch/libwbclient/wbc_pam.c
index 50524d2..1c0f792 100644
--- a/nsswitch/libwbclient/wbc_pam.c
+++ b/nsswitch/libwbclient/wbc_pam.c
@@ -87,7 +87,7 @@ static wbcErr wbc_create_auth_info(const struct winbindd_response *resp,
 	uint32_t j;
 
 	i = (struct wbcAuthUserInfo *)wbcAllocateMemory(
-		sizeof(struct wbcAuthUserInfo), 1,
+		1, sizeof(struct wbcAuthUserInfo),
 		wbcAuthUserInfoDestructor);
 	BAIL_ON_PTR_ERROR(i, wbc_status);
 
@@ -248,7 +248,7 @@ static wbcErr wbc_create_error_info(const struct winbindd_response *resp,
 	struct wbcAuthErrorInfo *e;
 
 	e = (struct wbcAuthErrorInfo *)wbcAllocateMemory(
-		sizeof(struct wbcAuthErrorInfo), 1,
+		1, sizeof(struct wbcAuthErrorInfo),
 		wbcAuthErrorInfoDestructor);
 	BAIL_ON_PTR_ERROR(e, wbc_status);
 
@@ -275,7 +275,7 @@ static wbcErr wbc_create_password_policy_info(const struct winbindd_response *re
 	struct wbcUserPasswordPolicyInfo *i;
 
 	i = (struct wbcUserPasswordPolicyInfo *)wbcAllocateMemory(
-		sizeof(struct wbcUserPasswordPolicyInfo), 1, NULL);
+		1, sizeof(struct wbcUserPasswordPolicyInfo), NULL);
 	BAIL_ON_PTR_ERROR(i, wbc_status);
 
 	i->min_passwordage	= resp->data.auth.policy.min_passwordage;
@@ -306,7 +306,7 @@ static wbcErr wbc_create_logon_info(struct winbindd_response *resp,
 	struct wbcLogonUserInfo *i;
 
 	i = (struct wbcLogonUserInfo *)wbcAllocateMemory(
-		sizeof(struct wbcLogonUserInfo), 1,
+		1, sizeof(struct wbcLogonUserInfo),
 		wbcLogonUserInfoDestructor);
 	BAIL_ON_PTR_ERROR(i, wbc_status);
 
@@ -1243,7 +1243,7 @@ wbcErr wbcCredentialCache(struct wbcCredentialCacheParams *params,
 	}
 
 	result = (struct wbcCredentialCacheInfo *)wbcAllocateMemory(
-		sizeof(struct wbcCredentialCacheInfo), 1,
+		1, sizeof(struct wbcCredentialCacheInfo),
 		wbcCredentialCacheInfoDestructor);
 	if (result == NULL) {
 		status = WBC_ERR_NO_MEMORY;
diff --git a/nsswitch/libwbclient/wbc_pwd.c b/nsswitch/libwbclient/wbc_pwd.c
index 1527808..abd03d7 100644
--- a/nsswitch/libwbclient/wbc_pwd.c
+++ b/nsswitch/libwbclient/wbc_pwd.c
@@ -605,7 +605,7 @@ wbcErr wbcGetGroups(const char *account,
 	BAIL_ON_WBC_ERROR(wbc_status);
 
 	groups = (gid_t *)wbcAllocateMemory(
-		sizeof(gid_t), response.data.num_entries, NULL);
+		response.data.num_entries, sizeof(gid_t), NULL);
 	BAIL_ON_PTR_ERROR(groups, wbc_status);
 
 	for (i = 0; i < response.data.num_entries; i++) {
diff --git a/nsswitch/libwbclient/wbc_util.c b/nsswitch/libwbclient/wbc_util.c
index 75b0093..e2e657a 100644
--- a/nsswitch/libwbclient/wbc_util.c
+++ b/nsswitch/libwbclient/wbc_util.c
@@ -74,7 +74,7 @@ wbcErr wbcInterfaceDetails(struct wbcInterfaceDetails **_details)
 	ZERO_STRUCT(response);
 
 	info = (struct wbcInterfaceDetails *)wbcAllocateMemory(
-		sizeof(struct wbcInterfaceDetails), 1,
+		1, sizeof(struct wbcInterfaceDetails),
 		wbcInterfaceDetailsDestructor);
 	BAIL_ON_PTR_ERROR(info, wbc_status);
 
@@ -173,7 +173,7 @@ wbcErr wbcDomainInfo(const char *domain, struct wbcDomainInfo **dinfo)
 	BAIL_ON_WBC_ERROR(wbc_status);
 
 	info = (struct wbcDomainInfo *)wbcAllocateMemory(
-		sizeof(struct wbcDomainInfo), 1, wbcDomainInfoDestructor);
+		1, sizeof(struct wbcDomainInfo), wbcDomainInfoDestructor);
 	BAIL_ON_PTR_ERROR(info, wbc_status);
 
 	info->short_name = strdup(response.data.domain_info.name);
@@ -442,7 +442,7 @@ wbcErr wbcListTrusts(struct wbcDomainInfo **domains, size_t *num_domains)
 	}
 
 	d_list = (struct wbcDomainInfo *)wbcAllocateMemory(
-		sizeof(struct wbcDomainInfo), response.data.num_entries + 1,
+		response.data.num_entries + 1,sizeof(struct wbcDomainInfo),
 		wbcDomainInfoListDestructor);
 	BAIL_ON_PTR_ERROR(d_list, wbc_status);
 
@@ -511,7 +511,7 @@ wbcErr wbcLookupDomainController(const char *domain,
 	request.flags = flags;
 
 	dc = (struct wbcDomainControllerInfo *)wbcAllocateMemory(
-		sizeof(struct wbcDomainControllerInfo), 1,
+		 1, sizeof(struct wbcDomainControllerInfo),
 		wbcDomainControllerInfoDestructor);
 	BAIL_ON_PTR_ERROR(dc, wbc_status);
 
@@ -554,7 +554,7 @@ static wbcErr wbc_create_domain_controller_info_ex(const struct winbindd_respons
 	struct wbcGuid guid;
 
 	i = (struct wbcDomainControllerInfoEx *)wbcAllocateMemory(
-		sizeof(struct wbcDomainControllerInfoEx), 1,
+		1, sizeof(struct wbcDomainControllerInfoEx),
 		wbcDomainControllerInfoExDestructor);
 	BAIL_ON_PTR_ERROR(i, wbc_status);
 
@@ -698,7 +698,7 @@ wbcErr wbcAddNamedBlob(size_t *num_blobs,
 	 * wbcNamedBlobDestructor
 	 */
 	blobs = (struct wbcNamedBlob *)wbcAllocateMemory(
-		sizeof(struct wbcNamedBlob), *num_blobs + 2,
+		*num_blobs + 2, sizeof(struct wbcNamedBlob),
 		wbcNamedBlobDestructor);
 
 	if (*pblobs != NULL) {
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 33017aa..c1840a4 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -595,10 +595,17 @@ void pull_file_id_24(char *buf, struct file_id *id);
 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_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,
 			    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);
+void gencache_iterate_blobs(void (*fn)(const char *key, DATA_BLOB value,
+				       time_t timeout, void *private_data),
+			    void *private_data, const char *pattern);
 void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
                       void* data, const char* keystr_pattern);
 
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index 8d2ddb2..db0b179 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -274,6 +274,10 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
 	time_t res;
 	char *endptr;
 
+	if (val == NULL) {
+		return false;
+	}
+
 	res = strtol(val, &endptr, 10);
 
 	if ((endptr == NULL) || (*endptr != '/')) {
@@ -289,69 +293,124 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
 	return true;
 }
 
-/**
- * Get existing entry from the cache file.
- *
- * @param keystr string that represents a key of this entry
- * @param blob DATA_BLOB that is filled with entry's blob
- * @param timeout pointer to a time_t that is filled with entry's
- *        timeout
- *
- * @retval true when entry is successfuly fetched
- * @retval False for failure
- **/
+struct gencache_parse_state {
+	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,
-			    time_t *timeout, bool *was_expired)
+static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
 {
-	TDB_DATA databuf;
+	struct gencache_parse_state *state;
+	DATA_BLOB blob;
 	time_t t;
 	char *endptr;
-	bool expired = false;
+	bool ret;
 
-	if (keystr == NULL) {
-		goto fail;
+	if (data.dptr == NULL) {
+		return -1;
+	}
+	ret = gencache_pull_timeout((char *)data.dptr, &t, &endptr);
+	if (!ret) {
+		return -1;
 	}
+	state = (struct gencache_parse_state *)private_data;
+	blob = data_blob_const(
+		endptr+1, data.dsize - PTR_DIFF(endptr+1, data.dptr));
+	state->parser(t, blob, state->private_data);
+	return 0;
+}
+
+bool gencache_parse(const char *keystr,
+		    void (*parser)(time_t timeout, DATA_BLOB blob,
+				   void *private_data),
+		    void *private_data)
+{
+	struct gencache_parse_state state;
+	TDB_DATA key;
+	int ret;
 
+	if (keystr == NULL) {
+		return false;
+	}
 	if (tdb_data_cmp(string_term_tdb_data(keystr),
 			 last_stabilize_key()) == 0) {
-		DEBUG(10, ("Can't get %s as a key\n", keystr));
-		goto fail;
+		return false;
 	}
-
 	if (!gencache_init()) {
-		goto fail;
+		return false;
 	}
 
-	databuf = tdb_fetch_bystring(cache_notrans, keystr);
+	key = string_term_tdb_data(keystr);
+	state.parser = parser;
+	state.private_data = private_data;
 
-	if (databuf.dptr == NULL) {
-		databuf = tdb_fetch_bystring(cache, keystr);
+	ret = tdb_parse_record(cache_notrans, key, gencache_parse_fn, &state);
+	if (ret != -1) {
+		return true;
 	}
+	ret = tdb_parse_record(cache, key, gencache_parse_fn, &state);
+	return (ret != -1);
+}
 
-	if (databuf.dptr == NULL) {
-		DEBUG(10, ("Cache entry with key = %s couldn't be found \n",
-			   keystr));
-		goto fail;
-	}
+struct gencache_get_data_blob_state {
+	DATA_BLOB *blob;
+	time_t timeout;
+	bool result;
+};
 
-	if (!gencache_pull_timeout((char *)databuf.dptr, &t, &endptr)) {
-		SAFE_FREE(databuf.dptr);
-		goto fail;
+static void gencache_get_data_blob_parser(time_t timeout, DATA_BLOB blob,
+					  void *private_data)
+{
+	struct gencache_get_data_blob_state *state =
+		(struct gencache_get_data_blob_state *)private_data;
+
+	if (timeout == 0) {
+		state->result = false;
+		return;
 	}
+	state->timeout = timeout;
 
-	DEBUG(10, ("Returning %s cache entry: key = %s, value = %s, "
-		   "timeout = %s", t > time(NULL) ? "valid" :
-		   "expired", keystr, endptr+1, ctime(&t)));
+	if (state->blob == NULL) {
+		state->result = true;
+		return;
+	}
 
-	if (t == 0) {
-		/* Deleted */
-		SAFE_FREE(databuf.dptr);
-		goto fail;
+	*state->blob = data_blob(blob.data, blob.length);
+	if (state->blob->data == NULL) {
+		state->result = false;
+		return;
 	}
+	state->result = true;
+}
+
+/**
+ * Get existing entry from the cache file.
+ *
+ * @param keystr string that represents a key of this entry
+ * @param blob DATA_BLOB that is filled with entry's blob
+ * @param timeout pointer to a time_t that is filled with entry's
+ *        timeout
+ *
+ * @retval true when entry is successfuly fetched
+ * @retval False for failure
+ **/
+
+bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
+			    time_t *timeout, bool *was_expired)
+{
+	struct gencache_get_data_blob_state state;
+	bool expired = false;
 
-	if (t <= time(NULL)) {
+	state.result = false;
+	state.blob = blob;
 
+	if (!gencache_parse(keystr, gencache_get_data_blob_parser, &state)) {
+		goto fail;
+	}
+	if (!state.result) {
+		goto fail;
+	}
+	if (state.timeout <= time(NULL)) {
 		/*
 		 * We're expired, delete the entry. We can't use gencache_del
 		 * here, because that uses gencache_get_data_blob for checking
@@ -359,28 +418,11 @@ bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
 		 * directly store an empty value with 0 timeout.
 		 */
 		gencache_set(keystr, "", 0);
-
-		SAFE_FREE(databuf.dptr);
-
 		expired = true;
 		goto fail;
 	}
-
-	if (blob != NULL) {
-		*blob = data_blob(
-			endptr+1,
-			databuf.dsize - PTR_DIFF(endptr+1, databuf.dptr));
-		if (blob->data == NULL) {
-			SAFE_FREE(databuf.dptr);
-			DEBUG(0, ("memdup failed\n"));
-			goto fail;
-		}
-	}
-
-	SAFE_FREE(databuf.dptr);
-
 	if (timeout) {
-		*timeout = t;
+		*timeout = state.timeout;
 	}
 
 	return True;
@@ -593,42 +635,27 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout)
 	return gencache_set_data_blob(keystr, &blob, timeout);
 }
 
-/**
- * Iterate through all entries which key matches to specified pattern
- *
- * @param fn pointer to the function that will be supplied with each single
- *        matching cache entry (key, value and timeout) as an arguments
- * @param data void pointer to an arbitrary data that is passed directly to the fn
- *        function on each call
- * @param keystr_pattern pattern the existing entries' keys are matched to
- *
- **/
-
-struct gencache_iterate_state {
-	void (*fn)(const char *key, const char *value, time_t timeout,
-		   void *priv);
+struct gencache_iterate_blobs_state {
+	void (*fn)(const char *key, DATA_BLOB value,
+		   time_t timeout, void *private_data);
 	const char *pattern;
-	void *priv;
+	void *private_data;
 	bool in_persistent;
 };
 
-static int gencache_iterate_fn(struct tdb_context *tdb, TDB_DATA key,
-			       TDB_DATA value, void *priv)
+static int gencache_iterate_blobs_fn(struct tdb_context *tdb, TDB_DATA key,
+				     TDB_DATA data, void *priv)
 {
-	struct gencache_iterate_state *state =
-		(struct gencache_iterate_state *)priv;
+	struct gencache_iterate_blobs_state *state =
+		(struct gencache_iterate_blobs_state *)priv;
 	char *keystr;
 	char *free_key = NULL;
-	char *valstr;
-	char *free_val = NULL;
-	unsigned long u;
 	time_t timeout;
-	char *timeout_endp;
+	char *endptr;
 
 	if (tdb_data_cmp(key, last_stabilize_key()) == 0) {
 		return 0;
 	}
-
 	if (state->in_persistent && tdb_exists(cache_notrans, key)) {
 		return 0;
 	}
@@ -641,62 +668,103 @@ static int gencache_iterate_fn(struct tdb_context *tdb, TDB_DATA key,
 		free_key = keystr;
 	}
 
-	if ((value.dptr == NULL) || (value.dsize <= TIMEOUT_LEN)) {
+	if (!gencache_pull_timeout((char *)data.dptr, &timeout, &endptr)) {
 		goto done;
 	}
+	endptr += 1;
 
 	if (fnmatch(state->pattern, keystr, 0) != 0) {
 		goto done;
 	}
 
-	if (value.dptr[value.dsize-1] == '\0') {
-		valstr = (char *)value.dptr;
-	} else {
-		/* ensure 0-termination */
-		valstr = SMB_STRNDUP((char *)value.dptr, value.dsize);
-		free_val = valstr;
-	}
-
-	u = strtoul(valstr, &timeout_endp, 10);
-
-	if ((*timeout_endp != '/') || ((timeout_endp-valstr) != TIMEOUT_LEN)) {
-		goto done;
-	}
-
-	timeout = u;
-	timeout_endp += 1;
+	DEBUG(10, ("Calling function with arguments (key=%s, timeout=%s)\n",
+		   keystr, ctime(&timeout)));
 
-	DEBUG(10, ("Calling function with arguments "
-		   "(key = %s, value = %s, timeout = %s)\n",
-		   keystr, timeout_endp, ctime(&timeout)));
-	state->fn(keystr, timeout_endp, timeout, state->priv);
+	state->fn(keystr,
+		  data_blob_const(endptr,
+				  data.dsize - PTR_DIFF(endptr, data.dptr)),
+		  timeout, state->private_data);
 
  done:
 	SAFE_FREE(free_key);
-	SAFE_FREE(free_val);
 	return 0;
 }
 
-void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
-                      void* data, const char* keystr_pattern)
+void gencache_iterate_blobs(void (*fn)(const char *key, DATA_BLOB value,
+				       time_t timeout, void *private_data),
+			    void *private_data, const char *pattern)
 {
-	struct gencache_iterate_state state;
+	struct gencache_iterate_blobs_state state;
 
-	if ((fn == NULL) || (keystr_pattern == NULL)) {
+	if ((fn == NULL) || (pattern == NULL) || !gencache_init()) {
 		return;
 	}
 
-	if (!gencache_init()) return;
-
-	DEBUG(5, ("Searching cache keys with pattern %s\n", keystr_pattern));
+	DEBUG(5, ("Searching cache keys with pattern %s\n", pattern));
 
 	state.fn = fn;
-	state.pattern = keystr_pattern;
-	state.priv = data;
+	state.pattern = pattern;
+	state.private_data = private_data;
 
 	state.in_persistent = false;
-	tdb_traverse(cache_notrans, gencache_iterate_fn, &state);
+	tdb_traverse(cache_notrans, gencache_iterate_blobs_fn, &state);
 
 	state.in_persistent = true;
-	tdb_traverse(cache, gencache_iterate_fn, &state);
+	tdb_traverse(cache, gencache_iterate_blobs_fn, &state);
+}
+
+/**
+ * Iterate through all entries which key matches to specified pattern
+ *
+ * @param fn pointer to the function that will be supplied with each single
+ *        matching cache entry (key, value and timeout) as an arguments
+ * @param data void pointer to an arbitrary data that is passed directly to the fn
+ *        function on each call
+ * @param keystr_pattern pattern the existing entries' keys are matched to
+ *
+ **/
+
+struct gencache_iterate_state {
+	void (*fn)(const char *key, const char *value, time_t timeout,
+		   void *priv);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list