* dired.c (Fdirectory_files): Compile the MATCH regexp after
authorJim Blandy <jimb@redhat.com>
Mon, 15 Mar 1993 03:04:52 +0000 (03:04 +0000)
committerJim Blandy <jimb@redhat.com>
Mon, 15 Mar 1993 03:04:52 +0000 (03:04 +0000)
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.

src/dired.c

index 23bb41e..35de751 100644 (file)
@@ -100,7 +100,7 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
 {
   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 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
       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 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
 #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;