summaryrefslogtreecommitdiff
path: root/main/utils.c
diff options
context:
space:
mode:
authorLuigi Rizzo <rizzo@icir.org>2006-11-28 14:07:09 +0000
committerLuigi Rizzo <rizzo@icir.org>2006-11-28 14:07:09 +0000
commit5e7aebf9aca6395c8dd74e02a4d4d4ae78c9dc82 (patch)
tree1641521d3383d73897fe9472ea7cbf1101f8070f /main/utils.c
parent29985ff8c3f5fcfc7dae6a74e07286419e07fa83 (diff)
some simplifications to
ast_dynamic_str_thread_build_va_couldnt_we_choose_a_shorter_name() I am unsure whether the truncation of the string in case of a failed attempt should be done unconditionally. See the XXX mark. Russel, ideas ? git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48084 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/utils.c')
-rw-r--r--main/utils.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/main/utils.c b/main/utils.c
index aa621704a..5d1855448 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -975,27 +975,29 @@ int ast_get_time_t(const char *src, time_t *dst, time_t _default, int *consumed)
int ast_dynamic_str_thread_build_va(struct ast_dynamic_str **buf, size_t max_len,
struct ast_threadstorage *ts, int append, const char *fmt, va_list ap)
{
- int res;
+ int res, need;
int offset = (append && (*buf)->len) ? strlen((*buf)->str) : 0;
res = vsnprintf((*buf)->str + offset, (*buf)->len - offset, fmt, ap);
+ need = res + offset + 1;
/* Check to see if there was not enough space in the string buffer to prepare
* the string. Also, if a maximum length is present, make sure the current
* length is less than the maximum before increasing the size. */
- if ((res + offset + 1) > (*buf)->len && (max_len ? ((*buf)->len < max_len) : 1)) {
+ if (need > (*buf)->len && (max_len == 0 || (*buf)->len < max_len) ) {
/* Set the new size of the string buffer to be the size needed
* to hold the resulting string (res) plus one byte for the
* terminating '\0'. If this size is greater than the max, set
* the new length to be the maximum allowed. */
- if (max_len)
- (*buf)->len = ((res + offset + 1) < max_len) ? (res + offset + 1) : max_len;
- else
- (*buf)->len = res + offset + 1;
+ if (max_len && max_len < need)
+ need = max_len;
- if (!(*buf = ast_realloc(*buf, (*buf)->len + sizeof(*(*buf)))))
+ *buf = ast_realloc(*buf, need + sizeof(struct ast_dynamic_str));
+ if (*buf == NULL)
return AST_DYNSTR_BUILD_FAILED;
+ (*buf)->len = need;
+ /* Truncate the previous attempt. XXX this should be unconditional */
if (append)
(*buf)->str[offset] = '\0';