X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=apps%2Fengine.c;h=5d4708207ef28261650f1c9df208b0b48f6a8d7d;hp=61fb758b409dec54b8b4afa2ac0def6e7d728a8f;hb=b2ac85adac85f95af999df96367872d38068b028;hpb=9a0953ed768571d2c6077b9698be718cc9a8a367 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; }