diff --git a/CHANGES b/CHANGES index 2cdd03a8329a4cd45d24646e4f9513459bd90cee..d6a09b00e2fca96d9b7f36d85ed7308bcd20029b 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 e91ab6de229525f3141b9b4d2b8200df2543e69a..86aec79e4430ef79f5dfe1e6696d1b41c4867251 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 0cf095e1f9105a81cb1e51a43fb66aaf242edee8..6585ec03b4fee24a0e115bd4b48046bd168ca643 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)));