Hi Jim, Here's a proposed patch to improve c_strtod's error checking: 1) It currently does not check against a NULL return from newlocale(), which can happen for example if out of memory. 2) When strtod_l or strtod returns an error, c_strtod fails to preserve errno as an error indicator.
OK to apply? 2009-01-21 Bruno Haible <br...@clisp.org> * lib/c-strtod.c: Include errno.h. (C_STRTOD): Check against NULL return from newlocale. Preserve errno value from STRTOD_L and STRTOD. --- lib/c-strtod.c.orig 2009-01-21 12:15:31.000000000 +0100 +++ lib/c-strtod.c 2009-01-21 12:15:24.000000000 +0100 @@ -1,6 +1,6 @@ /* Convert string to double, using the C locale. - Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2006, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include "c-strtod.h" +#include <errno.h> #include <locale.h> #include <stdlib.h> @@ -50,9 +51,18 @@ #ifdef LC_ALL_MASK - locale_t c_locale = newlocale (LC_ALL_MASK, "C", 0); + locale_t c_locale; + int saved_errno; + + c_locale = newlocale (LC_ALL_MASK, "C", (locale_t)0); + if (c_locale == (locale_t)0) + return 0; /* errno is set here */ + r = STRTOD_L (nptr, endptr, c_locale); + + saved_errno = errno; freelocale (c_locale); + errno = saved_errno; #else @@ -68,8 +78,11 @@ if (saved_locale) { + int saved_errno = errno; + setlocale (LC_NUMERIC, saved_locale); free (saved_locale); + errno = saved_errno; } #endif