diff options
Diffstat (limited to 'xrdb.c')
-rw-r--r-- | xrdb.c | 25 |
1 files changed, 12 insertions, 13 deletions
@@ -168,25 +168,24 @@ asprintf(char **ret, const char *format, ...) if (len < 0) return -1; + *ret = malloc(len + 1); /* snprintf doesn't count trailing '\0' */ + if (*ret == NULL) + return -1; + if (len < sizeof(buf)) { - *ret = strdup(buf); + memcpy(*ret, buf, len + 1); } else { - *ret = malloc(len + 1); /* snprintf doesn't count trailing '\0' */ - if (*ret != NULL) { - va_start(ap, format); - len = vsnprintf(*ret, len + 1, format, ap); - va_end(ap); - if (len < 0) { - free(*ret); - *ret = NULL; - } + va_start(ap, format); + len = vsnprintf(*ret, len + 1, format, ap); + va_end(ap); + if (len < 0) { + free(*ret); + *ret = NULL; + return -1; } } - if (*ret == NULL) - return -1; - return len; } #endif /* HAVE_ASPRINTF */ |