about summary refs log tree commit diff
path: root/posix/bug-glob1.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-09-30 23:13:17 +0000
committerUlrich Drepper <drepper@redhat.com>2004-09-30 23:13:17 +0000
commit0da4ee554369b536c554cbc2d50f1abf5e42bdf5 (patch)
tree27845d0eb9ce3bd8a4e618692a8b0207b69bcc21 /posix/bug-glob1.c
parentc4f4ef871927b78f3c9a65cb34c95ced96e346e8 (diff)
downloadglibc-0da4ee554369b536c554cbc2d50f1abf5e42bdf5.tar.gz
glibc-0da4ee554369b536c554cbc2d50f1abf5e42bdf5.tar.xz
glibc-0da4ee554369b536c554cbc2d50f1abf5e42bdf5.zip
Update.
	* posix/Makefile: Add rules to build and run bug-glob1.
	* posix/bug-glob1.c: New file.
Diffstat (limited to 'posix/bug-glob1.c')
-rw-r--r--posix/bug-glob1.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/posix/bug-glob1.c b/posix/bug-glob1.c
new file mode 100644
index 0000000000..4f7e981c75
--- /dev/null
+++ b/posix/bug-glob1.c
@@ -0,0 +1,82 @@
+/* Test case for globbing dangling symlink.  By Ulrich Drepper.  */
+#include <errno.h>
+#include <error.h>
+#include <glob.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (int argc, char *argv[]);
+#define PREPARE prepare
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+
+static char *fname;
+
+static void
+prepare (int argc, char *argv[])
+{
+  if (argc < 2)
+    error (EXIT_FAILURE, 0, "missing argument");
+
+  size_t len = strlen (argv[1]);
+  static const char ext[] = "globXXXXXX";
+  fname = malloc (len + 1 + sizeof (ext));
+  if (fname == NULL)
+    error (EXIT_FAILURE, errno, "cannot create temp file");
+  strcpy (stpcpy (stpcpy (fname, argv[1]), "/"), ext);
+  fname = mktemp (fname);
+  if (fname == NULL || *fname == '\0')
+    error (EXIT_FAILURE, errno, "cannot create temp file name");
+  if (symlink ("bug-glob1-does-not-exist", fname) != 0)
+    error (EXIT_FAILURE, errno, "cannot create symlink");
+  add_temp_file (fname);
+}
+
+
+static int
+do_test (void)
+{
+  glob_t gl;
+  int retval = 0;
+  int e;
+
+  e = glob (fname, 0, NULL, &gl);
+  if (e == 0)
+    {
+      printf ("glob(\"%s\") succeeded\n", fname);
+      retval = 1;
+    }
+  globfree (&gl);
+
+  size_t fnamelen = strlen (fname);
+  char buf[fnamelen + 2];
+
+  strcpy (buf, fname);
+  buf[fnamelen - 1] = '?';
+  e = glob (buf, 0, NULL, &gl);
+  if (e == 0)
+    {
+      printf ("glob(\"%s\") succeeded\n", buf);
+      retval = 1;
+    }
+  globfree (&gl);
+
+  strcpy (buf, fname);
+  buf[fnamelen] = '*';
+  buf[fnamelen + 1] = '\0';
+  e = glob (buf, 0, NULL, &gl);
+  if (e == 0)
+    {
+      printf ("glob(\"%s\") succeeded\n", buf);
+      retval = 1;
+    }
+  globfree (&gl);
+
+  return retval;
+}