summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2006-02-22 09:28:58 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:51:59 -0500
commit98c0767677156ff31791bd93f473ac11f856c75a (patch)
tree565141973847ef6633f2159bc25d22975a782228 /source4
parentd590dea10b3abf93fcc8138189291e8b66bae7d7 (diff)
downloadsamba-98c0767677156ff31791bd93f473ac11f856c75a.tar.gz
samba-98c0767677156ff31791bd93f473ac11f856c75a.tar.bz2
samba-98c0767677156ff31791bd93f473ac11f856c75a.zip
r13616: Add new ldb functions: ldb_msg_add_steal_string() and
ldb_msg_add_steal_value(). These try to maintain the talloc heirachy, which must be correct otherwise talloc_steal operations of entire attribute lists fails. This fixes the currentTime value, found by using Microsoft's dcdiag tool (before this commit, it pointed to invalid memory, due to the changes in -r 13606) Andrew Bartlett (This used to be commit 424df1bb369fddcfd358cf26dd0da9d3851d181e)
Diffstat (limited to 'source4')
-rw-r--r--source4/dsdb/samdb/ldb_modules/rootdse.c14
-rw-r--r--source4/lib/ldb/common/ldb_msg.c32
-rw-r--r--source4/lib/ldb/include/ldb.h5
-rw-r--r--source4/lib/ldb/modules/operational.c2
4 files changed, 45 insertions, 8 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/rootdse.c b/source4/dsdb/samdb/ldb_modules/rootdse.c
index 96236301b0..07e34f1841 100644
--- a/source4/dsdb/samdb/ldb_modules/rootdse.c
+++ b/source4/dsdb/samdb/ldb_modules/rootdse.c
@@ -64,8 +64,8 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_request *re
msg->dn = ldb_dn_explode(msg, "");
if (do_attribute(s->attrs, "currentTime")) {
- if (ldb_msg_add_string(msg, "currentTime",
- ldb_timestring(msg, time(NULL))) != 0) {
+ if (ldb_msg_add_steal_string(msg, "currentTime",
+ ldb_timestring(msg, time(NULL))) != 0) {
goto failed;
}
}
@@ -77,8 +77,8 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_request *re
if (!control) {
goto failed;
}
- if (ldb_msg_add_string(msg, "supportedControl",
- control) != 0) {
+ if (ldb_msg_add_steal_string(msg, "supportedControl",
+ control) != 0) {
goto failed;
}
}
@@ -95,12 +95,12 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_request *re
int i;
for (i = 0; ops && ops[i]; i++) {
if (ops[i]->sasl_name) {
- const char *sasl_name = talloc_strdup(msg, ops[i]->sasl_name);
+ char *sasl_name = talloc_strdup(msg, ops[i]->sasl_name);
if (!sasl_name) {
goto failed;
}
- if (ldb_msg_add_string(msg, "supportedSASLMechanisms",
- sasl_name) != 0) {
+ if (ldb_msg_add_steal_string(msg, "supportedSASLMechanisms",
+ sasl_name) != 0) {
goto failed;
}
}
diff --git a/source4/lib/ldb/common/ldb_msg.c b/source4/lib/ldb/common/ldb_msg.c
index 497d2cb0d5..8c59518296 100644
--- a/source4/lib/ldb/common/ldb_msg.c
+++ b/source4/lib/ldb/common/ldb_msg.c
@@ -199,6 +199,24 @@ int ldb_msg_add_value(struct ldb_message *msg,
/*
+ add a value to a message, stealing it into the 'right' place
+*/
+int ldb_msg_add_steal_value(struct ldb_message *msg,
+ const char *attr_name,
+ struct ldb_val *val)
+{
+ int ret;
+ ret = ldb_msg_add_value(msg, attr_name, val);
+ if (ret == LDB_SUCCESS) {
+ struct ldb_message_element *el;
+ el = ldb_msg_find_element(msg, attr_name);
+ talloc_steal(el->values, val->data);
+ }
+ return ret;
+}
+
+
+/*
add a string element to a message
*/
int ldb_msg_add_string(struct ldb_message *msg,
@@ -213,6 +231,20 @@ int ldb_msg_add_string(struct ldb_message *msg,
}
/*
+ add a string element to a message, stealing it into the 'right' place
+*/
+int ldb_msg_add_steal_string(struct ldb_message *msg,
+ const char *attr_name, char *str)
+{
+ struct ldb_val val;
+
+ val.data = (uint8_t *)str;
+ val.length = strlen(str);
+
+ return ldb_msg_add_steal_value(msg, attr_name, &val);
+}
+
+/*
add a printf formatted element to a message
*/
int ldb_msg_add_fmt(struct ldb_message *msg,
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index 8a9e8bea76..488f782c9b 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -1098,6 +1098,11 @@ int ldb_msg_add(struct ldb_message *msg,
int ldb_msg_add_value(struct ldb_message *msg,
const char *attr_name,
const struct ldb_val *val);
+int ldb_msg_add_steal_value(struct ldb_message *msg,
+ const char *attr_name,
+ struct ldb_val *val);
+int ldb_msg_add_steal_string(struct ldb_message *msg,
+ const char *attr_name, char *str);
int ldb_msg_add_string(struct ldb_message *msg,
const char *attr_name, const char *str);
int ldb_msg_add_fmt(struct ldb_message *msg,
diff --git a/source4/lib/ldb/modules/operational.c b/source4/lib/ldb/modules/operational.c
index 3deb9422f3..8b7d6b3518 100644
--- a/source4/lib/ldb/modules/operational.c
+++ b/source4/lib/ldb/modules/operational.c
@@ -86,7 +86,7 @@ static int construct_canonical_name(struct ldb_module *module, struct ldb_messag
if (canonicalName == NULL) {
return -1;
}
- return ldb_msg_add_string(msg, "canonicalName", canonicalName);
+ return ldb_msg_add_steal_string(msg, "canonicalName", canonicalName);
}
/*