aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2017-03-28 16:57:41 +0200
committerRichard Levitte <levitte@openssl.org>2017-03-29 16:16:25 +0200
commit1e53a9fd1ad1260274065c12d0e9efbabb7d94e1 (patch)
tree12c644de597b66cf7543eb78a38fa2c9882ed4fb
parent6edc71456463f66008b9cf40dadf00aba037f8da (diff)
downloadopenssl-1e53a9fd1ad1260274065c12d0e9efbabb7d94e1.tar.gz
Add z modifier parsing to the BIO_printf et all format string
Reviewed-by: Andy Polyakov <appro@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3064)
-rw-r--r--CHANGES4
-rw-r--r--crypto/bio/b_print.c13
-rw-r--r--include/openssl/bio.h14
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)));