Mercurial > hg > octave-jordi > gnulib-hg
changeset 13259:5aa26fc2aec0
vasnprintf: Correct errno value in case of out-of-memory.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sat, 24 Apr 2010 17:18:48 +0200 |
parents | 22d0473cd1a8 |
children | 45dad26de835 |
files | ChangeLog lib/vasnprintf.c |
diffstat | 2 files changed, 17 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-04-24 Bruno Haible <bruno@clisp.org> + + vasnprintf: Correct errno value in case of out-of-memory. + * lib/vasnprintf.c (VASNPRINTF): Set errno to 0 before calling SNPRINTF + or sprintf. Use the errno value from SNPRINTF or sprintf. + Reported by Ian Beckwith <ianb@erislabs.net>. + 2010-04-24 Bruno Haible <bruno@clisp.org> ansi-c++-opt: Find correct compiler when cross-compiling.
--- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -4953,6 +4953,7 @@ } #endif + errno = 0; switch (type) { case TYPE_SCHAR: @@ -5147,15 +5148,21 @@ /* Attempt to handle failure. */ if (count < 0) { + /* SNPRINTF or sprintf failed. Save and use the errno + that it has set, if any. */ + int saved_errno = errno; + if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = - (dp->conversion == 'c' || dp->conversion == 's' - ? EILSEQ - : EINVAL); + (saved_errno != 0 + ? saved_errno + : (dp->conversion == 'c' || dp->conversion == 's' + ? EILSEQ + : EINVAL)); return NULL; }