changeset 2182:4ffe88f2e493

* dired.c (Fdirectory_files): Compile the MATCH regexp after calling everything else which might compile a regexp. * dired.c (Fdirectory_files): Properly GCPRO the strings while calling Fexpand_file_name and Fdirectory_file_name.
author Jim Blandy <jimb@redhat.com>
date Mon, 15 Mar 1993 03:04:52 +0000
parents 5a9d9dcc4750
children 1d57af6e24e9
files src/dired.c
diffstat 1 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/dired.c	Mon Mar 15 02:00:20 1993 +0000
+++ b/src/dired.c	Mon Mar 15 03:04:52 1993 +0000
@@ -100,7 +100,7 @@
 {
   DIR *d;
   int length;
-  Lisp_Object list, name;
+  Lisp_Object list, name, dirfilename;
   Lisp_Object handler;
 
   /* If the file name has special constructs in it,
@@ -119,6 +119,18 @@
       return Ffuncall (6, args);
     }
 
+  {
+    struct gcpro gcpro1, gcpro2;
+
+    /* Because of file name handlers, these functions might call
+     Ffuncall, and cause a GC.  */
+    GCPRO1 (match);
+    dirname = Fexpand_file_name (dirname, Qnil);
+    GCPRO2 (match, dirname);
+    dirfilename = Fdirectory_file_name (dirname);
+    UNGCPRO;
+  }
+
   if (!NILP (match))
     {
       CHECK_STRING (match, 3);
@@ -134,8 +146,15 @@
 #endif
     }
 
-  dirname = Fexpand_file_name (dirname, Qnil);
-  if (!(d = opendir (XSTRING (Fdirectory_file_name (dirname))->data)))
+  /* Now searchbuf is the compiled form of MATCH; don't call anything
+     which might compile a new regexp until we're done with the loop!  */
+
+  /* Do this opendir after anything which might signal an error; if
+     an error is signalled while the directory stream is open, we
+     have to make sure it gets closed, and setting up an
+     unwind_protect to do so would be a pain.  */
+  d = opendir (XSTRING (dirfilename)->data);
+  if (! d)
     report_file_error ("Opening directory", Fcons (dirname, Qnil));
 
   list = Qnil;