summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/b_print.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio/b_print.c')
-rw-r--r--src/lib/libcrypto/bio/b_print.c230
1 files changed, 182 insertions, 48 deletions
diff --git a/src/lib/libcrypto/bio/b_print.c b/src/lib/libcrypto/bio/b_print.c
index 2a5e8b58c9..b11b501512 100644
--- a/src/lib/libcrypto/bio/b_print.c
+++ b/src/lib/libcrypto/bio/b_print.c
@@ -64,6 +64,8 @@
64#include <stdarg.h> 64#include <stdarg.h>
65#include <string.h> 65#include <string.h>
66#include <ctype.h> 66#include <ctype.h>
67#include <assert.h>
68#include <limits.h>
67#include "cryptlib.h" 69#include "cryptlib.h"
68#ifndef NO_SYS_TYPES_H 70#ifndef NO_SYS_TYPES_H
69#include <sys/types.h> 71#include <sys/types.h>
@@ -72,12 +74,16 @@
72 74
73#ifdef BN_LLONG 75#ifdef BN_LLONG
74# ifndef HAVE_LONG_LONG 76# ifndef HAVE_LONG_LONG
75# define HAVE_LONG_LONG 77# define HAVE_LONG_LONG 1
76# endif 78# endif
77#endif 79#endif
78 80
79static void dopr (char *buffer, size_t maxlen, size_t *retlen, 81static void dopr (char *buffer, size_t maxlen, size_t *retlen,
80 const char *format, va_list args); 82 const char *format, va_list args);
83#ifdef USE_ALLOCATING_PRINT
84static void doapr (char **buffer, size_t *retlen,
85 const char *format, va_list args);
86#endif
81 87
82int BIO_printf (BIO *bio, ...) 88int BIO_printf (BIO *bio, ...)
83 { 89 {
@@ -85,15 +91,32 @@ int BIO_printf (BIO *bio, ...)
85 char *format; 91 char *format;
86 int ret; 92 int ret;
87 size_t retlen; 93 size_t retlen;
94#ifdef USE_ALLOCATING_PRINT
95 char *hugebuf;
96#else
88 MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */ 97 MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */
98#endif
89 99
90 va_start(args, bio); 100 va_start(args, bio);
91 format=va_arg(args, char *); 101 format=va_arg(args, char *);
92 102
103#ifndef USE_ALLOCATING_PRINT
93 hugebuf[0]='\0'; 104 hugebuf[0]='\0';
94 dopr(hugebuf, sizeof(hugebuf), &retlen, format, args); 105 dopr(hugebuf, sizeof(hugebuf), &retlen, format, args);
95 ret=BIO_write(bio, hugebuf, (int)retlen); 106#else
107 hugebuf = NULL;
108 CRYPTO_push_info("doapr()");
109 doapr(&hugebuf, &retlen, format, args);
110 if (hugebuf)
111 {
112#endif
113 ret=BIO_write(bio, hugebuf, (int)retlen);
96 114
115#ifdef USE_ALLOCATING_PRINT
116 Free(hugebuf);
117 }
118 CRYPTO_pop_info();
119#endif
97 va_end(args); 120 va_end(args);
98 return(ret); 121 return(ret);
99 } 122 }
@@ -131,10 +154,26 @@ int BIO_printf (BIO *bio, ...)
131#define LLONG long 154#define LLONG long
132#endif 155#endif
133 156
134static void fmtstr (char *, size_t *, size_t, char *, int, int, int); 157static void fmtstr (void (*)(char **, size_t *, size_t *, int),
135static void fmtint (char *, size_t *, size_t, LLONG, int, int, int, int); 158 char **, size_t *, size_t *, const char *, int, int,
136static void fmtfp (char *, size_t *, size_t, LDOUBLE, int, int, int); 159 int);
137static void dopr_outch (char *, size_t *, size_t, int); 160static void fmtint (void (*)(char **, size_t *, size_t *, int),
161 char **, size_t *, size_t *, LLONG, int, int, int, int);
162static void fmtfp (void (*)(char **, size_t *, size_t *, int),
163 char **, size_t *, size_t *, LDOUBLE, int, int, int);
164#ifndef USE_ALLOCATING_PRINT
165static int dopr_isbig (size_t, size_t);
166static int dopr_copy (size_t);
167static void dopr_outch (char **, size_t *, size_t *, int);
168#else
169static int doapr_isbig (size_t, size_t);
170static int doapr_copy (size_t);
171static void doapr_outch (char **, size_t *, size_t *, int);
172#endif
173static void _dopr(void (*)(char **, size_t *, size_t *, int),
174 int (*)(size_t, size_t), int (*)(size_t),
175 char **buffer, size_t *maxlen, size_t *retlen,
176 const char *format, va_list args);
138 177
139/* format read states */ 178/* format read states */
140#define DP_S_DEFAULT 0 179#define DP_S_DEFAULT 0
@@ -165,6 +204,7 @@ static void dopr_outch (char *, size_t *, size_t, int);
165#define char_to_int(p) (p - '0') 204#define char_to_int(p) (p - '0')
166#define MAX(p,q) ((p >= q) ? p : q) 205#define MAX(p,q) ((p >= q) ? p : q)
167 206
207#ifndef USE_ALLOCATING_PRINT
168static void 208static void
169dopr( 209dopr(
170 char *buffer, 210 char *buffer,
@@ -173,6 +213,35 @@ dopr(
173 const char *format, 213 const char *format,
174 va_list args) 214 va_list args)
175{ 215{
216 _dopr(dopr_outch, dopr_isbig, dopr_copy,
217 &buffer, &maxlen, retlen, format, args);
218}
219
220#else
221static void
222doapr(
223 char **buffer,
224 size_t *retlen,
225 const char *format,
226 va_list args)
227{
228 size_t dummy_maxlen = 0;
229 _dopr(doapr_outch, doapr_isbig, doapr_copy,
230 buffer, &dummy_maxlen, retlen, format, args);
231}
232#endif
233
234static void
235_dopr(
236 void (*outch_fn)(char **, size_t *, size_t *, int),
237 int (*isbig_fn)(size_t, size_t),
238 int (*copy_fn)(size_t),
239 char **buffer,
240 size_t *maxlen,
241 size_t *retlen,
242 const char *format,
243 va_list args)
244{
176 char ch; 245 char ch;
177 LLONG value; 246 LLONG value;
178 LDOUBLE fvalue; 247 LDOUBLE fvalue;
@@ -190,7 +259,7 @@ dopr(
190 ch = *format++; 259 ch = *format++;
191 260
192 while (state != DP_S_DONE) { 261 while (state != DP_S_DONE) {
193 if ((ch == '\0') || (currlen >= maxlen)) 262 if ((ch == '\0') || (*isbig_fn)(currlen, *maxlen))
194 state = DP_S_DONE; 263 state = DP_S_DONE;
195 264
196 switch (state) { 265 switch (state) {
@@ -198,7 +267,7 @@ dopr(
198 if (ch == '%') 267 if (ch == '%')
199 state = DP_S_FLAGS; 268 state = DP_S_FLAGS;
200 else 269 else
201 dopr_outch(buffer, &currlen, maxlen, ch); 270 (*outch_fn)(buffer, &currlen, maxlen, ch);
202 ch = *format++; 271 ch = *format++;
203 break; 272 break;
204 case DP_S_FLAGS: 273 case DP_S_FLAGS:
@@ -304,7 +373,8 @@ dopr(
304 value = va_arg(args, int); 373 value = va_arg(args, int);
305 break; 374 break;
306 } 375 }
307 fmtint(buffer, &currlen, maxlen, value, 10, min, max, flags); 376 fmtint(outch_fn, buffer, &currlen, maxlen,
377 value, 10, min, max, flags);
308 break; 378 break;
309 case 'X': 379 case 'X':
310 flags |= DP_F_UP; 380 flags |= DP_F_UP;
@@ -329,7 +399,7 @@ dopr(
329 unsigned int); 399 unsigned int);
330 break; 400 break;
331 } 401 }
332 fmtint(buffer, &currlen, maxlen, value, 402 fmtint(outch_fn, buffer, &currlen, maxlen, value,
333 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), 403 ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
334 min, max, flags); 404 min, max, flags);
335 break; 405 break;
@@ -338,7 +408,8 @@ dopr(
338 fvalue = va_arg(args, LDOUBLE); 408 fvalue = va_arg(args, LDOUBLE);
339 else 409 else
340 fvalue = va_arg(args, double); 410 fvalue = va_arg(args, double);
341 fmtfp(buffer, &currlen, maxlen, fvalue, min, max, flags); 411 fmtfp(outch_fn, buffer, &currlen, maxlen,
412 fvalue, min, max, flags);
342 break; 413 break;
343 case 'E': 414 case 'E':
344 flags |= DP_F_UP; 415 flags |= DP_F_UP;
@@ -357,19 +428,19 @@ dopr(
357 fvalue = va_arg(args, double); 428 fvalue = va_arg(args, double);
358 break; 429 break;
359 case 'c': 430 case 'c':
360 dopr_outch(buffer, &currlen, maxlen, 431 (*outch_fn)(buffer, &currlen, maxlen,
361 va_arg(args, int)); 432 va_arg(args, int));
362 break; 433 break;
363 case 's': 434 case 's':
364 strvalue = va_arg(args, char *); 435 strvalue = va_arg(args, char *);
365 if (max < 0) 436 if (max < 0)
366 max = maxlen; 437 max = (*copy_fn)(*maxlen);
367 fmtstr(buffer, &currlen, maxlen, strvalue, 438 fmtstr(outch_fn, buffer, &currlen, maxlen, strvalue,
368 flags, min, max); 439 flags, min, max);
369 break; 440 break;
370 case 'p': 441 case 'p':
371 value = (long)va_arg(args, void *); 442 value = (long)va_arg(args, void *);
372 fmtint(buffer, &currlen, maxlen, 443 fmtint(outch_fn, buffer, &currlen, maxlen,
373 value, 16, min, max, flags); 444 value, 16, min, max, flags);
374 break; 445 break;
375 case 'n': /* XXX */ 446 case 'n': /* XXX */
@@ -392,7 +463,7 @@ dopr(
392 } 463 }
393 break; 464 break;
394 case '%': 465 case '%':
395 dopr_outch(buffer, &currlen, maxlen, ch); 466 (*outch_fn)(buffer, &currlen, maxlen, ch);
396 break; 467 break;
397 case 'w': 468 case 'w':
398 /* not supported yet, treat as next char */ 469 /* not supported yet, treat as next char */
@@ -413,19 +484,20 @@ dopr(
413 break; 484 break;
414 } 485 }
415 } 486 }
416 if (currlen >= maxlen - 1) 487 if (currlen >= *maxlen - 1)
417 currlen = maxlen - 1; 488 currlen = *maxlen - 1;
418 buffer[currlen] = '\0'; 489 (*buffer)[currlen] = '\0';
419 *retlen = currlen; 490 *retlen = currlen;
420 return; 491 return;
421} 492}
422 493
423static void 494static void
424fmtstr( 495fmtstr(
425 char *buffer, 496 void (*outch_fn)(char **, size_t *, size_t *, int),
497 char **buffer,
426 size_t *currlen, 498 size_t *currlen,
427 size_t maxlen, 499 size_t *maxlen,
428 char *value, 500 const char *value,
429 int flags, 501 int flags,
430 int min, 502 int min,
431 int max) 503 int max)
@@ -444,16 +516,16 @@ fmtstr(
444 padlen = -padlen; 516 padlen = -padlen;
445 517
446 while ((padlen > 0) && (cnt < max)) { 518 while ((padlen > 0) && (cnt < max)) {
447 dopr_outch(buffer, currlen, maxlen, ' '); 519 (*outch_fn)(buffer, currlen, maxlen, ' ');
448 --padlen; 520 --padlen;
449 ++cnt; 521 ++cnt;
450 } 522 }
451 while (*value && (cnt < max)) { 523 while (*value && (cnt < max)) {
452 dopr_outch(buffer, currlen, maxlen, *value++); 524 (*outch_fn)(buffer, currlen, maxlen, *value++);
453 ++cnt; 525 ++cnt;
454 } 526 }
455 while ((padlen < 0) && (cnt < max)) { 527 while ((padlen < 0) && (cnt < max)) {
456 dopr_outch(buffer, currlen, maxlen, ' '); 528 (*outch_fn)(buffer, currlen, maxlen, ' ');
457 ++padlen; 529 ++padlen;
458 ++cnt; 530 ++cnt;
459 } 531 }
@@ -461,9 +533,10 @@ fmtstr(
461 533
462static void 534static void
463fmtint( 535fmtint(
464 char *buffer, 536 void (*outch_fn)(char **, size_t *, size_t *, int),
537 char **buffer,
465 size_t *currlen, 538 size_t *currlen,
466 size_t maxlen, 539 size_t *maxlen,
467 LLONG value, 540 LLONG value,
468 int base, 541 int base,
469 int min, 542 int min,
@@ -517,28 +590,28 @@ fmtint(
517 590
518 /* spaces */ 591 /* spaces */
519 while (spadlen > 0) { 592 while (spadlen > 0) {
520 dopr_outch(buffer, currlen, maxlen, ' '); 593 (*outch_fn)(buffer, currlen, maxlen, ' ');
521 --spadlen; 594 --spadlen;
522 } 595 }
523 596
524 /* sign */ 597 /* sign */
525 if (signvalue) 598 if (signvalue)
526 dopr_outch(buffer, currlen, maxlen, signvalue); 599 (*outch_fn)(buffer, currlen, maxlen, signvalue);
527 600
528 /* zeros */ 601 /* zeros */
529 if (zpadlen > 0) { 602 if (zpadlen > 0) {
530 while (zpadlen > 0) { 603 while (zpadlen > 0) {
531 dopr_outch(buffer, currlen, maxlen, '0'); 604 (*outch_fn)(buffer, currlen, maxlen, '0');
532 --zpadlen; 605 --zpadlen;
533 } 606 }
534 } 607 }
535 /* digits */ 608 /* digits */
536 while (place > 0) 609 while (place > 0)
537 dopr_outch(buffer, currlen, maxlen, convert[--place]); 610 (*outch_fn)(buffer, currlen, maxlen, convert[--place]);
538 611
539 /* left justified spaces */ 612 /* left justified spaces */
540 while (spadlen < 0) { 613 while (spadlen < 0) {
541 dopr_outch(buffer, currlen, maxlen, ' '); 614 (*outch_fn)(buffer, currlen, maxlen, ' ');
542 ++spadlen; 615 ++spadlen;
543 } 616 }
544 return; 617 return;
@@ -577,9 +650,10 @@ round(LDOUBLE value)
577 650
578static void 651static void
579fmtfp( 652fmtfp(
580 char *buffer, 653 void (*outch_fn)(char **, size_t *, size_t *, int),
654 char **buffer,
581 size_t *currlen, 655 size_t *currlen,
582 size_t maxlen, 656 size_t *maxlen,
583 LDOUBLE fvalue, 657 LDOUBLE fvalue,
584 int min, 658 int min,
585 int max, 659 int max,
@@ -657,54 +731,114 @@ fmtfp(
657 731
658 if ((flags & DP_F_ZERO) && (padlen > 0)) { 732 if ((flags & DP_F_ZERO) && (padlen > 0)) {
659 if (signvalue) { 733 if (signvalue) {
660 dopr_outch(buffer, currlen, maxlen, signvalue); 734 (*outch_fn)(buffer, currlen, maxlen, signvalue);
661 --padlen; 735 --padlen;
662 signvalue = 0; 736 signvalue = 0;
663 } 737 }
664 while (padlen > 0) { 738 while (padlen > 0) {
665 dopr_outch(buffer, currlen, maxlen, '0'); 739 (*outch_fn)(buffer, currlen, maxlen, '0');
666 --padlen; 740 --padlen;
667 } 741 }
668 } 742 }
669 while (padlen > 0) { 743 while (padlen > 0) {
670 dopr_outch(buffer, currlen, maxlen, ' '); 744 (*outch_fn)(buffer, currlen, maxlen, ' ');
671 --padlen; 745 --padlen;
672 } 746 }
673 if (signvalue) 747 if (signvalue)
674 dopr_outch(buffer, currlen, maxlen, signvalue); 748 (*outch_fn)(buffer, currlen, maxlen, signvalue);
675 749
676 while (iplace > 0) 750 while (iplace > 0)
677 dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]); 751 (*outch_fn)(buffer, currlen, maxlen, iconvert[--iplace]);
678 752
679 /* 753 /*
680 * Decimal point. This should probably use locale to find the correct 754 * Decimal point. This should probably use locale to find the correct
681 * char to print out. 755 * char to print out.
682 */ 756 */
683 if (max > 0) { 757 if (max > 0) {
684 dopr_outch(buffer, currlen, maxlen, '.'); 758 (*outch_fn)(buffer, currlen, maxlen, '.');
685 759
686 while (fplace > 0) 760 while (fplace > 0)
687 dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]); 761 (*outch_fn)(buffer, currlen, maxlen, fconvert[--fplace]);
688 } 762 }
689 while (zpadlen > 0) { 763 while (zpadlen > 0) {
690 dopr_outch(buffer, currlen, maxlen, '0'); 764 (*outch_fn)(buffer, currlen, maxlen, '0');
691 --zpadlen; 765 --zpadlen;
692 } 766 }
693 767
694 while (padlen < 0) { 768 while (padlen < 0) {
695 dopr_outch(buffer, currlen, maxlen, ' '); 769 (*outch_fn)(buffer, currlen, maxlen, ' ');
696 ++padlen; 770 ++padlen;
697 } 771 }
698} 772}
699 773
774static int
775dopr_copy(
776 size_t len)
777{
778 return len;
779}
780
781#ifdef USE_ALLOCATING_PRINT
782static int
783doapr_copy(
784 size_t len)
785{
786 /* Return as high an integer as possible */
787 return INT_MAX;
788}
789#endif
790
791static int
792dopr_isbig(
793 size_t currlen,
794 size_t maxlen)
795{
796 return currlen > maxlen;
797}
798
799#ifdef USE_ALLOCATING_PRINT
800static int
801doapr_isbig(
802 size_t currlen,
803 size_t maxlen)
804{
805 return 0;
806}
807#endif
808
700static void 809static void
701dopr_outch( 810dopr_outch(
702 char *buffer, 811 char **buffer,
703 size_t *currlen, 812 size_t *currlen,
704 size_t maxlen, 813 size_t *maxlen,
814 int c)
815{
816 if (*currlen < *maxlen)
817 (*buffer)[(*currlen)++] = (char)c;
818 return;
819}
820
821#ifdef USE_ALLOCATING_PRINT
822static void
823doapr_outch(
824 char **buffer,
825 size_t *currlen,
826 size_t *maxlen,
705 int c) 827 int c)
706{ 828{
707 if (*currlen < maxlen) 829 if (*buffer == NULL) {
708 buffer[(*currlen)++] = (char)c; 830 if (*maxlen == 0)
831 *maxlen = 1024;
832 *buffer = Malloc(*maxlen);
833 }
834 while (*currlen >= *maxlen) {
835 *maxlen += 1024;
836 *buffer = Realloc(*buffer, *maxlen);
837 }
838 /* What to do if *buffer is NULL? */
839 assert(*buffer != NULL);
840
841 (*buffer)[(*currlen)++] = (char)c;
709 return; 842 return;
710} 843}
844#endif