const char *s = *t;
int64_t v = 0;
- if (!ossl_isdigit(*s))
- return 0;
do {
+ if (!ossl_isdigit(*s)) {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_NOT_A_DECIMAL_DIGIT,
+ "HERE-->%s", *t);
+ return 0;
+ }
+ /* overflow check */
+ if (v > ((INT64_MAX - (*s - '0')) / 10)) {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_PARSE_FAILED,
+ "Property %s overflows", *t);
+ return 0;
+ }
v = v * 10 + (*s++ - '0');
} while (ossl_isdigit(*s));
if (!ossl_isspace(*s) && *s != '\0' && *s != ',') {
{
const char *s = *t;
int64_t v = 0;
+ int sval;
- if (!ossl_isxdigit(*s))
- return 0;
do {
+ if (ossl_isdigit(*s)) {
+ sval = *s - '0';
+ } else if (ossl_isxdigit(*s)) {
+ sval = ossl_tolower(*s) - 'a' + 10;
+ } else {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_NOT_AN_HEXADECIMAL_DIGIT,
+ "%s", *t);
+ return 0;
+ }
+
+ if (v > ((INT64_MAX - sval) / 16)) {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_PARSE_FAILED,
+ "Property %s overflows", *t);
+ return 0;
+ }
+
v <<= 4;
- if (ossl_isdigit(*s))
- v += *s - '0';
- else
- v += ossl_tolower(*s) - 'a';
+ v += sval;
} while (ossl_isxdigit(*++s));
if (!ossl_isspace(*s) && *s != '\0' && *s != ',') {
ERR_raise_data(ERR_LIB_PROP, PROP_R_NOT_AN_HEXADECIMAL_DIGIT,
const char *s = *t;
int64_t v = 0;
- if (*s == '9' || *s == '8' || !ossl_isdigit(*s))
- return 0;
do {
+ if (*s == '9' || *s == '8' || !ossl_isdigit(*s)) {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_NOT_AN_OCTAL_DIGIT,
+ "HERE-->%s", *t);
+ return 0;
+ }
+ if (v > ((INT64_MAX - (*s - '0')) / 8)) {
+ ERR_raise_data(ERR_LIB_PROP, PROP_R_PARSE_FAILED,
+ "Property %s overflows", *t);
+ return 0;
+ }
+
v = (v << 3) + (*s - '0');
} while (ossl_isdigit(*++s) && *s != '9' && *s != '8');
if (!ossl_isspace(*s) && *s != '\0' && *s != ',') {
{ "n=0x3", "n=3", 1 },
{ "n=0x3", "n=-3", -1 },
{ "n=0x33", "n=51", 1 },
+ { "n=0x123456789abcdef", "n=0x123456789abcdef", 1 },
+ { "n=0x7fffffffffffffff", "n=0x7fffffffffffffff", 1 }, /* INT64_MAX */
+ { "n=9223372036854775807", "n=9223372036854775807", 1 }, /* INT64_MAX */
+ { "n=0777777777777777777777", "n=0777777777777777777777", 1 }, /* INT64_MAX */
{ "n=033", "n=27", 1 },
{ "n=0", "n=00", 1 },
{ "n=0x0", "n=0", 1 },
{ 1, "a=2, n=012345678" }, /* Bad octal digit */
{ 0, "n=0x28FG, a=3" }, /* Bad hex digit */
{ 0, "n=145d, a=2" }, /* Bad decimal digit */
+ { 0, "n=0x8000000000000000, a=3" }, /* Hex overflow */
+ { 0, "n=922337203000000000d, a=2" }, /* Decimal overflow */
+ { 0, "a=2, n=1000000000000000000000" }, /* Octal overflow */
{ 1, "@='hello'" }, /* Invalid name */
{ 1, "n0123456789012345678901234567890123456789"
"0123456789012345678901234567890123456789"