From b57294eff7af0774b207b5e34c3cfcf0aa080a6d Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Wed, 20 Nov 2019 17:47:54 -0600 Subject: [PATCH] Fix for vasprintf with AIX --- src/ssl.c | 4 +-- wolfssl/wolfcrypt/types.h | 52 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 32727a0ee..2ae379dc3 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -26,7 +26,7 @@ #include #if defined(OPENSSL_EXTRA) && !defined(_WIN32) - /* turn on GNU extensions for vasprintf with wolfSSL_BIO_printf */ + /* turn on GNU extensions for XVASPRINTF with wolfSSL_BIO_printf */ #undef _GNU_SOURCE #define _GNU_SOURCE #endif @@ -26151,7 +26151,7 @@ int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...) case WOLFSSL_BIO_SSL: { char* pt = NULL; - ret = vasprintf(&pt, format, args); + ret = XVASPRINTF(&pt, format, args); if (ret > 0 && pt != NULL) { wolfSSL_BIO_write(bio, pt, ret); } diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index 16d7bb01e..3d6f1e752 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -493,6 +493,58 @@ #endif /* _MSC_VER || __CYGWIN__ || __MINGW32__ */ #endif /* USE_WINDOWS_API */ + /* XVASPRINTF is used in ssl.c for wolfSSL_BIO_printf */ + #if (defined(sun) || defined(__sun) || defined(_AIX)) + #include + static WC_INLINE + int xvasprintf(char **ret, const char *format, va_list args) + { + int count; + char *buffer; + va_list copy; + va_copy(copy, args); + + *ret = NULL; + + count = vsnprintf(NULL, 0, format, args); + if (count >= 0) + { + buffer = malloc(count + 1); + if (buffer == NULL) + { + count = -1; + } + else + { + count = vsnprintf(buffer, count + 1, format, copy); + if (count < 0) + { + free(buffer); + count = -1; + } + else + { + *ret = buffer; + } + } + } + va_end(copy); + + return count; + } + #define XVASPRINTF xvasprintf + #else + #ifndef XVASPRINTF + #if defined(NO_FILESYSTEM) && (defined(OPENSSL_EXTRA) || \ + defined(HAVE_PKCS7)) && !defined(NO_STDIO_FILESYSTEM) + /* case where stdio is not included else where but is needed + for vasprintf */ + #include + #endif + #define XVASPRINTF vasprintf + #endif + #endif /* defined(sun) || defined(__sun) || defined(_AIX) */ + #if defined(WOLFSSL_CERT_EXT) || defined(HAVE_ALPN) /* use only Thread Safe version of strtok */ #if defined(USE_WOLF_STRTOK)