emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/igc b0a209e9204: Don't put string data pointers into xmalloc'd m


From: Pip Cet
Subject: scratch/igc b0a209e9204: Don't put string data pointers into xmalloc'd memory (bug#75292)
Date: Fri, 3 Jan 2025 14:45:27 -0500 (EST)

branch: scratch/igc
commit b0a209e9204b01bab4a8259b948365a0a9235ab1
Author: Pip Cet <pipcet@protonmail.com>
Commit: Pip Cet <pipcet@protonmail.com>

    Don't put string data pointers into xmalloc'd memory (bug#75292)
    
    * src/callproc.c (make_environment_block, call_process): Duplicate
    strings, and unwind-protect.
    (geten_internal_1): Add FIXME.
---
 src/callproc.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/callproc.c b/src/callproc.c
index 3f2c60a2151..451a708fc05 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -544,13 +544,17 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int 
filefd,
            args[i] = encode_coding_string (&argument_coding, args[i], 1);
        }
       for (i = 4; i < nargs; i++)
-       new_argv[i - 3] = SSDATA (args[i]);
+       {
+         new_argv[i - 3] = xstrdup (SSDATA (args[i]));
+         record_unwind_protect_ptr (xfree, new_argv[i - 3]);
+       }
       new_argv[i - 3] = 0;
     }
   else
     new_argv[1] = 0;
   path = ENCODE_FILE (path);
-  new_argv[0] = SSDATA (path);
+  new_argv[0] = xstrdup (SSDATA (path));
+  record_unwind_protect_ptr (xfree, new_argv[0]);
 
   discard_output = FIXNUMP (buffer) || (NILP (buffer) && NILP (output_file));
 
@@ -1696,6 +1700,8 @@ getenv_internal_1 (const char *var, ptrdiff_t varlen, 
char **value,
        {
          if (SBYTES (entry) > varlen && SREF (entry, varlen) == '=')
            {
+             /* FIXME/igc: does this pointer ever leak to
+                non-MPS-visible memory?  */
              *value = SSDATA (entry) + (varlen + 1);
              *valuelen = SBYTES (entry) - (varlen + 1);
              return 1;
@@ -1924,7 +1930,11 @@ make_environment_block (Lisp_Object current_dir)
     for (tem = Vprocess_environment;
         CONSP (tem) && STRINGP (XCAR (tem));
         tem = XCDR (tem))
-      new_env = add_env (env, new_env, SSDATA (XCAR (tem)));
+      {
+       char *safe_string = xstrdup (SSDATA (XCAR (tem)));
+       record_unwind_protect_ptr (xfree, safe_string);
+       new_env = add_env (env, new_env, safe_string);
+      }
 
     *new_env = 0;
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]