X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fbio%2Fb_print.c;h=a7741f0915cc50a67435ba3e7b658b654cc397a8;hp=d52ad7cdf5befcafc832b4d1380314333177f1b8;hb=018fcbec38509cd03fb0709904a382c3bfcf5ed4;hpb=1b62d880b5190de8c49a01837d96501cecf2a111 diff --git a/crypto/bio/b_print.c b/crypto/bio/b_print.c index d52ad7cdf5..a7741f0915 100644 --- a/crypto/bio/b_print.c +++ b/crypto/bio/b_print.c @@ -10,20 +10,10 @@ #include #include #include -#include +#include "internal/numbers.h" #include "internal/cryptlib.h" -#ifndef NO_SYS_TYPES_H -# include -#endif -#include /* To get BN_LLONG properly defined */ #include -#if defined(BN_LLONG) || defined(SIXTY_FOUR_BIT) -# ifndef HAVE_LONG_LONG -# define HAVE_LONG_LONG 1 -# endif -#endif - /* * Copyright Patrick Powell 1995 * This code is based on code written by Patrick Powell @@ -37,20 +27,10 @@ # define LDOUBLE double #endif -#ifdef HAVE_LONG_LONG -# if defined(_WIN32) && !defined(__GNUC__) -# define LLONG __int64 -# else -# define LLONG long long -# endif -#else -# define LLONG long -#endif - static int fmtstr(char **, char **, size_t *, size_t *, const char *, int, int, int); static int fmtint(char **, char **, size_t *, size_t *, - LLONG, int, int, int, int); + int64_t, int, int, int, int); static int fmtfp(char **, char **, size_t *, size_t *, LDOUBLE, int, int, int, int); static int doapr_outch(char **, char **, size_t *, size_t *, int); @@ -89,6 +69,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 @@ -106,7 +87,7 @@ _dopr(char **sbuffer, size_t *retlen, int *truncated, const char *format, va_list args) { char ch; - LLONG value; + int64_t value; LDOUBLE fvalue; char *strvalue; int min; @@ -207,6 +188,7 @@ _dopr(char **sbuffer, ch = *format++; break; case 'q': + case 'j': cflags = DP_C_LLONG; ch = *format++; break; @@ -214,6 +196,10 @@ _dopr(char **sbuffer, cflags = DP_C_LDOUBLE; ch = *format++; break; + case 'z': + cflags = DP_C_SIZE; + ch = *format++; + break; default: break; } @@ -231,7 +217,10 @@ _dopr(char **sbuffer, value = va_arg(args, long int); break; case DP_C_LLONG: - value = va_arg(args, LLONG); + value = va_arg(args, int64_t); + break; + case DP_C_SIZE: + value = va_arg(args, ossl_ssize_t); break; default: value = va_arg(args, int); @@ -253,13 +242,16 @@ _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 = va_arg(args, unsigned long int); break; case DP_C_LLONG: - value = va_arg(args, unsigned LLONG); + value = va_arg(args, uint64_t); + break; + case DP_C_SIZE: + value = va_arg(args, size_t); break; default: - value = (LLONG) va_arg(args, unsigned int); + value = va_arg(args, unsigned int); break; } if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, @@ -278,6 +270,7 @@ _dopr(char **sbuffer, break; case 'E': flags |= DP_F_UP; + /* fall thru */ case 'e': if (cflags == DP_C_LDOUBLE) fvalue = va_arg(args, LDOUBLE); @@ -289,6 +282,7 @@ _dopr(char **sbuffer, break; case 'G': flags |= DP_F_UP; + /* fall thru */ case 'g': if (cflags == DP_C_LDOUBLE) fvalue = va_arg(args, LDOUBLE); @@ -321,20 +315,8 @@ _dopr(char **sbuffer, value, 16, min, max, flags | DP_F_NUM)) return 0; break; - case 'n': /* XXX */ - if (cflags == DP_C_SHORT) { - short int *num; - num = va_arg(args, short int *); - *num = currlen; - } else if (cflags == DP_C_LONG) { /* XXX */ - long int *num; - num = va_arg(args, long int *); - *num = (long int)currlen; - } else if (cflags == DP_C_LLONG) { /* XXX */ - LLONG *num; - num = va_arg(args, LLONG *); - *num = (LLONG) currlen; - } else { + case 'n': + { int *num; num = va_arg(args, int *); *num = currlen; @@ -363,9 +345,15 @@ _dopr(char **sbuffer, break; } } - *truncated = (currlen > *maxlen - 1); - if (*truncated) - currlen = *maxlen - 1; + /* + * We have to truncate if there is no dynamic buffer and we have filled the + * static buffer. + */ + if (buffer == NULL) { + *truncated = (currlen > *maxlen - 1); + if (*truncated) + currlen = *maxlen - 1; + } if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0')) return 0; *retlen = currlen - 1; @@ -385,28 +373,37 @@ fmtstr(char **sbuffer, if (value == 0) value = ""; - strln = strlen(value); - if (strln > INT_MAX) - strln = INT_MAX; + strln = OPENSSL_strnlen(value, max < 0 ? SIZE_MAX : (size_t)max); padlen = min - strln; if (min < 0 || padlen < 0) padlen = 0; + if (max >= 0) { + /* + * Calculate the maximum output including padding. + * Make sure max doesn't overflow into negativity + */ + if (max < INT_MAX - padlen) + max += padlen; + else + max = INT_MAX; + } if (flags & DP_F_MINUS) padlen = -padlen; - while ((padlen > 0) && (cnt < max)) { + while ((padlen > 0) && (max < 0 || cnt < max)) { if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) return 0; --padlen; ++cnt; } - while (*value && (cnt < max)) { + while (strln > 0 && (max < 0 || cnt < max)) { if(!doapr_outch(sbuffer, buffer, currlen, maxlen, *value++)) return 0; + --strln; ++cnt; } - while ((padlen < 0) && (cnt < max)) { + while ((padlen < 0) && (max < 0 || cnt < max)) { if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) return 0; ++padlen; @@ -419,11 +416,11 @@ static int fmtint(char **sbuffer, char **buffer, size_t *currlen, - size_t *maxlen, LLONG value, int base, int min, int max, int flags) + size_t *maxlen, int64_t value, int base, int min, int max, int flags) { int signvalue = 0; const char *prefix = ""; - unsigned LLONG uvalue; + uint64_t uvalue; char convert[DECIMAL_SIZE(value) + 3]; int place = 0; int spadlen = 0; @@ -436,7 +433,7 @@ fmtint(char **sbuffer, if (!(flags & DP_F_UNSIGNED)) { if (value < 0) { signvalue = '-'; - uvalue = -value; + uvalue = 0 - (uint64_t)value; } else if (flags & DP_F_PLUS) signvalue = '+'; else if (flags & DP_F_SPACE)