Ignore:
Timestamp:
Jan 1, 2014, 12:47:38 AM (10 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.21.1
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.2/mindi-busybox/libbb/bb_strtonum.c

    r2725 r3232  
    3737}
    3838
    39 static unsigned long long handle_errors(unsigned long long v, char **endp, char *endptr)
     39static unsigned long long handle_errors(unsigned long long v, char **endp)
    4040{
    41     if (endp) *endp = endptr;
     41    char next_ch = **endp;
    4242
    4343    /* errno is already set to ERANGE by strtoXXX if value overflowed */
    44     if (endptr[0]) {
     44    if (next_ch) {
    4545        /* "1234abcg" or out-of-range? */
    46         if (isalnum(endptr[0]) || errno)
     46        if (isalnum(next_ch) || errno)
    4747            return ret_ERANGE();
    4848        /* good number, just suspicious terminator */
     
    5858    char *endptr;
    5959
     60    if (!endp) endp = &endptr;
     61    *endp = (char*) arg;
     62
    6063    /* strtoul("  -4200000000") returns 94967296, errno 0 (!) */
    6164    /* I don't think that this is right. Preventing this... */
     
    6467    /* not 100% correct for lib func, but convenient for the caller */
    6568    errno = 0;
    66     v = strtoull(arg, &endptr, base);
    67     return handle_errors(v, endp, endptr);
     69    v = strtoull(arg, endp, base);
     70    return handle_errors(v, endp);
    6871}
    6972
     
    7275    unsigned long long v;
    7376    char *endptr;
     77    char first;
     78
     79    if (!endp) endp = &endptr;
     80    *endp = (char*) arg;
    7481
    7582    /* Check for the weird "feature":
    7683     * a "-" string is apparently a valid "number" for strto[u]l[l]!
    7784     * It returns zero and errno is 0! :( */
    78     char first = (arg[0] != '-' ? arg[0] : arg[1]);
     85    first = (arg[0] != '-' ? arg[0] : arg[1]);
    7986    if (!isalnum(first)) return ret_ERANGE();
    8087
    8188    errno = 0;
    82     v = strtoll(arg, &endptr, base);
    83     return handle_errors(v, endp, endptr);
     89    v = strtoll(arg, endp, base);
     90    return handle_errors(v, endp);
    8491}
    8592
     
    9097    char *endptr;
    9198
     99    if (!endp) endp = &endptr;
     100    *endp = (char*) arg;
     101
    92102    if (!isalnum(arg[0])) return ret_ERANGE();
    93103    errno = 0;
    94     v = strtoul(arg, &endptr, base);
    95     return handle_errors(v, endp, endptr);
     104    v = strtoul(arg, endp, base);
     105    return handle_errors(v, endp);
    96106}
    97107
     
    100110    long v;
    101111    char *endptr;
     112    char first;
    102113
    103     char first = (arg[0] != '-' ? arg[0] : arg[1]);
     114    if (!endp) endp = &endptr;
     115    *endp = (char*) arg;
     116
     117    first = (arg[0] != '-' ? arg[0] : arg[1]);
    104118    if (!isalnum(first)) return ret_ERANGE();
    105119
    106120    errno = 0;
    107     v = strtol(arg, &endptr, base);
    108     return handle_errors(v, endp, endptr);
     121    v = strtol(arg, endp, base);
     122    return handle_errors(v, endp);
    109123}
    110124#endif
     
    116130    char *endptr;
    117131
     132    if (!endp) endp = &endptr;
     133    *endp = (char*) arg;
     134
    118135    if (!isalnum(arg[0])) return ret_ERANGE();
    119136    errno = 0;
    120     v = strtoul(arg, &endptr, base);
     137    v = strtoul(arg, endp, base);
    121138    if (v > UINT_MAX) return ret_ERANGE();
    122     return handle_errors(v, endp, endptr);
     139    return handle_errors(v, endp);
    123140}
    124141
     
    127144    long v;
    128145    char *endptr;
     146    char first;
    129147
    130     char first = (arg[0] != '-' ? arg[0] : arg[1]);
     148    if (!endp) endp = &endptr;
     149    *endp = (char*) arg;
     150
     151    first = (arg[0] != '-' ? arg[0] : arg[1]);
    131152    if (!isalnum(first)) return ret_ERANGE();
    132153
    133154    errno = 0;
    134     v = strtol(arg, &endptr, base);
     155    v = strtol(arg, endp, base);
    135156    if (v > INT_MAX) return ret_ERANGE();
    136157    if (v < INT_MIN) return ret_ERANGE();
    137     return handle_errors(v, endp, endptr);
     158    return handle_errors(v, endp);
    138159}
    139160#endif
Note: See TracChangeset for help on using the changeset viewer.