emacs-diffs
[Top][All Lists]
Advanced

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

feature/tree-sitter 1cd42bfb8a 1/5: Fix memory leak in ts_load_language


From: Yuan Fu
Subject: feature/tree-sitter 1cd42bfb8a 1/5: Fix memory leak in ts_load_language
Date: Mon, 17 Oct 2022 20:14:35 -0400 (EDT)

branch: feature/tree-sitter
commit 1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Fix memory leak in ts_load_language
    
    * src/treesit.c (ts_load_language): Move initialization of c_name down
    and free it right after use.
---
 src/treesit.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/treesit.c b/src/treesit.c
index 8417b3bb1c..90a1249ba8 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -497,9 +497,6 @@ treesit_load_language (Lisp_Object language_symbol,
     concat2 (build_pure_c_string ("libtree-sitter-"), symbol_name);
   Lisp_Object base_name =
     concat2 (build_pure_c_string ("tree-sitter-"), symbol_name);
-  /* FIXME: The result of strdup leaks memory in some cases.  */
-  char *c_name = strdup (SSDATA (base_name));
-  treesit_symbol_to_c_name (c_name);
 
   /* Override the library name and C name, if appropriate.  */
   Lisp_Object override_name;
@@ -508,10 +505,7 @@ treesit_load_language (Lisp_Object language_symbol,
                                                    &override_name,
                                                    &override_c_name);
   if (found_override)
-    {
       lib_base_name = override_name;
-      c_name = SSDATA (override_c_name);
-    }
 
   /* Now we generate a list of possible library paths.  */
   Lisp_Object path_candidates = Qnil;
@@ -560,7 +554,12 @@ treesit_load_language (Lisp_Object language_symbol,
   /* Load TSLanguage.  */
   dynlib_error ();
   TSLanguage *(*langfn) (void);
+  char *c_name = strdup (SSDATA (base_name));
+  treesit_symbol_to_c_name (c_name);
+  if (found_override)
+    c_name = SSDATA (override_c_name);
   langfn = dynlib_sym (handle, c_name);
+  free(c_name);
   error = dynlib_error ();
   if (error != NULL)
     {



reply via email to

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