diff options
author | Elliott Hughes <enh@google.com> | 2014-09-23 14:53:10 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-09-23 14:53:10 -0700 |
commit | b05ec5ae933987e6b4a4f6a318cb13e035ad33e9 (patch) | |
tree | 64f418a870ba50ccec912a11f90605418f74c844 /libc | |
parent | 8642165344217877b8a70811d19e09b584a0e10a (diff) | |
download | bionic-b05ec5ae933987e6b4a4f6a318cb13e035ad33e9.zip bionic-b05ec5ae933987e6b4a4f6a318cb13e035ad33e9.tar.gz bionic-b05ec5ae933987e6b4a4f6a318cb13e035ad33e9.tar.bz2 |
Pull in upstream fixes to reject invalid bases.
Also add tests to make sure the full set works correctly.
Change-Id: I3e7f237f12c9c93e1185a97c9717803e7e55a73c
Diffstat (limited to 'libc')
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtoimax.c | 16 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtol.c | 7 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtoll.c | 15 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtoul.c | 11 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtoull.c | 15 | ||||
-rw-r--r-- | libc/upstream-openbsd/lib/libc/stdlib/strtoumax.c | 16 |
6 files changed, 60 insertions, 20 deletions
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtoimax.c b/libc/upstream-openbsd/lib/libc/stdlib/strtoimax.c index 2c77f41..2fc04e4 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtoimax.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtoimax.c @@ -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. * All rights reserved. * @@ -48,6 +47,17 @@ strtoimax(const char *nptr, char **endptr, int base) 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. * If base is 0, allow 0x for hex and 0 for octal, else * assume decimal; if base is already 16, allow 0x. diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtol.c b/libc/upstream-openbsd/lib/libc/stdlib/strtol.c index dc2cf88..86cec35 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtol.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtol.c @@ -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. * All rights reserved. * @@ -33,7 +33,6 @@ #include <limits.h> #include <stdlib.h> - /* * 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 * value of 0. */ - if (base != 0 && (base < 2 || base > 36)) { + if (base < 0 || base == 1 || base > 36) { if (endptr != 0) *endptr = (char *)nptr; errno = EINVAL; diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtoll.c b/libc/upstream-openbsd/lib/libc/stdlib/strtoll.c index 4bcc556..cf82c8e 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtoll.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtoll.c @@ -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. * All rights reserved. * @@ -50,6 +50,17 @@ strtoll(const char *nptr, char **endptr, int base) 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. * If base is 0, allow 0x for hex and 0 for octal, else * assume decimal; if base is already 16, allow 0x. diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtoul.c b/libc/upstream-openbsd/lib/libc/stdlib/strtoul.c index a236365..2aa41b7 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtoul.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtoul.c @@ -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. * * 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. */ + if (base < 0 || base == 1 || base > 36) { + if (endptr != 0) + *endptr = (char *)nptr; + errno = EINVAL; + return 0; + } + s = nptr; do { c = (unsigned char) *s++; diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtoull.c b/libc/upstream-openbsd/lib/libc/stdlib/strtoull.c index 28f613a..8464176 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtoull.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtoull.c @@ -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. * All rights reserved. * @@ -50,8 +50,15 @@ strtoull(const char *nptr, char **endptr, int base) 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; do { c = (unsigned char) *s++; @@ -59,7 +66,7 @@ strtoull(const char *nptr, char **endptr, int base) if (c == '-') { neg = 1; c = *s++; - } else { + } else { neg = 0; if (c == '+') c = *s++; diff --git a/libc/upstream-openbsd/lib/libc/stdlib/strtoumax.c b/libc/upstream-openbsd/lib/libc/stdlib/strtoumax.c index ce6e2c0..c73f7e5 100644 --- a/libc/upstream-openbsd/lib/libc/stdlib/strtoumax.c +++ b/libc/upstream-openbsd/lib/libc/stdlib/strtoumax.c @@ -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. * All rights reserved. * @@ -48,8 +47,15 @@ strtoumax(const char *nptr, char **endptr, int base) 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; do { c = (unsigned char) *s++; @@ -57,7 +63,7 @@ strtoumax(const char *nptr, char **endptr, int base) if (c == '-') { neg = 1; c = *s++; - } else { + } else { neg = 0; if (c == '+') c = *s++; |