From: Pauli Date: Wed, 5 Jul 2017 22:03:58 +0000 (+1000) Subject: Rework the append_buf function X-Git-Tag: OpenSSL_1_1_1-pre1~1102 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=b2ac85adac85f95af999df96367872d38068b028 Rework the append_buf function It won't overflow the buffer and will allocate new buffers sufficiently large to hold new strings longer than the expansion factor. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/3847) --- diff --git a/apps/engine.c b/apps/engine.c index 61fb758b40..5d4708207e 100644 --- a/apps/engine.c +++ b/apps/engine.c @@ -48,28 +48,38 @@ const OPTIONS engine_options[] = { static int append_buf(char **buf, int *size, const char *s) { - if (*buf == NULL) { - *size = 256; - *buf = app_malloc(*size, "engine buffer"); - **buf = '\0'; - } + const int expand = 256; + int len = strlen(s) + 1; + char *p = *buf; + + if (p == NULL) { + *size = ((len + expand - 1) / expand) * expand; + p = *buf = app_malloc(*size, "engine buffer"); + } else { + const int blen = strlen(p); + + if (blen > 0) + len += 2 + blen; + + if (len > *size) { + *size = ((len + expand - 1) / expand) * expand; + p = OPENSSL_realloc(p, *size); + if (p == NULL) { + OPENSSL_free(*buf); + *buf = NULL; + return 0; + } + *buf = p; + } - if (strlen(*buf) + strlen(s) >= (unsigned int)*size) { - char *tmp; - *size += 256; - tmp = OPENSSL_realloc(*buf, *size); - if (tmp == NULL) { - OPENSSL_free(*buf); - *buf = NULL; - return 0; + if (blen > 0) { + p += blen; + *p++ = ','; + *p++ = ' '; } - *buf = tmp; } - if (**buf != '\0') - strcat(*buf, ", "); - strcat(*buf, s); - + strcpy(p, s); return 1; }