diff options
| author | Paul Eggert | 2020-08-15 10:48:36 -0700 |
|---|---|---|
| committer | Paul Eggert | 2020-08-15 11:19:51 -0700 |
| commit | d0145537fa511a44e2a4af01da3947e92f0b8331 (patch) | |
| tree | 0b098e725155c3b40031e0ecb8c65bbb25a6e402 /src/coding.c | |
| parent | 4cba236749aafade7bd88cf2a10be48f44983faa (diff) | |
| download | emacs-d0145537fa511a44e2a4af01da3947e92f0b8331.tar.gz emacs-d0145537fa511a44e2a4af01da3947e92f0b8331.zip | |
Fix GC bugs related to uninitialized vectors
Avoid problems if GC occurs while initializing a vector.
Problem with Fdelete reported by Pip Cet in:
https://lists.gnu.org/r/emacs-devel/2020-08/msg00313.html
I looked for similar problems elsewhere and found quite a few.
* src/coding.c (make_subsidiaries):
* src/composite.c (syms_of_composite):
* src/font.c (build_style_table, Ffont_get_glyphs):
* src/nsselect.m (clean_local_selection_data):
* src/nsxwidget.m (js_to_lisp):
* src/syntax.c (init_syntax_once):
* src/window.c (Fcurrent_window_configuration):
* src/xselect.c (selection_data_to_lisp_data)
(clean_local_selection_data):
Use make_nil_vector instead of make_uninit_vector.
* src/fns.c (Fdelete):
* src/xwidget.c (webkit_js_to_lisp):
Use allocate_nil_vector instead of allocate_vector.
* src/search.c (Fnewline_cache_check):
Use make_vector instead of make_uninit_vector.
Diffstat (limited to 'src/coding.c')
| -rw-r--r-- | src/coding.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/src/coding.c b/src/coding.c index 1d79c703a3a..51bd441de9d 100644 --- a/src/coding.c +++ b/src/coding.c | |||
| @@ -10856,20 +10856,17 @@ HIGHESTP non-nil means just return the highest priority one. */) | |||
| 10856 | return Fnreverse (val); | 10856 | return Fnreverse (val); |
| 10857 | } | 10857 | } |
| 10858 | 10858 | ||
| 10859 | static const char *const suffixes[] = { "-unix", "-dos", "-mac" }; | ||
| 10860 | |||
| 10861 | static Lisp_Object | 10859 | static Lisp_Object |
| 10862 | make_subsidiaries (Lisp_Object base) | 10860 | make_subsidiaries (Lisp_Object base) |
| 10863 | { | 10861 | { |
| 10864 | Lisp_Object subsidiaries; | 10862 | static char const suffixes[][8] = { "-unix", "-dos", "-mac" }; |
| 10865 | ptrdiff_t base_name_len = SBYTES (SYMBOL_NAME (base)); | 10863 | ptrdiff_t base_name_len = SBYTES (SYMBOL_NAME (base)); |
| 10866 | USE_SAFE_ALLOCA; | 10864 | USE_SAFE_ALLOCA; |
| 10867 | char *buf = SAFE_ALLOCA (base_name_len + 6); | 10865 | char *buf = SAFE_ALLOCA (base_name_len + 6); |
| 10868 | int i; | ||
| 10869 | 10866 | ||
| 10870 | memcpy (buf, SDATA (SYMBOL_NAME (base)), base_name_len); | 10867 | memcpy (buf, SDATA (SYMBOL_NAME (base)), base_name_len); |
| 10871 | subsidiaries = make_uninit_vector (3); | 10868 | Lisp_Object subsidiaries = make_nil_vector (3); |
| 10872 | for (i = 0; i < 3; i++) | 10869 | for (int i = 0; i < 3; i++) |
| 10873 | { | 10870 | { |
| 10874 | strcpy (buf + base_name_len, suffixes[i]); | 10871 | strcpy (buf + base_name_len, suffixes[i]); |
| 10875 | ASET (subsidiaries, i, intern (buf)); | 10872 | ASET (subsidiaries, i, intern (buf)); |