about summary refs log tree commit diff
path: root/stdlib/test-bz22786.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-12-29 11:37:34 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-01-05 11:33:16 -0300
commitc6e0b0b5b0b7922cdf0dce2af671e0c7e500df95 (patch)
tree01d0121e7f7492d2710a4d13c773cf8669315759 /stdlib/test-bz22786.c
parent448a256359e951fd2e81ccb2926e3f2b1d7a09de (diff)
downloadglibc-c6e0b0b5b0b7922cdf0dce2af671e0c7e500df95.tar.gz
glibc-c6e0b0b5b0b7922cdf0dce2af671e0c7e500df95.tar.xz
glibc-c6e0b0b5b0b7922cdf0dce2af671e0c7e500df95.zip
stdlib: Sync canonicalize with gnulib [BZ #10635] [BZ #26592] [BZ #26341] [BZ #24970]
It sync with gnulib version ae9fb3d66.  The testcase for BZ#23741
(stdlib/test-bz22786.c) is adjusted to check also for ENOMEM.

The patch fixes multiple realpath issues:

  - Portability fixes for errno clobbering on free (BZ#10635).  The
    function does not call free directly anymore, although it might be
    done through scratch_buffer_free.  The free errno clobbering is
    being tracked by BZ#17924.

  - Pointer arithmetic overflows in realpath (BZ#26592).

  - Realpath cyclically call __alloca(path_max) to consume too much
    stack space (BZ#26341).

  - Realpath mishandles EOVERFLOW; stat not needed anyway (BZ#24970).
    The check is done through faccessat now.

Checked on x86_64-linux-gnu and i686-linux-gnu.
Diffstat (limited to 'stdlib/test-bz22786.c')
-rw-r--r--stdlib/test-bz22786.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/stdlib/test-bz22786.c b/stdlib/test-bz22786.c
index 84d3ff8cfb..df454949c4 100644
--- a/stdlib/test-bz22786.c
+++ b/stdlib/test-bz22786.c
@@ -62,12 +62,10 @@ do_test (void)
 
   /* This call crashes before the fix for bz22786 on 32-bit platforms.  */
   p = realpath (path, NULL);
-
-  if (p != NULL || errno != ENAMETOOLONG)
-    {
-      printf ("realpath: %s (%m)", p);
-      return EXIT_FAILURE;
-    }
+  TEST_VERIFY (p == NULL);
+  /* For 64-bit platforms readlink return ENAMETOOLONG, while for 32-bit
+     realpath will try to allocate a buffer larger than PTRDIFF_MAX.  */
+  TEST_VERIFY (errno == ENOMEM || errno == ENAMETOOLONG);
 
   /* Cleanup.  */
   unlink (lnk);
@@ -78,5 +76,4 @@ do_test (void)
   return 0;
 }
 
-#define TEST_FUNCTION do_test
 #include <support/test-driver.c>