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;
                       }