diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/talloc.c | 40 | ||||
-rw-r--r-- | source3/lib/tdb_multikey.c | 15 |
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); |