]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
crypto/bio/bio_print.c: add 't' (ptrdiff_t) length modifier
authorEugene Syromiatnikov <esyr@openssl.org>
Thu, 14 Aug 2025 17:04:32 +0000 (19:04 +0200)
committerNeil Horman <nhorman@openssl.org>
Fri, 29 Aug 2025 16:18:30 +0000 (12:18 -0400)
As specified by POSIX.1-2001 and C99.

Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>
Reviewed-by: Saša Nedvědický <sashan@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28177)

crypto/bio/bio_print.c

index d08b37370faf461dd40e942c7f042901bf8a25e7..f8031743ac1fd3eb39a8887a7ad8713d7d28de27 100644 (file)
@@ -74,6 +74,7 @@ static int _dopr(char **sbuffer, char **buffer,
 #define DP_C_LDOUBLE    4
 #define DP_C_LLONG      5
 #define DP_C_SIZE       6
+#define DP_C_PTRDIFF    7
 
 /* Floating point formats */
 #define F_FORMAT        0
@@ -216,6 +217,10 @@ _dopr(char **sbuffer,
                 cflags = DP_C_SIZE;
                 ch = *format++;
                 break;
+            case 't':
+                cflags = DP_C_PTRDIFF;
+                ch = *format++;
+                break;
             default:
                 break;
             }
@@ -241,6 +246,9 @@ _dopr(char **sbuffer,
                 case DP_C_SIZE:
                     value = va_arg(args, ossl_ssize_t);
                     break;
+                case DP_C_PTRDIFF:
+                    value = va_arg(args, ptrdiff_t);
+                    break;
                 default:
                     value = va_arg(args, int);
                     break;
@@ -272,6 +280,17 @@ _dopr(char **sbuffer,
                 case DP_C_SIZE:
                     value = va_arg(args, size_t);
                     break;
+                case DP_C_PTRDIFF:
+                    /*
+                     * There is no unsigned variant of ptrdiff_t, and POSIX
+                     * requires using a "corresponding unsigned type argument".
+                     * Assuming it is power of two in size, at least.
+                     */
+                    if (sizeof(ptrdiff_t) == sizeof(uint64_t))
+                        value = va_arg(args, uint64_t);
+                    else
+                        value = va_arg(args, unsigned int);
+                    break;
                 default:
                     value = va_arg(args, unsigned int);
                     break;