summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2022-10-17 13:43:06 -0700
committerYuan Fu <casouri@gmail.com>2022-10-17 13:52:31 -0700
commit1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3 (patch)
tree52088c30cce4bd9dac961fa71286490c9bf02fbb /src
parent5a2c1a743b54f7d3355f9b1dc893bbe72e8df6bc (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/treesit.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/treesit.c b/src/treesit.c
index 8417b3bb1c5..90a1249ba8d 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)
{