Browse Source

Make sure that the following functions return 0 and EINVAL as

required by the C standard when called with an invalid base:
strtoll(), strtoimax(), strtoul(), strtoull(), and strtoumax().
Same behaviour for strtoq() and strtouq() even though not standardized.
No functional change in strtol(), it was the only one already correct.
While here, simplify the conditional expression for checking the base
and sync whitespace and comments among the six files.
ok millert@
OPENBSD_5_7
schwarze 10 years ago
parent
commit
eac5f40007
6 changed files with 60 additions and 20 deletions
  1. +13
    -3
      src/lib/libc/stdlib/strtoimax.c
  2. +3
    -4
      src/lib/libc/stdlib/strtol.c
  3. +13
    -2
      src/lib/libc/stdlib/strtoll.c
  4. +9
    -2
      src/lib/libc/stdlib/strtoul.c
  5. +11
    -4
      src/lib/libc/stdlib/strtoull.c
  6. +11
    -5
      src/lib/libc/stdlib/strtoumax.c

+ 13
- 3
src/lib/libc/stdlib/strtoimax.c View File

@ -1,6 +1,5 @@
/* $OpenBSD: strtoimax.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */
/*-
/* $OpenBSD: strtoimax.c,v 1.2 2014/09/13 20:10:12 schwarze Exp $ */
/*
* Copyright (c) 1992 The Regents of the University of California. * Copyright (c) 1992 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
@ -47,6 +46,17 @@ strtoimax(const char *nptr, char **endptr, int base)
int c; int c;
int neg, any, cutlim; int neg, any, cutlim;
/*
* Ensure that base is between 2 and 36 inclusive, or the special
* value of 0.
*/
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0)
*endptr = (char *)nptr;
errno = EINVAL;
return 0;
}
/* /*
* Skip white space and pick up leading +/- sign if any. * Skip white space and pick up leading +/- sign if any.
* If base is 0, allow 0x for hex and 0 for octal, else * If base is 0, allow 0x for hex and 0 for octal, else


+ 3
- 4
src/lib/libc/stdlib/strtol.c View File

@ -1,5 +1,5 @@
/* $OpenBSD: strtol.c,v 1.9 2013/04/17 17:40:35 tedu Exp $ */
/*-
/* $OpenBSD: strtol.c,v 1.10 2014/09/13 20:10:12 schwarze Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California. * Copyright (c) 1990 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
@ -33,7 +33,6 @@
#include <limits.h> #include <limits.h>
#include <stdlib.h> #include <stdlib.h>
/* /*
* Convert a string to a long integer. * Convert a string to a long integer.
* *
@ -52,7 +51,7 @@ strtol(const char *nptr, char **endptr, int base)
* Ensure that base is between 2 and 36 inclusive, or the special * Ensure that base is between 2 and 36 inclusive, or the special
* value of 0. * value of 0.
*/ */
if (base != 0 && (base < 2 || base > 36)) {
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0) if (endptr != 0)
*endptr = (char *)nptr; *endptr = (char *)nptr;
errno = EINVAL; errno = EINVAL;


+ 13
- 2
src/lib/libc/stdlib/strtoll.c View File

@ -1,5 +1,5 @@
/* $OpenBSD: strtoll.c,v 1.7 2013/03/28 18:09:38 martynas Exp $ */
/*-
/* $OpenBSD: strtoll.c,v 1.8 2014/09/13 20:10:12 schwarze Exp $ */
/*
* Copyright (c) 1992 The Regents of the University of California. * Copyright (c) 1992 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
@ -49,6 +49,17 @@ strtoll(const char *nptr, char **endptr, int base)
int c; int c;
int neg, any, cutlim; int neg, any, cutlim;
/*
* Ensure that base is between 2 and 36 inclusive, or the special
* value of 0.
*/
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0)
*endptr = (char *)nptr;
errno = EINVAL;
return 0;
}
/* /*
* Skip white space and pick up leading +/- sign if any. * Skip white space and pick up leading +/- sign if any.
* If base is 0, allow 0x for hex and 0 for octal, else * If base is 0, allow 0x for hex and 0 for octal, else


+ 9
- 2
src/lib/libc/stdlib/strtoul.c View File

@ -1,6 +1,6 @@
/* $OpenBSD: strtoul.c,v 1.8 2013/04/17 17:40:35 tedu Exp $ */
/* $OpenBSD: strtoul.c,v 1.9 2014/09/13 20:10:12 schwarze Exp $ */
/* /*
* Copyright (c) 1990 Regents of the University of California.
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -50,6 +50,13 @@ strtoul(const char *nptr, char **endptr, int base)
/* /*
* See strtol for comments as to the logic used. * See strtol for comments as to the logic used.
*/ */
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0)
*endptr = (char *)nptr;
errno = EINVAL;
return 0;
}
s = nptr; s = nptr;
do { do {
c = (unsigned char) *s++; c = (unsigned char) *s++;


+ 11
- 4
src/lib/libc/stdlib/strtoull.c View File

@ -1,5 +1,5 @@
/* $OpenBSD: strtoull.c,v 1.6 2013/03/28 18:09:38 martynas Exp $ */
/*-
/* $OpenBSD: strtoull.c,v 1.7 2014/09/13 20:10:12 schwarze Exp $ */
/*
* Copyright (c) 1992 The Regents of the University of California. * Copyright (c) 1992 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
@ -50,8 +50,15 @@ strtoull(const char *nptr, char **endptr, int base)
int neg, any, cutlim; int neg, any, cutlim;
/* /*
* See strtoq for comments as to the logic used.
* See strtoll for comments as to the logic used.
*/ */
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0)
*endptr = (char *)nptr;
errno = EINVAL;
return 0;
}
s = nptr; s = nptr;
do { do {
c = (unsigned char) *s++; c = (unsigned char) *s++;
@ -59,7 +66,7 @@ strtoull(const char *nptr, char **endptr, int base)
if (c == '-') { if (c == '-') {
neg = 1; neg = 1;
c = *s++; c = *s++;
} else {
} else {
neg = 0; neg = 0;
if (c == '+') if (c == '+')
c = *s++; c = *s++;


+ 11
- 5
src/lib/libc/stdlib/strtoumax.c View File

@ -1,6 +1,5 @@
/* $OpenBSD: strtoumax.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */
/*-
/* $OpenBSD: strtoumax.c,v 1.2 2014/09/13 20:10:12 schwarze Exp $ */
/*
* Copyright (c) 1992 The Regents of the University of California. * Copyright (c) 1992 The Regents of the University of California.
* All rights reserved. * All rights reserved.
* *
@ -48,8 +47,15 @@ strtoumax(const char *nptr, char **endptr, int base)
int neg, any, cutlim; int neg, any, cutlim;
/* /*
* See strtoq for comments as to the logic used.
* See strtoimax for comments as to the logic used.
*/ */
if (base < 0 || base == 1 || base > 36) {
if (endptr != 0)
*endptr = (char *)nptr;
errno = EINVAL;
return 0;
}
s = nptr; s = nptr;
do { do {
c = (unsigned char) *s++; c = (unsigned char) *s++;
@ -57,7 +63,7 @@ strtoumax(const char *nptr, char **endptr, int base)
if (c == '-') { if (c == '-') {
neg = 1; neg = 1;
c = *s++; c = *s++;
} else {
} else {
neg = 0; neg = 0;
if (c == '+') if (c == '+')
c = *s++; c = *s++;


Loading…
Cancel
Save