1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

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 commit is contained in:
Andrew Bartlett 2006-02-22 09:28:58 +00:00 committed by Gerald (Jerry) Carter
parent d5b467b7c1
commit 424df1bb36
4 changed files with 45 additions and 8 deletions

View File

@ -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;
}
}

View File

@ -198,6 +198,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
*/
@ -212,6 +230,20 @@ int ldb_msg_add_string(struct ldb_message *msg,
return ldb_msg_add_value(msg, attr_name, &val);
}
/*
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
*/

View File

@ -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,

View File

@ -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);
}
/*