]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't rely on copying in {EN,DE}CODE_FILE
authorMattias Engdegård <mattiase@acm.org>
Mon, 6 Apr 2020 13:20:08 +0000 (15:20 +0200)
committerMattias Engdegård <mattiase@acm.org>
Thu, 9 Apr 2020 09:34:48 +0000 (11:34 +0200)
Callers of ENCODE_FILE and DECODE_FILE should not assume that these
functions always return a new string (bug#40407).

* src/w32fns.c (Fw32_shell_execute):
* src/w32proc.c (Fw32_application_type):
Sink taking the address of a Lisp string past GC points.
Copy values returned from ENCODE_FILE before mutating them.

src/w32fns.c
src/w32proc.c

index 9bb4e27b0184ebf9914d04a10a3b2666beb5195d..8d714f0b8d0181537c1e5bb3ff328e0fd1f49f84 100644 (file)
@@ -8258,7 +8258,6 @@ a ShowWindow flag:
   /* Encode filename, current directory and parameters.  */
   current_dir = GUI_ENCODE_FILE (current_dir);
   document = GUI_ENCODE_FILE (document);
-  doc_w = GUI_SDATA (document);
   if (STRINGP (parameters))
     {
       parameters = GUI_ENCODE_SYSTEM (parameters);
@@ -8269,6 +8268,7 @@ a ShowWindow flag:
       operation = GUI_ENCODE_SYSTEM (operation);
       ops_w = GUI_SDATA (operation);
     }
+  doc_w = GUI_SDATA (document);
   result = (intptr_t) ShellExecuteW (NULL, ops_w, doc_w, params_w,
                                     GUI_SDATA (current_dir),
                                     (FIXNUMP (show_flag)
@@ -8353,7 +8353,7 @@ a ShowWindow flag:
   handler = Ffind_file_name_handler (absdoc, Qfile_exists_p);
   if (NILP (handler))
     {
-      Lisp_Object absdoc_encoded = ENCODE_FILE (absdoc);
+      Lisp_Object absdoc_encoded = Fcopy_sequence (ENCODE_FILE (absdoc));
 
       if (faccessat (AT_FDCWD, SSDATA (absdoc_encoded), F_OK, AT_EACCESS) == 0)
        {
index de33726905051e1ab9bf2685a371ae5d09bb98bf..16e32e4c58d2baf58026a25ffdf0b392bf00f89a 100644 (file)
@@ -3231,7 +3231,7 @@ such programs cannot be invoked by Emacs anyway.  */)
   char *progname, progname_a[MAX_PATH];
 
   program = Fexpand_file_name (program, Qnil);
-  encoded_progname = ENCODE_FILE (program);
+  encoded_progname = Fcopy_sequence (ENCODE_FILE (program));
   progname = SSDATA (encoded_progname);
   unixtodos_filename (progname);
   filename_to_ansi (progname, progname_a);