support: Preserve errno in write_message, TEST_VERIFY and other checks
authorFlorian Weimer <fweimer@redhat.com>
Fri, 12 Jan 2018 07:18:30 +0000 (08:18 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Fri, 12 Jan 2018 12:35:01 +0000 (13:35 +0100)
These facilities could clobber errno, which makes it difficult to write
certain checks because a specific order has to be used.

ChangeLog
support/check.c
support/support_test_compare_failure.c
support/support_test_verify_impl.c
support/write_message.c

index baba58a5b4e7fa7354326ac6a98e2e4cbba74890..72aaf78cf238733cd2ca36da6861a4c730cbe11e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2018-01-12  Florian Weimer  <fweimer@redhat.com>
+
+       * support/write_message.c (write_message): Preserve errno.
+       * support/check.c (print_failure): Likewise.
+       * support/support_test_verify_impl.c (support_test_verify_impl):
+       Likewise.
+       * support/support_test_compare_failure.c
+       (support_test_compare_failure): Likewise.
+
 2018-01-12  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #22701]
index 688ed569ac25bec377692182c77ee340c5f84696..78f2b3cde14bc0bdfbd1f99ebe09aac58f48f48f 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <support/check.h>
 
+#include <errno.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 static void
 print_failure (const char *file, int line, const char *format, va_list ap)
 {
+  int saved_errno = errno;
   printf ("error: %s:%d: ", file, line);
   vprintf (format, ap);
   puts ("");
+  errno = saved_errno;
 }
 
 int
index e5596fd1214c7020f67a71181289a66dd4e55f7c..8eb51c439dfe175c88682329c25f9cbc08bcd555 100644 (file)
@@ -16,6 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <support/check.h>
 
@@ -44,6 +45,7 @@ support_test_compare_failure (const char *file, int line,
                               int right_positive,
                               int right_size)
 {
+  int saved_errno = errno;
   support_record_failure ();
   if (left_size != right_size)
     printf ("%s:%d: numeric comparison failure (widths %d and %d)\n",
@@ -52,4 +54,5 @@ support_test_compare_failure (const char *file, int line,
     printf ("%s:%d: numeric comparison failure\n", file, line);
   report (" left", left_expr, left_value, left_positive, left_size);
   report ("right", right_expr, right_value, right_positive, right_size);
+  errno = saved_errno;
 }
index 80311a8265dbaa803d310d95c668c8f7340f3dde..5ff5555a6a6cce32380913ccb50c907eb2ac0f51 100644 (file)
 
 #include <support/check.h>
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 void
 support_test_verify_impl (const char *file, int line, const char *expr)
 {
+  int saved_errno = errno;
   support_record_failure ();
   printf ("error: %s:%d: not true: %s\n", file, line, expr);
+  errno = saved_errno;
 }
 
 void
index 9d0f267a2fc107afa4a09f114d4f68e7ad592470..a3e2f90535aa87cfbcf344f81672a712b08ba0b9 100644 (file)
 
 #include <support/support.h>
 
+#include <errno.h>
 #include <string.h>
 #include <unistd.h>
 
 void
 write_message (const char *message)
 {
+  int saved_errno = errno;
   ssize_t unused __attribute__ ((unused));
   unused = write (STDOUT_FILENO, message, strlen (message));
+  errno = saved_errno;
 }