Changeset 0260034 in mainline for uspace/lib/c/generic/strtol.c


Ignore:
Timestamp:
2019-05-27T16:17:33Z (5 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dd0502ae
Parents:
31a566b
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2019-05-27 15:44:21)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2019-05-27 16:17:33)
Message:

Fix and test additional corner cases in strtol()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/strtol.c

    r31a566b r0260034  
    7777
    7878        if (nptr[1] == 'x' || nptr[1] == 'X') {
    79                 *nptrptr += 2;
    80                 return 16;
     79                if (_digit_value(nptr[2]) < 16) {
     80                        *nptrptr += 2;
     81                        return 16;
     82                }
    8183        }
    8284
     
    8587                case 'b':
    8688                case 'B':
    87                         *nptrptr += 2;
    88                         return 2;
     89                        if (_digit_value(nptr[2]) < 2) {
     90                                *nptrptr += 2;
     91                                return 2;
     92                        }
     93                        break;
    8994                case 'o':
    9095                case 'O':
    91                         *nptrptr += 2;
    92                         return 8;
     96                        if (_digit_value(nptr[2]) < 8) {
     97                                *nptrptr += 2;
     98                                return 8;
     99                        }
     100                        break;
    93101                case 'd':
    94102                case 'D':
    95103                case 't':
    96104                case 'T':
    97                         *nptrptr += 2;
    98                         return 10;
     105                        if (_digit_value(nptr[2]) < 10) {
     106                                *nptrptr += 2;
     107                                return 10;
     108                        }
     109                        break;
    99110                }
    100111        }
     
    109120        assert(nptr != NULL);
    110121        assert(sgn != NULL);
     122
     123        const char *first = nptr;
    111124
    112125        /* Skip leading whitespace. */
     
    138151                 * present when base is explicitly set to 16.
    139152                 * Our nonstandard str_* functions don't allow it.
     153                 * I don't know if that is intended, just matching the original
     154                 * functionality here.
    140155                 */
    141156
    142                 if (nptr[0] == '0' && (nptr[1] == 'x' || nptr[1] == 'X'))
     157                if (nptr[0] == '0' && (nptr[1] == 'x' || nptr[1] == 'X') &&
     158                    _digit_value(nptr[2]) < base)
    143159                        nptr += 2;
    144160        }
     
    149165        }
    150166
    151         /* Read the value. */
     167        /* Must be at least one digit. */
     168
     169        if (_digit_value(*nptr) >= base) {
     170                /* No digits on input. */
     171                if (endptr != NULL)
     172                        *endptr = (char *) first;
     173                return 0;
     174        }
     175
     176        /* Read the value.  */
    152177
    153178        uintmax_t result = 0;
Note: See TracChangeset for help on using the changeset viewer.