diff options
| author | Yuan Fu | 2022-10-17 13:43:06 -0700 |
|---|---|---|
| committer | Yuan Fu | 2022-10-17 13:52:31 -0700 |
| commit | 1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3 (patch) | |
| tree | 52088c30cce4bd9dac961fa71286490c9bf02fbb | |
| parent | 5a2c1a743b54f7d3355f9b1dc893bbe72e8df6bc (diff) | |
| download | emacs-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.c | 11 |
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 | { |