View | Details | Raw Unified | Return to bug 40189 | Differences between
and this patch

Collapse All | Expand All

(-)a/crypto/bio/b_print.c (-71 / +116 lines)
 Lines 125-140    Link Here 
125
# define LLONG long
125
# define LLONG long
126
#endif
126
#endif
127
127
128
static void fmtstr(char **, char **, size_t *, size_t *,
128
static int fmtstr(char **, char **, size_t *, size_t *,
129
                   const char *, int, int, int);
129
                  const char *, int, int, int);
130
static void fmtint(char **, char **, size_t *, size_t *,
130
static int fmtint(char **, char **, size_t *, size_t *,
131
                   LLONG, int, int, int, int);
131
                  LLONG, int, int, int, int);
132
static void fmtfp(char **, char **, size_t *, size_t *,
132
static int fmtfp(char **, char **, size_t *, size_t *,
133
                  LDOUBLE, int, int, int);
133
                 LDOUBLE, int, int, int);
134
static void doapr_outch(char **, char **, size_t *, size_t *, int);
134
static int doapr_outch(char **, char **, size_t *, size_t *, int);
135
static void _dopr(char **sbuffer, char **buffer,
135
static int _dopr(char **sbuffer, char **buffer,
136
                  size_t *maxlen, size_t *retlen, int *truncated,
136
                 size_t *maxlen, size_t *retlen, int *truncated,
137
                  const char *format, va_list args);
137
                 const char *format, va_list args);
138
138
139
/* format read states */
139
/* format read states */
140
#define DP_S_DEFAULT    0
140
#define DP_S_DEFAULT    0
 Lines 165-171   static void _dopr(char **sbuffer, char **buffer, Link Here 
165
#define char_to_int(p) (p - '0')
165
#define char_to_int(p) (p - '0')
166
#define OSSL_MAX(p,q) ((p >= q) ? p : q)
166
#define OSSL_MAX(p,q) ((p >= q) ? p : q)
167
167
168
static void
168
static int
169
_dopr(char **sbuffer,
169
_dopr(char **sbuffer,
170
      char **buffer,
170
      char **buffer,
171
      size_t *maxlen,
171
      size_t *maxlen,
 Lines 196-202   _dopr(char **sbuffer, Link Here 
196
            if (ch == '%')
196
            if (ch == '%')
197
                state = DP_S_FLAGS;
197
                state = DP_S_FLAGS;
198
            else
198
            else
199
                doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
199
                if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch))
200
                    return 0;
200
            ch = *format++;
201
            ch = *format++;
201
            break;
202
            break;
202
        case DP_S_FLAGS:
203
        case DP_S_FLAGS:
 Lines 302-309   _dopr(char **sbuffer, Link Here 
302
                    value = va_arg(args, int);
303
                    value = va_arg(args, int);
303
                    break;
304
                    break;
304
                }
305
                }
305
                fmtint(sbuffer, buffer, &currlen, maxlen,
306
                if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10, min,
306
                       value, 10, min, max, flags);
307
                            max, flags))
308
                    return 0;
307
                break;
309
                break;
308
            case 'X':
310
            case 'X':
309
                flags |= DP_F_UP;
311
                flags |= DP_F_UP;
 Lines 326-342   _dopr(char **sbuffer, Link Here 
326
                    value = (LLONG) va_arg(args, unsigned int);
328
                    value = (LLONG) va_arg(args, unsigned int);
327
                    break;
329
                    break;
328
                }
330
                }
329
                fmtint(sbuffer, buffer, &currlen, maxlen, value,
331
                if (!fmtint(sbuffer, buffer, &currlen, maxlen, value,
330
                       ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
332
                            ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
331
                       min, max, flags);
333
                            min, max, flags))
334
                    return 0;
332
                break;
335
                break;
333
            case 'f':
336
            case 'f':
334
                if (cflags == DP_C_LDOUBLE)
337
                if (cflags == DP_C_LDOUBLE)
335
                    fvalue = va_arg(args, LDOUBLE);
338
                    fvalue = va_arg(args, LDOUBLE);
336
                else
339
                else
337
                    fvalue = va_arg(args, double);
340
                    fvalue = va_arg(args, double);
338
                fmtfp(sbuffer, buffer, &currlen, maxlen,
341
                if (!fmtfp(sbuffer, buffer, &currlen, maxlen, fvalue, min, max,
339
                      fvalue, min, max, flags);
342
                           flags))
343
                    return 0;
340
                break;
344
                break;
341
            case 'E':
345
            case 'E':
342
                flags |= DP_F_UP;
346
                flags |= DP_F_UP;
 Lines 355-362   _dopr(char **sbuffer, Link Here 
355
                    fvalue = va_arg(args, double);
359
                    fvalue = va_arg(args, double);
356
                break;
360
                break;
357
            case 'c':
361
            case 'c':
358
                doapr_outch(sbuffer, buffer, &currlen, maxlen,
362
                if(!doapr_outch(sbuffer, buffer, &currlen, maxlen,
359
                            va_arg(args, int));
363
                            va_arg(args, int)))
364
                    return 0;
360
                break;
365
                break;
361
            case 's':
366
            case 's':
362
                strvalue = va_arg(args, char *);
367
                strvalue = va_arg(args, char *);
 Lines 366-378   _dopr(char **sbuffer, Link Here 
366
                    else
371
                    else
367
                        max = *maxlen;
372
                        max = *maxlen;
368
                }
373
                }
369
                fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue,
374
                if (!fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue,
370
                       flags, min, max);
375
                            flags, min, max))
376
                    return 0;
371
                break;
377
                break;
372
            case 'p':
378
            case 'p':
373
                value = (long)va_arg(args, void *);
379
                value = (long)va_arg(args, void *);
374
                fmtint(sbuffer, buffer, &currlen, maxlen,
380
                if (!fmtint(sbuffer, buffer, &currlen, maxlen,
375
                       value, 16, min, max, flags | DP_F_NUM);
381
                            value, 16, min, max, flags | DP_F_NUM))
382
                    return 0;
376
                break;
383
                break;
377
            case 'n':          /* XXX */
384
            case 'n':          /* XXX */
378
                if (cflags == DP_C_SHORT) {
385
                if (cflags == DP_C_SHORT) {
 Lines 394-400   _dopr(char **sbuffer, Link Here 
394
                }
401
                }
395
                break;
402
                break;
396
            case '%':
403
            case '%':
397
                doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
404
                if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch))
405
                    return 0;
398
                break;
406
                break;
399
            case 'w':
407
            case 'w':
400
                /* not supported yet, treat as next char */
408
                /* not supported yet, treat as next char */
 Lines 418-463   _dopr(char **sbuffer, Link Here 
418
    *truncated = (currlen > *maxlen - 1);
426
    *truncated = (currlen > *maxlen - 1);
419
    if (*truncated)
427
    if (*truncated)
420
        currlen = *maxlen - 1;
428
        currlen = *maxlen - 1;
421
    doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
429
    if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'))
430
        return 0;
422
    *retlen = currlen - 1;
431
    *retlen = currlen - 1;
423
    return;
432
    return 1;
424
}
433
}
425
434
426
static void
435
static int
427
fmtstr(char **sbuffer,
436
fmtstr(char **sbuffer,
428
       char **buffer,
437
       char **buffer,
429
       size_t *currlen,
438
       size_t *currlen,
430
       size_t *maxlen, const char *value, int flags, int min, int max)
439
       size_t *maxlen, const char *value, int flags, int min, int max)
431
{
440
{
432
    int padlen, strln;
441
    int padlen;
442
    size_t strln;
433
    int cnt = 0;
443
    int cnt = 0;
434
444
435
    if (value == 0)
445
    if (value == 0)
436
        value = "<NULL>";
446
        value = "<NULL>";
437
    for (strln = 0; value[strln]; ++strln) ;
447
448
    strln = strlen(value);
449
    if (strln > INT_MAX)
450
        strln = INT_MAX;
451
438
    padlen = min - strln;
452
    padlen = min - strln;
439
    if (padlen < 0)
453
    if (min < 0 || padlen < 0)
440
        padlen = 0;
454
        padlen = 0;
441
    if (flags & DP_F_MINUS)
455
    if (flags & DP_F_MINUS)
442
        padlen = -padlen;
456
        padlen = -padlen;
443
457
444
    while ((padlen > 0) && (cnt < max)) {
458
    while ((padlen > 0) && (cnt < max)) {
445
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
459
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
460
            return 0;
446
        --padlen;
461
        --padlen;
447
        ++cnt;
462
        ++cnt;
448
    }
463
    }
449
    while (*value && (cnt < max)) {
464
    while (*value && (cnt < max)) {
450
        doapr_outch(sbuffer, buffer, currlen, maxlen, *value++);
465
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, *value++))
466
            return 0;
451
        ++cnt;
467
        ++cnt;
452
    }
468
    }
453
    while ((padlen < 0) && (cnt < max)) {
469
    while ((padlen < 0) && (cnt < max)) {
454
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
470
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
471
            return 0;
455
        ++padlen;
472
        ++padlen;
456
        ++cnt;
473
        ++cnt;
457
    }
474
    }
475
    return 1;
458
}
476
}
459
477
460
static void
478
static int
461
fmtint(char **sbuffer,
479
fmtint(char **sbuffer,
462
       char **buffer,
480
       char **buffer,
463
       size_t *currlen,
481
       size_t *currlen,
 Lines 517-553   fmtint(char **sbuffer, Link Here 
517
535
518
    /* spaces */
536
    /* spaces */
519
    while (spadlen > 0) {
537
    while (spadlen > 0) {
520
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
538
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
539
            return 0;
521
        --spadlen;
540
        --spadlen;
522
    }
541
    }
523
542
524
    /* sign */
543
    /* sign */
525
    if (signvalue)
544
    if (signvalue)
526
        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
545
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue))
546
            return 0;
527
547
528
    /* prefix */
548
    /* prefix */
529
    while (*prefix) {
549
    while (*prefix) {
530
        doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);
550
        if(!doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix))
551
            return 0;
531
        prefix++;
552
        prefix++;
532
    }
553
    }
533
554
534
    /* zeros */
555
    /* zeros */
535
    if (zpadlen > 0) {
556
    if (zpadlen > 0) {
536
        while (zpadlen > 0) {
557
        while (zpadlen > 0) {
537
            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
558
            if(!doapr_outch(sbuffer, buffer, currlen, maxlen, '0'))
559
                return 0;
538
            --zpadlen;
560
            --zpadlen;
539
        }
561
        }
540
    }
562
    }
541
    /* digits */
563
    /* digits */
542
    while (place > 0)
564
    while (place > 0) {
543
        doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]);
565
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]))
566
            return 0;
567
    }
544
568
545
    /* left justified spaces */
569
    /* left justified spaces */
546
    while (spadlen < 0) {
570
    while (spadlen < 0) {
547
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
571
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
572
            return 0;
548
        ++spadlen;
573
        ++spadlen;
549
    }
574
    }
550
    return;
575
    return 1;
551
}
576
}
552
577
553
static LDOUBLE abs_val(LDOUBLE value)
578
static LDOUBLE abs_val(LDOUBLE value)
 Lines 578-584   static long roundv(LDOUBLE value) Link Here 
578
    return intpart;
603
    return intpart;
579
}
604
}
580
605
581
static void
606
static int
582
fmtfp(char **sbuffer,
607
fmtfp(char **sbuffer,
583
      char **buffer,
608
      char **buffer,
584
      size_t *currlen,
609
      size_t *currlen,
 Lines 657-703   fmtfp(char **sbuffer, Link Here 
657
682
658
    if ((flags & DP_F_ZERO) && (padlen > 0)) {
683
    if ((flags & DP_F_ZERO) && (padlen > 0)) {
659
        if (signvalue) {
684
        if (signvalue) {
660
            doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
685
            if (!doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue))
686
                return 0;
661
            --padlen;
687
            --padlen;
662
            signvalue = 0;
688
            signvalue = 0;
663
        }
689
        }
664
        while (padlen > 0) {
690
        while (padlen > 0) {
665
            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
691
            if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '0'))
692
                return 0;
666
            --padlen;
693
            --padlen;
667
        }
694
        }
668
    }
695
    }
669
    while (padlen > 0) {
696
    while (padlen > 0) {
670
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
697
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
698
            return 0;
671
        --padlen;
699
        --padlen;
672
    }
700
    }
673
    if (signvalue)
701
    if (signvalue && !doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue))
674
        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
702
        return 0;
675
703
676
    while (iplace > 0)
704
    while (iplace > 0) {
677
        doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]);
705
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]))
706
            return 0;
707
    }
678
708
679
    /*
709
    /*
680
     * Decimal point. This should probably use locale to find the correct
710
     * Decimal point. This should probably use locale to find the correct
681
     * char to print out.
711
     * char to print out.
682
     */
712
     */
683
    if (max > 0 || (flags & DP_F_NUM)) {
713
    if (max > 0 || (flags & DP_F_NUM)) {
684
        doapr_outch(sbuffer, buffer, currlen, maxlen, '.');
714
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '.'))
715
            return 0;
685
716
686
        while (fplace > 0)
717
        while (fplace > 0) {
687
            doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]);
718
            if(!doapr_outch(sbuffer, buffer, currlen, maxlen,
719
                            fconvert[--fplace]))
720
                return 0;
721
        }
688
    }
722
    }
689
    while (zpadlen > 0) {
723
    while (zpadlen > 0) {
690
        doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
724
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '0'))
725
            return 0;
691
        --zpadlen;
726
        --zpadlen;
692
    }
727
    }
693
728
694
    while (padlen < 0) {
729
    while (padlen < 0) {
695
        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
730
        if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' '))
731
            return 0;
696
        ++padlen;
732
        ++padlen;
697
    }
733
    }
734
    return 1;
698
}
735
}
699
736
700
static void
737
#define BUFFER_INC  1024
738
739
static int
701
doapr_outch(char **sbuffer,
740
doapr_outch(char **sbuffer,
702
            char **buffer, size_t *currlen, size_t *maxlen, int c)
741
            char **buffer, size_t *currlen, size_t *maxlen, int c)
703
{
742
{
 Lines 708-731   doapr_outch(char **sbuffer, Link Here 
708
    assert(*currlen <= *maxlen);
747
    assert(*currlen <= *maxlen);
709
748
710
    if (buffer && *currlen == *maxlen) {
749
    if (buffer && *currlen == *maxlen) {
711
        *maxlen += 1024;
750
        if (*maxlen > INT_MAX - BUFFER_INC)
751
            return 0;
752
753
        *maxlen += BUFFER_INC;
712
        if (*buffer == NULL) {
754
        if (*buffer == NULL) {
713
            *buffer = OPENSSL_malloc(*maxlen);
755
            *buffer = OPENSSL_malloc(*maxlen);
714
            if (!*buffer) {
756
            if (*buffer == NULL)
715
                /* Panic! Can't really do anything sensible. Just return */
757
                return 0;
716
                return;
717
            }
718
            if (*currlen > 0) {
758
            if (*currlen > 0) {
719
                assert(*sbuffer != NULL);
759
                assert(*sbuffer != NULL);
720
                memcpy(*buffer, *sbuffer, *currlen);
760
                memcpy(*buffer, *sbuffer, *currlen);
721
            }
761
            }
722
            *sbuffer = NULL;
762
            *sbuffer = NULL;
723
        } else {
763
        } else {
724
            *buffer = OPENSSL_realloc(*buffer, *maxlen);
764
            char *tmpbuf;
725
            if (!*buffer) {
765
            tmpbuf = OPENSSL_realloc(*buffer, *maxlen);
726
                /* Panic! Can't really do anything sensible. Just return */
766
            if (tmpbuf == NULL)
727
                return;
767
                return 0;
728
            }
768
            *buffer = tmpbuf;
729
        }
769
        }
730
    }
770
    }
731
771
 Lines 736-742   doapr_outch(char **sbuffer, Link Here 
736
            (*buffer)[(*currlen)++] = (char)c;
776
            (*buffer)[(*currlen)++] = (char)c;
737
    }
777
    }
738
778
739
    return;
779
    return 1;
740
}
780
}
741
781
742
/***************************************************************************/
782
/***************************************************************************/
 Lines 768-774   int BIO_vprintf(BIO *bio, const char *format, va_list args) Link Here 
768
808
769
    dynbuf = NULL;
809
    dynbuf = NULL;
770
    CRYPTO_push_info("doapr()");
810
    CRYPTO_push_info("doapr()");
771
    _dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, format, args);
811
    if (!_dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, format,
812
                args)) {
813
        OPENSSL_free(dynbuf);
814
        return -1;
815
    }
772
    if (dynbuf) {
816
    if (dynbuf) {
773
        ret = BIO_write(bio, dynbuf, (int)retlen);
817
        ret = BIO_write(bio, dynbuf, (int)retlen);
774
        OPENSSL_free(dynbuf);
818
        OPENSSL_free(dynbuf);
 Lines 803-809   int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) Link Here 
803
    size_t retlen;
847
    size_t retlen;
804
    int truncated;
848
    int truncated;
805
849
806
    _dopr(&buf, NULL, &n, &retlen, &truncated, format, args);
850
    if(!_dopr(&buf, NULL, &n, &retlen, &truncated, format, args))
851
        return -1;
807
852
808
    if (truncated)
853
    if (truncated)
809
        /*
854
        /*

Return to bug 40189