Add z modifier parsing to the BIO_printf et all format string
authorRichard Levitte <levitte@openssl.org>
Tue, 28 Mar 2017 14:57:41 +0000 (16:57 +0200)
committerRichard Levitte <levitte@openssl.org>
Wed, 29 Mar 2017 14:16:25 +0000 (16:16 +0200)
Reviewed-by: Andy Polyakov <appro@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3064)

CHANGES
crypto/bio/b_print.c
include/openssl/bio.h

diff --git a/CHANGES b/CHANGES
index 2cdd03a..d6a09b0 100644 (file)
--- 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]
index e91ab6d..86aec79 100644 (file)
@@ -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;
index 0cf095e..6585ec0 100644 (file)
@@ -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)));