From eac5f400070ba3d75a4494fc786531b496d71230 Mon Sep 17 00:00:00 2001 From: schwarze <> Date: Sat, 13 Sep 2014 20:10:12 +0000 Subject: [PATCH] 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@ --- src/lib/libc/stdlib/strtoimax.c | 16 +++++++++++++--- src/lib/libc/stdlib/strtol.c | 7 +++---- src/lib/libc/stdlib/strtoll.c | 15 +++++++++++++-- src/lib/libc/stdlib/strtoul.c | 11 +++++++++-- src/lib/libc/stdlib/strtoull.c | 15 +++++++++++---- src/lib/libc/stdlib/strtoumax.c | 16 +++++++++++----- 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/lib/libc/stdlib/strtoimax.c b/src/lib/libc/stdlib/strtoimax.c index 2c77f416..2fc04e48 100644 --- a/src/lib/libc/stdlib/strtoimax.c +++ b/src/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. * @@ -47,6 +46,17 @@ strtoimax(const char *nptr, char **endptr, int base) int c; 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 diff --git a/src/lib/libc/stdlib/strtol.c b/src/lib/libc/stdlib/strtol.c index dc2cf887..86cec350 100644 --- a/src/lib/libc/stdlib/strtol.c +++ b/src/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 #include - /* * 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/src/lib/libc/stdlib/strtoll.c b/src/lib/libc/stdlib/strtoll.c index 4bcc5565..cf82c8e1 100644 --- a/src/lib/libc/stdlib/strtoll.c +++ b/src/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. * @@ -49,6 +49,17 @@ strtoll(const char *nptr, char **endptr, int base) int c; 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 diff --git a/src/lib/libc/stdlib/strtoul.c b/src/lib/libc/stdlib/strtoul.c index a236365d..2aa41b76 100644 --- a/src/lib/libc/stdlib/strtoul.c +++ b/src/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/src/lib/libc/stdlib/strtoull.c b/src/lib/libc/stdlib/strtoull.c index 28f613a0..84641763 100644 --- a/src/lib/libc/stdlib/strtoull.c +++ b/src/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/src/lib/libc/stdlib/strtoumax.c b/src/lib/libc/stdlib/strtoumax.c index ce6e2c00..c73f7e50 100644 --- a/src/lib/libc/stdlib/strtoumax.c +++ b/src/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++;