Mercurial > emacs
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;