mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
- Fixed bug #54055 (buffer overrun with high values for precision ini
setting). #This fix (for g/G/k/H modes) is done at a different level than that for the #modes e/E/f/F, at a bit higher level and therefore with less coverage. I #chose this because it addresses the problem where it is -- the calling function #that passes a buffer too small to php_gcvt.
This commit is contained in:
parent
b21f62eb2d
commit
2a6968e43a
4 changed files with 609 additions and 9 deletions
589
ext/standard/tests/strings/bug54055.phpt
Normal file
589
ext/standard/tests/strings/bug54055.phpt
Normal file
|
@ -0,0 +1,589 @@
|
|||
--TEST--
|
||||
Bug #54055: PHP crashes when executing strval when precision setting is very high
|
||||
--FILE--
|
||||
<?php
|
||||
for($i = 495; $i <= 1074; $i++) {
|
||||
ini_set('precision', $i);
|
||||
echo "$i: len=", strlen(strval(-1 * pow(2, -1074))), "\n";
|
||||
}
|
||||
--EXPECT--
|
||||
495: len=502
|
||||
496: len=503
|
||||
497: len=504
|
||||
498: len=505
|
||||
499: len=506
|
||||
500: len=507
|
||||
501: len=507
|
||||
502: len=507
|
||||
503: len=507
|
||||
504: len=507
|
||||
505: len=507
|
||||
506: len=507
|
||||
507: len=507
|
||||
508: len=507
|
||||
509: len=507
|
||||
510: len=507
|
||||
511: len=507
|
||||
512: len=507
|
||||
513: len=507
|
||||
514: len=507
|
||||
515: len=507
|
||||
516: len=507
|
||||
517: len=507
|
||||
518: len=507
|
||||
519: len=507
|
||||
520: len=507
|
||||
521: len=507
|
||||
522: len=507
|
||||
523: len=507
|
||||
524: len=507
|
||||
525: len=507
|
||||
526: len=507
|
||||
527: len=507
|
||||
528: len=507
|
||||
529: len=507
|
||||
530: len=507
|
||||
531: len=507
|
||||
532: len=507
|
||||
533: len=507
|
||||
534: len=507
|
||||
535: len=507
|
||||
536: len=507
|
||||
537: len=507
|
||||
538: len=507
|
||||
539: len=507
|
||||
540: len=507
|
||||
541: len=507
|
||||
542: len=507
|
||||
543: len=507
|
||||
544: len=507
|
||||
545: len=507
|
||||
546: len=507
|
||||
547: len=507
|
||||
548: len=507
|
||||
549: len=507
|
||||
550: len=507
|
||||
551: len=507
|
||||
552: len=507
|
||||
553: len=507
|
||||
554: len=507
|
||||
555: len=507
|
||||
556: len=507
|
||||
557: len=507
|
||||
558: len=507
|
||||
559: len=507
|
||||
560: len=507
|
||||
561: len=507
|
||||
562: len=507
|
||||
563: len=507
|
||||
564: len=507
|
||||
565: len=507
|
||||
566: len=507
|
||||
567: len=507
|
||||
568: len=507
|
||||
569: len=507
|
||||
570: len=507
|
||||
571: len=507
|
||||
572: len=507
|
||||
573: len=507
|
||||
574: len=507
|
||||
575: len=507
|
||||
576: len=507
|
||||
577: len=507
|
||||
578: len=507
|
||||
579: len=507
|
||||
580: len=507
|
||||
581: len=507
|
||||
582: len=507
|
||||
583: len=507
|
||||
584: len=507
|
||||
585: len=507
|
||||
586: len=507
|
||||
587: len=507
|
||||
588: len=507
|
||||
589: len=507
|
||||
590: len=507
|
||||
591: len=507
|
||||
592: len=507
|
||||
593: len=507
|
||||
594: len=507
|
||||
595: len=507
|
||||
596: len=507
|
||||
597: len=507
|
||||
598: len=507
|
||||
599: len=507
|
||||
600: len=507
|
||||
601: len=507
|
||||
602: len=507
|
||||
603: len=507
|
||||
604: len=507
|
||||
605: len=507
|
||||
606: len=507
|
||||
607: len=507
|
||||
608: len=507
|
||||
609: len=507
|
||||
610: len=507
|
||||
611: len=507
|
||||
612: len=507
|
||||
613: len=507
|
||||
614: len=507
|
||||
615: len=507
|
||||
616: len=507
|
||||
617: len=507
|
||||
618: len=507
|
||||
619: len=507
|
||||
620: len=507
|
||||
621: len=507
|
||||
622: len=507
|
||||
623: len=507
|
||||
624: len=507
|
||||
625: len=507
|
||||
626: len=507
|
||||
627: len=507
|
||||
628: len=507
|
||||
629: len=507
|
||||
630: len=507
|
||||
631: len=507
|
||||
632: len=507
|
||||
633: len=507
|
||||
634: len=507
|
||||
635: len=507
|
||||
636: len=507
|
||||
637: len=507
|
||||
638: len=507
|
||||
639: len=507
|
||||
640: len=507
|
||||
641: len=507
|
||||
642: len=507
|
||||
643: len=507
|
||||
644: len=507
|
||||
645: len=507
|
||||
646: len=507
|
||||
647: len=507
|
||||
648: len=507
|
||||
649: len=507
|
||||
650: len=507
|
||||
651: len=507
|
||||
652: len=507
|
||||
653: len=507
|
||||
654: len=507
|
||||
655: len=507
|
||||
656: len=507
|
||||
657: len=507
|
||||
658: len=507
|
||||
659: len=507
|
||||
660: len=507
|
||||
661: len=507
|
||||
662: len=507
|
||||
663: len=507
|
||||
664: len=507
|
||||
665: len=507
|
||||
666: len=507
|
||||
667: len=507
|
||||
668: len=507
|
||||
669: len=507
|
||||
670: len=507
|
||||
671: len=507
|
||||
672: len=507
|
||||
673: len=507
|
||||
674: len=507
|
||||
675: len=507
|
||||
676: len=507
|
||||
677: len=507
|
||||
678: len=507
|
||||
679: len=507
|
||||
680: len=507
|
||||
681: len=507
|
||||
682: len=507
|
||||
683: len=507
|
||||
684: len=507
|
||||
685: len=507
|
||||
686: len=507
|
||||
687: len=507
|
||||
688: len=507
|
||||
689: len=507
|
||||
690: len=507
|
||||
691: len=507
|
||||
692: len=507
|
||||
693: len=507
|
||||
694: len=507
|
||||
695: len=507
|
||||
696: len=507
|
||||
697: len=507
|
||||
698: len=507
|
||||
699: len=507
|
||||
700: len=507
|
||||
701: len=507
|
||||
702: len=507
|
||||
703: len=507
|
||||
704: len=507
|
||||
705: len=507
|
||||
706: len=507
|
||||
707: len=507
|
||||
708: len=507
|
||||
709: len=507
|
||||
710: len=507
|
||||
711: len=507
|
||||
712: len=507
|
||||
713: len=507
|
||||
714: len=507
|
||||
715: len=507
|
||||
716: len=507
|
||||
717: len=507
|
||||
718: len=507
|
||||
719: len=507
|
||||
720: len=507
|
||||
721: len=507
|
||||
722: len=507
|
||||
723: len=507
|
||||
724: len=507
|
||||
725: len=507
|
||||
726: len=507
|
||||
727: len=507
|
||||
728: len=507
|
||||
729: len=507
|
||||
730: len=507
|
||||
731: len=507
|
||||
732: len=507
|
||||
733: len=507
|
||||
734: len=507
|
||||
735: len=507
|
||||
736: len=507
|
||||
737: len=507
|
||||
738: len=507
|
||||
739: len=507
|
||||
740: len=507
|
||||
741: len=507
|
||||
742: len=507
|
||||
743: len=507
|
||||
744: len=507
|
||||
745: len=507
|
||||
746: len=507
|
||||
747: len=507
|
||||
748: len=507
|
||||
749: len=507
|
||||
750: len=507
|
||||
751: len=507
|
||||
752: len=507
|
||||
753: len=507
|
||||
754: len=507
|
||||
755: len=507
|
||||
756: len=507
|
||||
757: len=507
|
||||
758: len=507
|
||||
759: len=507
|
||||
760: len=507
|
||||
761: len=507
|
||||
762: len=507
|
||||
763: len=507
|
||||
764: len=507
|
||||
765: len=507
|
||||
766: len=507
|
||||
767: len=507
|
||||
768: len=507
|
||||
769: len=507
|
||||
770: len=507
|
||||
771: len=507
|
||||
772: len=507
|
||||
773: len=507
|
||||
774: len=507
|
||||
775: len=507
|
||||
776: len=507
|
||||
777: len=507
|
||||
778: len=507
|
||||
779: len=507
|
||||
780: len=507
|
||||
781: len=507
|
||||
782: len=507
|
||||
783: len=507
|
||||
784: len=507
|
||||
785: len=507
|
||||
786: len=507
|
||||
787: len=507
|
||||
788: len=507
|
||||
789: len=507
|
||||
790: len=507
|
||||
791: len=507
|
||||
792: len=507
|
||||
793: len=507
|
||||
794: len=507
|
||||
795: len=507
|
||||
796: len=507
|
||||
797: len=507
|
||||
798: len=507
|
||||
799: len=507
|
||||
800: len=507
|
||||
801: len=507
|
||||
802: len=507
|
||||
803: len=507
|
||||
804: len=507
|
||||
805: len=507
|
||||
806: len=507
|
||||
807: len=507
|
||||
808: len=507
|
||||
809: len=507
|
||||
810: len=507
|
||||
811: len=507
|
||||
812: len=507
|
||||
813: len=507
|
||||
814: len=507
|
||||
815: len=507
|
||||
816: len=507
|
||||
817: len=507
|
||||
818: len=507
|
||||
819: len=507
|
||||
820: len=507
|
||||
821: len=507
|
||||
822: len=507
|
||||
823: len=507
|
||||
824: len=507
|
||||
825: len=507
|
||||
826: len=507
|
||||
827: len=507
|
||||
828: len=507
|
||||
829: len=507
|
||||
830: len=507
|
||||
831: len=507
|
||||
832: len=507
|
||||
833: len=507
|
||||
834: len=507
|
||||
835: len=507
|
||||
836: len=507
|
||||
837: len=507
|
||||
838: len=507
|
||||
839: len=507
|
||||
840: len=507
|
||||
841: len=507
|
||||
842: len=507
|
||||
843: len=507
|
||||
844: len=507
|
||||
845: len=507
|
||||
846: len=507
|
||||
847: len=507
|
||||
848: len=507
|
||||
849: len=507
|
||||
850: len=507
|
||||
851: len=507
|
||||
852: len=507
|
||||
853: len=507
|
||||
854: len=507
|
||||
855: len=507
|
||||
856: len=507
|
||||
857: len=507
|
||||
858: len=507
|
||||
859: len=507
|
||||
860: len=507
|
||||
861: len=507
|
||||
862: len=507
|
||||
863: len=507
|
||||
864: len=507
|
||||
865: len=507
|
||||
866: len=507
|
||||
867: len=507
|
||||
868: len=507
|
||||
869: len=507
|
||||
870: len=507
|
||||
871: len=507
|
||||
872: len=507
|
||||
873: len=507
|
||||
874: len=507
|
||||
875: len=507
|
||||
876: len=507
|
||||
877: len=507
|
||||
878: len=507
|
||||
879: len=507
|
||||
880: len=507
|
||||
881: len=507
|
||||
882: len=507
|
||||
883: len=507
|
||||
884: len=507
|
||||
885: len=507
|
||||
886: len=507
|
||||
887: len=507
|
||||
888: len=507
|
||||
889: len=507
|
||||
890: len=507
|
||||
891: len=507
|
||||
892: len=507
|
||||
893: len=507
|
||||
894: len=507
|
||||
895: len=507
|
||||
896: len=507
|
||||
897: len=507
|
||||
898: len=507
|
||||
899: len=507
|
||||
900: len=507
|
||||
901: len=507
|
||||
902: len=507
|
||||
903: len=507
|
||||
904: len=507
|
||||
905: len=507
|
||||
906: len=507
|
||||
907: len=507
|
||||
908: len=507
|
||||
909: len=507
|
||||
910: len=507
|
||||
911: len=507
|
||||
912: len=507
|
||||
913: len=507
|
||||
914: len=507
|
||||
915: len=507
|
||||
916: len=507
|
||||
917: len=507
|
||||
918: len=507
|
||||
919: len=507
|
||||
920: len=507
|
||||
921: len=507
|
||||
922: len=507
|
||||
923: len=507
|
||||
924: len=507
|
||||
925: len=507
|
||||
926: len=507
|
||||
927: len=507
|
||||
928: len=507
|
||||
929: len=507
|
||||
930: len=507
|
||||
931: len=507
|
||||
932: len=507
|
||||
933: len=507
|
||||
934: len=507
|
||||
935: len=507
|
||||
936: len=507
|
||||
937: len=507
|
||||
938: len=507
|
||||
939: len=507
|
||||
940: len=507
|
||||
941: len=507
|
||||
942: len=507
|
||||
943: len=507
|
||||
944: len=507
|
||||
945: len=507
|
||||
946: len=507
|
||||
947: len=507
|
||||
948: len=507
|
||||
949: len=507
|
||||
950: len=507
|
||||
951: len=507
|
||||
952: len=507
|
||||
953: len=507
|
||||
954: len=507
|
||||
955: len=507
|
||||
956: len=507
|
||||
957: len=507
|
||||
958: len=507
|
||||
959: len=507
|
||||
960: len=507
|
||||
961: len=507
|
||||
962: len=507
|
||||
963: len=507
|
||||
964: len=507
|
||||
965: len=507
|
||||
966: len=507
|
||||
967: len=507
|
||||
968: len=507
|
||||
969: len=507
|
||||
970: len=507
|
||||
971: len=507
|
||||
972: len=507
|
||||
973: len=507
|
||||
974: len=507
|
||||
975: len=507
|
||||
976: len=507
|
||||
977: len=507
|
||||
978: len=507
|
||||
979: len=507
|
||||
980: len=507
|
||||
981: len=507
|
||||
982: len=507
|
||||
983: len=507
|
||||
984: len=507
|
||||
985: len=507
|
||||
986: len=507
|
||||
987: len=507
|
||||
988: len=507
|
||||
989: len=507
|
||||
990: len=507
|
||||
991: len=507
|
||||
992: len=507
|
||||
993: len=507
|
||||
994: len=507
|
||||
995: len=507
|
||||
996: len=507
|
||||
997: len=507
|
||||
998: len=507
|
||||
999: len=507
|
||||
1000: len=507
|
||||
1001: len=507
|
||||
1002: len=507
|
||||
1003: len=507
|
||||
1004: len=507
|
||||
1005: len=507
|
||||
1006: len=507
|
||||
1007: len=507
|
||||
1008: len=507
|
||||
1009: len=507
|
||||
1010: len=507
|
||||
1011: len=507
|
||||
1012: len=507
|
||||
1013: len=507
|
||||
1014: len=507
|
||||
1015: len=507
|
||||
1016: len=507
|
||||
1017: len=507
|
||||
1018: len=507
|
||||
1019: len=507
|
||||
1020: len=507
|
||||
1021: len=507
|
||||
1022: len=507
|
||||
1023: len=507
|
||||
1024: len=507
|
||||
1025: len=507
|
||||
1026: len=507
|
||||
1027: len=507
|
||||
1028: len=507
|
||||
1029: len=507
|
||||
1030: len=507
|
||||
1031: len=507
|
||||
1032: len=507
|
||||
1033: len=507
|
||||
1034: len=507
|
||||
1035: len=507
|
||||
1036: len=507
|
||||
1037: len=507
|
||||
1038: len=507
|
||||
1039: len=507
|
||||
1040: len=507
|
||||
1041: len=507
|
||||
1042: len=507
|
||||
1043: len=507
|
||||
1044: len=507
|
||||
1045: len=507
|
||||
1046: len=507
|
||||
1047: len=507
|
||||
1048: len=507
|
||||
1049: len=507
|
||||
1050: len=507
|
||||
1051: len=507
|
||||
1052: len=507
|
||||
1053: len=507
|
||||
1054: len=507
|
||||
1055: len=507
|
||||
1056: len=507
|
||||
1057: len=507
|
||||
1058: len=507
|
||||
1059: len=507
|
||||
1060: len=507
|
||||
1061: len=507
|
||||
1062: len=507
|
||||
1063: len=507
|
||||
1064: len=507
|
||||
1065: len=507
|
||||
1066: len=507
|
||||
1067: len=507
|
||||
1068: len=507
|
||||
1069: len=507
|
||||
1070: len=507
|
||||
1071: len=507
|
||||
1072: len=507
|
||||
1073: len=507
|
||||
1074: len=507
|
|
@ -677,10 +677,6 @@ static int format_converter(register buffy * odp, const char *fmt, va_list ap) /
|
|||
|
||||
/*
|
||||
* Check if a precision was specified
|
||||
*
|
||||
* XXX: an unreasonable amount of precision may be specified
|
||||
* resulting in overflow of num_buf. Currently we
|
||||
* ignore this possibility.
|
||||
*/
|
||||
if (*fmt == '.') {
|
||||
adjust_precision = YES;
|
||||
|
@ -694,6 +690,10 @@ static int format_converter(register buffy * odp, const char *fmt, va_list ap) /
|
|||
precision = 0;
|
||||
} else
|
||||
precision = 0;
|
||||
|
||||
if (precision > FORMAT_CONV_MAX_PRECISION) {
|
||||
precision = FORMAT_CONV_MAX_PRECISION;
|
||||
}
|
||||
} else
|
||||
adjust_precision = NO;
|
||||
} else
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Stig Sæther Bakken <ssb@php.net> |
|
||||
| Author: Stig Sæther Bakken <ssb@php.net> |
|
||||
| Marcus Boerger <helly@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
@ -158,6 +158,17 @@ extern char * ap_php_conv_10(register wide_int num, register bool_int is_unsigne
|
|||
extern char * ap_php_conv_p2(register u_wide_int num, register int nbits,
|
||||
char format, char *buf_end, register int *len);
|
||||
|
||||
/* The maximum precision that's allowed for float conversion. Does not include
|
||||
* decimal separator, exponent, sign, terminator. Currently does not affect
|
||||
* the modes e/f, only g/k/H, as those have a different limit enforced at
|
||||
* another level (see NDIG in php_conv_fp()).
|
||||
* Applies to the formatting functions of both spprintf.c and snprintf.c, which
|
||||
* use equally sized buffers of MAX_BUF_SIZE = 512 to hold the result of the
|
||||
* call to php_gcvt().
|
||||
* This should be reasonably smaller than MAX_BUF_SIZE (I think MAX_BUF_SIZE - 9
|
||||
* should be enough, but let's give some more space) */
|
||||
#define FORMAT_CONV_MAX_PRECISION 500
|
||||
|
||||
#endif /* SNPRINTF_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -285,10 +285,6 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
|||
|
||||
/*
|
||||
* Check if a precision was specified
|
||||
*
|
||||
* XXX: an unreasonable amount of precision may be specified
|
||||
* resulting in overflow of num_buf. Currently we
|
||||
* ignore this possibility.
|
||||
*/
|
||||
if (*fmt == '.') {
|
||||
adjust_precision = YES;
|
||||
|
@ -302,6 +298,10 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
|
|||
precision = 0;
|
||||
} else
|
||||
precision = 0;
|
||||
|
||||
if (precision > FORMAT_CONV_MAX_PRECISION) {
|
||||
precision = FORMAT_CONV_MAX_PRECISION;
|
||||
}
|
||||
} else
|
||||
adjust_precision = NO;
|
||||
} else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue