aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuan Fu2022-10-17 13:43:06 -0700
committerYuan Fu2022-10-17 13:52:31 -0700
commit1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3 (patch)
tree52088c30cce4bd9dac961fa71286490c9bf02fbb
parent5a2c1a743b54f7d3355f9b1dc893bbe72e8df6bc (diff)
downloademacs-1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3.tar.gz
emacs-1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3.zip
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.
-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,
497 concat2 (build_pure_c_string ("libtree-sitter-"), symbol_name); 497 concat2 (build_pure_c_string ("libtree-sitter-"), symbol_name);
498 Lisp_Object base_name = 498 Lisp_Object base_name =
499 concat2 (build_pure_c_string ("tree-sitter-"), symbol_name); 499 concat2 (build_pure_c_string ("tree-sitter-"), symbol_name);
500 /* FIXME: The result of strdup leaks memory in some cases. */
501 char *c_name = strdup (SSDATA (base_name));
502 treesit_symbol_to_c_name (c_name);
503 500
504 /* Override the library name and C name, if appropriate. */ 501 /* Override the library name and C name, if appropriate. */
505 Lisp_Object override_name; 502 Lisp_Object override_name;
@@ -508,10 +505,7 @@ treesit_load_language (Lisp_Object language_symbol,
508 &override_name, 505 &override_name,
509 &override_c_name); 506 &override_c_name);
510 if (found_override) 507 if (found_override)
511 {
512 lib_base_name = override_name; 508 lib_base_name = override_name;
513 c_name = SSDATA (override_c_name);
514 }
515 509
516 /* Now we generate a list of possible library paths. */ 510 /* Now we generate a list of possible library paths. */
517 Lisp_Object path_candidates = Qnil; 511 Lisp_Object path_candidates = Qnil;
@@ -560,7 +554,12 @@ treesit_load_language (Lisp_Object language_symbol,
560 /* Load TSLanguage. */ 554 /* Load TSLanguage. */
561 dynlib_error (); 555 dynlib_error ();
562 TSLanguage *(*langfn) (void); 556 TSLanguage *(*langfn) (void);
557 char *c_name = strdup (SSDATA (base_name));
558 treesit_symbol_to_c_name (c_name);
559 if (found_override)
560 c_name = SSDATA (override_c_name);
563 langfn = dynlib_sym (handle, c_name); 561 langfn = dynlib_sym (handle, c_name);
562 free(c_name);
564 error = dynlib_error (); 563 error = dynlib_error ();
565 if (error != NULL) 564 if (error != NULL)
566 { 565 {