summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/talloc.c40
-rw-r--r--source3/lib/tdb_multikey.c15
2 files changed, 49 insertions, 6 deletions
diff --git a/source3/lib/talloc.c b/source3/lib/talloc.c
index 0e223e8bbe..35c4ddaf31 100644
--- a/source3/lib/talloc.c
+++ b/source3/lib/talloc.c
@@ -1136,6 +1136,46 @@ char *talloc_asprintf(const void *t, const char *fmt, ...)
return ret;
}
+int talloc_vasprintf_len(const void *t, char **res, const char *fmt,
+ va_list ap)
+{
+ int len;
+ va_list ap2;
+ char c;
+
+ VA_COPY(ap2, ap);
+
+ /* this call looks strange, but it makes it work on older solaris boxes */
+ if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) {
+ return len;
+ }
+
+ *res = (char *)_talloc(t, len+1);
+ if (*res) {
+ VA_COPY(ap2, ap);
+ vsnprintf(*res, len+1, fmt, ap2);
+ talloc_set_name_const(*res, *res);
+ }
+
+ return len;
+}
+
+
+/*
+ Perform string formatting, and return a pointer to newly allocated
+ memory holding the result, inside a memory pool.
+ */
+int talloc_asprintf_len(const void *t, char **res, const char *fmt, ...)
+{
+ va_list ap;
+ int len;
+
+ va_start(ap, fmt);
+ len = talloc_vasprintf_len(t, res, fmt, ap);
+ va_end(ap);
+ return len;
+}
+
/**
* Realloc @p s to append the formatted result of @p fmt and @p ap,
diff --git a/source3/lib/tdb_multikey.c b/source3/lib/tdb_multikey.c
index e8febd6f7b..7701845a9e 100644
--- a/source3/lib/tdb_multikey.c
+++ b/source3/lib/tdb_multikey.c
@@ -140,13 +140,14 @@ NTSTATUS tdb_find_keyed(TALLOC_CTX *ctx, struct tdb_context *tdb,
prim.dptr = data.dptr = NULL;
- key.dptr = talloc_asprintf(ctx, "KEY/%d/%s", keynumber, value);
+ key.dsize = talloc_asprintf_len(ctx, &key.dptr, "KEY/%d/%s", keynumber,
+ value);
if (key.dptr == NULL) {
DEBUG(0, ("talloc_asprintf failed\n"));
status = NT_STATUS_NO_MEMORY;
goto fail;
}
- key.dsize = strlen(key.dptr)+1;
+ key.dsize += 1;
prim = tdb_fetch(tdb, key);
if (prim.dptr == NULL) {
@@ -214,13 +215,14 @@ static NTSTATUS set_keys(struct tdb_context *tdb,
NTSTATUS status;
TDB_DATA key;
- key.dptr = talloc_asprintf(keys, "KEY/%d/%s", i, keys[i]);
+ key.dsize = talloc_asprintf_len(keys, &key.dptr, "KEY/%d/%s",
+ i, keys[i]);
if (key.dptr == NULL) {
DEBUG(0, ("talloc_asprintf failed\n"));
TALLOC_FREE(keys);
return NT_STATUS_NO_MEMORY;
}
- key.dsize = strlen(key.dptr)+1;
+ key.dsize += 1;
if (tdb_store(tdb, key, primary_key, TDB_INSERT) < 0) {
status = map_ntstatus_from_tdb(tdb);
@@ -273,13 +275,14 @@ static NTSTATUS del_keys(struct tdb_context *tdb,
NTSTATUS status;
TDB_DATA key;
- key.dptr = talloc_asprintf(keys, "KEY/%d/%s", i, keys[i]);
+ key.dsize = talloc_asprintf_len(keys, &key.dptr, "KEY/%d/%s",
+ i, keys[i]);
if (key.dptr == NULL) {
DEBUG(0, ("talloc_asprintf failed\n"));
TALLOC_FREE(keys);
return NT_STATUS_NO_MEMORY;
}
- key.dsize = strlen(key.dptr)+1;
+ key.dsize += 1;
if (tdb_delete(tdb, key) < 0) {
status = map_ntstatus_from_tdb(tdb);