diff options
author | Eli Zaretskii <eliz@gnu.org> | 2019-03-27 20:34:22 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-03-27 20:34:22 +0200 |
commit | a35a1f6a9406bc98b4ab83489e5dc7843ffacfb6 (patch) | |
tree | c6167df9e04a63952c0ef7bf1d4b0a292887c5d4 | |
parent | a697d1e638eabdb3eb32337fde6d802ef712eaf8 (diff) | |
download | emacs-a35a1f6a9406bc98b4ab83489e5dc7843ffacfb6.tar.gz |
Attempt to fix crashes under GDB on Windows 10
* src/pdumper.c (dump_discard_mem)
[VM_SUPPORTED == VM_MS_WINDOWS]: Don't pass NULL pointer as
last argument to VirtualProtect. Reported by Martin Rudalics
<rudalics@gmx.at>.
-rw-r--r-- | src/coding.c | 87 | ||||
-rw-r--r-- | src/pdumper.c | 3 |
2 files changed, 51 insertions, 39 deletions
diff --git a/src/coding.c b/src/coding.c index 905c7ced849..c6d96436770 100644 --- a/src/coding.c +++ b/src/coding.c @@ -7798,42 +7798,6 @@ static Lisp_Object Vcode_conversion_reused_workbuf; static bool reused_workbuf_in_use; -/* Return a working buffer of code conversion. MULTIBYTE specifies the - multibyteness of returning buffer. */ - -static Lisp_Object -make_conversion_work_buffer (bool multibyte) -{ - Lisp_Object name, workbuf; - struct buffer *current; - - if (reused_workbuf_in_use) - { - name = Fgenerate_new_buffer_name (Vcode_conversion_workbuf_name, Qnil); - workbuf = Fget_buffer_create (name); - } - else - { - reused_workbuf_in_use = 1; - if (NILP (Fbuffer_live_p (Vcode_conversion_reused_workbuf))) - Vcode_conversion_reused_workbuf - = Fget_buffer_create (Vcode_conversion_workbuf_name); - workbuf = Vcode_conversion_reused_workbuf; - } - current = current_buffer; - set_buffer_internal (XBUFFER (workbuf)); - /* We can't allow modification hooks to run in the work buffer. For - instance, directory_files_internal assumes that file decoding - doesn't compile new regexps. */ - Fset (Fmake_local_variable (Qinhibit_modification_hooks), Qt); - Ferase_buffer (); - bset_undo_list (current_buffer, Qt); - bset_enable_multibyte_characters (current_buffer, multibyte ? Qt : Qnil); - set_buffer_internal (current); - return workbuf; -} - - static void code_conversion_restore (Lisp_Object arg) { @@ -7846,7 +7810,12 @@ code_conversion_restore (Lisp_Object arg) if (EQ (workbuf, Vcode_conversion_reused_workbuf)) reused_workbuf_in_use = 0; else - Fkill_buffer (workbuf); + { + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qbuffer_list_update_hook, Qnil); + Fkill_buffer (workbuf); + unbind_to (count, Qnil); + } } set_buffer_internal (XBUFFER (current)); } @@ -7857,9 +7826,51 @@ code_conversion_save (bool with_work_buf, bool multibyte) Lisp_Object workbuf = Qnil; if (with_work_buf) - workbuf = make_conversion_work_buffer (multibyte); + { + ptrdiff_t count = SPECPDL_INDEX (); + if (reused_workbuf_in_use) + { + Lisp_Object name + = Fgenerate_new_buffer_name (Vcode_conversion_workbuf_name, Qnil); + specbind (Qbuffer_list_update_hook, Qnil); + workbuf = Fget_buffer_create (name); + unbind_to (count, Qnil); + } + else + { + if (NILP (Fbuffer_live_p (Vcode_conversion_reused_workbuf))) + { + specbind (Qbuffer_list_update_hook, Qnil); + Vcode_conversion_reused_workbuf + = Fget_buffer_create (Vcode_conversion_workbuf_name); + unbind_to (count, Qnil); + } + workbuf = Vcode_conversion_reused_workbuf; + } + } record_unwind_protect (code_conversion_restore, Fcons (Fcurrent_buffer (), workbuf)); + if (!NILP (workbuf)) + { + struct buffer *current = current_buffer; + set_buffer_internal (XBUFFER (workbuf)); + /* We can't allow modification hooks to run in the work buffer. For + instance, directory_files_internal assumes that file decoding + doesn't compile new regexps. */ + Fset (Fmake_local_variable (Qinhibit_modification_hooks), Qt); + Ferase_buffer (); + bset_undo_list (current_buffer, Qt); + bset_enable_multibyte_characters (current_buffer, multibyte ? Qt : Qnil); + if (EQ (workbuf, Vcode_conversion_reused_workbuf)) + reused_workbuf_in_use = 1; + else + { + Fset (Fmake_local_variable (Qkill_buffer_query_functions), Qnil); + Fset (Fmake_local_variable (Qkill_buffer_hook), Qnil); + } + set_buffer_internal (current); + } + return workbuf; } diff --git a/src/pdumper.c b/src/pdumper.c index f459d971c35..8116c75ae8e 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -4623,7 +4623,8 @@ dump_discard_mem (void *mem, size_t size) /* Discard COWed pages. */ (void) VirtualFree (mem, size, MEM_DECOMMIT); /* Release the commit charge for the mapping. */ - (void) VirtualProtect (mem, size, PAGE_NOACCESS, NULL); + DWORD old_prot; + (void) VirtualProtect (mem, size, PAGE_NOACCESS, &old_prot); #elif VM_SUPPORTED == VM_POSIX # ifdef HAVE_POSIX_MADVISE /* Discard COWed pages. */ |