From 1e53a9fd1ad1260274065c12d0e9efbabb7d94e1 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 28 Mar 2017 16:57:41 +0200 Subject: [PATCH] Add z modifier parsing to the BIO_printf et all format string Reviewed-by: Andy Polyakov (Merged from https://github.com/openssl/openssl/pull/3064) --- CHANGES | 4 ++++ crypto/bio/b_print.c | 13 ++++++++++++- include/openssl/bio.h | 14 ++++++++++---- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 2cdd03a832..d6a09b00e2 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changes between 1.1.0e and 1.1.1 [xx XXX xxxx] + *) Add the z modifier parsing to BIO_printf() et al formatting string, + to be used for size_t and ssize_t (ossl_ssize_t). + [Richard Levitte] + *) Add EC_KEY_get0_engine(), which does for EC_KEY what RSA_get0_engine() does for RSA, etc. [Richard Levitte] diff --git a/crypto/bio/b_print.c b/crypto/bio/b_print.c index e91ab6de22..86aec79e44 100644 --- a/crypto/bio/b_print.c +++ b/crypto/bio/b_print.c @@ -89,6 +89,7 @@ static int _dopr(char **sbuffer, char **buffer, #define DP_C_LONG 2 #define DP_C_LDOUBLE 3 #define DP_C_LLONG 4 +#define DP_C_SIZE 5 /* Floating point formats */ #define F_FORMAT 0 @@ -214,6 +215,10 @@ _dopr(char **sbuffer, cflags = DP_C_LDOUBLE; ch = *format++; break; + case 'z': + cflags = DP_C_SIZE; + ch = *format++; + break; default: break; } @@ -233,6 +238,9 @@ _dopr(char **sbuffer, case DP_C_LLONG: value = va_arg(args, LLONG); break; + case DP_C_SIZE: + value = va_arg(args, ossl_ssize_t); + break; default: value = va_arg(args, int); break; @@ -253,11 +261,14 @@ _dopr(char **sbuffer, value = (unsigned short int)va_arg(args, unsigned int); break; case DP_C_LONG: - value = (LLONG) va_arg(args, unsigned long int); + value = (LLONG)va_arg(args, unsigned long int); break; case DP_C_LLONG: value = va_arg(args, unsigned LLONG); break; + case DP_C_SIZE: + value = (ossl_ssize_t)va_arg(args, size_t); + break; default: value = (LLONG) va_arg(args, unsigned int); break; diff --git a/include/openssl/bio.h b/include/openssl/bio.h index 0cf095e1f9..6585ec03b4 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -724,10 +724,16 @@ void BIO_copy_next_retry(BIO *b); * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); */ -# ifdef __GNUC__ -# define __bio_h__attr__ __attribute__ -# else -# define __bio_h__attr__(x) +# define __bio_h__attr__(x) +# if defined(__GNUC__) && defined(__STDC_VERSION__) + /* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +# if __STDC_VERSION__ >= 199901L +# undef __bio_h__attr__ +# define __bio_h__attr__ __attribute__ +# endif # endif int BIO_printf(BIO *bio, const char *format, ...) __bio_h__attr__((__format__(__printf__, 2, 3))); -- GitLab