Fix some fd issues when running subprocesses.
[bpt/emacs.git] / src / ChangeLog
index ead50fa..759f66b 100644 (file)
@@ -1,3 +1,274 @@
+2013-08-12  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Fix some fd issues when running subprocesses (Bug#15035).
+       Fix bugs that can leak files or file descriptors on errors.
+       Don't unlink open temp files, as that's hard for users to diagnose
+       when things go awry (e.g., temp disk exhausted).
+       Don't bother to lock temp files.  Check for invalid recursion.
+       * callproc.c (synch_process_fd): Remove.  All uses removed.
+       (synch_process_tempfile): New var or macro.
+       (CALLPROC_STDOUT, CALLPROC_STDERR, CALLPROC_PIPEREAD, CALLPROC_FDS):
+       New constants.
+       (record_kill_process): New arg, the temp name.  All callers changed.
+       (delete_temp_file): Now just a simple wrapper around unlink.
+       (call_process_kill): New arg, the call_process_fd array.
+       Close them all.  Clear synch_process_pid.  Remove the temp file,
+       or arrange for it to be removed.
+       (call_process_cleanup) [MSDOS]: Arg no longer contains file name;
+       that's been moved to synch_process_tempfile.  Caller changed.
+       Do not remove the tempfile; that's now call_process_kill's
+       responsibility.
+       (call_process_cleanup) [!MSDOS]: Do not record unwind-protect for
+       call_process_kill; the caller now does that.
+       (call_process_cleanup): Do not close the process fd; that's now
+       call_process_kill's responsibility.
+       (Fcall_process): Implement via new function call_process, which
+       has most of the old body of Fcall_process, but with a different API.
+       (call_process): New function that does not open or close filefd if
+       it is nonnegative.  Record which fds need to be closed, and let
+       call_process_kill close (and remove the tempfile, on MSDOS) on error.
+       Signal an error if invoked recursively (could be done via a hook).
+       Simplify creation of the tempfile in the MSDOS case.
+       Don't create the output file until after checking for the executable.
+       Report any failure to open /dev/null.
+       Don't open /dev/null for writing twice; once is enough.
+       Don't create pipe if all output is being discarded or sent to file.
+       Don't worry about setting up the coding system or reading from the
+       pipe if all output is being discarded.
+       Hoist fd_error local into top level, to lessen block nesting.
+       Don't record deleted pid here; now done by Fcall_process_region.
+       (Fcall_process) [MSDOS]: Report mktemp failure immediately,
+       and note its success in synch_process_tempfile.
+       Do not leak resources when child_setup fails.
+       (Fcall_process) [!MSDOS && !WINDOWSNT]: Remove duplicate assignment
+       to child_errno.  Remove unnecessary close of fd0; it's close-on-exec.
+       (create_temp_file): Now returns open fd, with an additional
+       Lisp_Object * argument to return the name.  All callers changed.
+       Do not close the file; rewind it instead, and leave it open for
+       the caller.  Do not lock the temp file.  Unwind-protect the file
+       and the file-descriptor.
+       (Fcall_process_region): If the input is /dev/null, unwind-protect it.
+       If an asynchrounous process, record it here, not in call_process.
+       (syms_of_callproc) [MSDOS]: Initialize synch_process_tempfile.
+       * eval.c (set_unwind_protect): New function.
+       * fileio.c (write_region): New function, generalized from the
+       old Fwrite_region.  Do not lock temp files.
+       (Fwrite_region): Use it.
+       * lisp.h (set_unwind_protect, write_region): New decls.
+       * process.c: Include <verify.h>.
+       (make_process): Mark fds as initially closed.
+       (deleted_pid_list): Now a list of pid-filename pairs.
+       All uses changed.
+       (close_process_fd): New function.
+       (SUBPROCESS_STDIN, WRITE_TO_SUBPROCESS, READ_FROM_SUBPROCESS)
+       (SUBPROCESS_STDOUT, READ_FROM_EXEC_MONITOR, EXEC_MONITOR_OUTPUT):
+       New constants.  Verify that their number matches PROCESS_OPEN_FDS.
+       (create_process, create_pty, Fmake_serial_process)
+       (server_accept_connection): Record which fds need to be closed,
+       and let deactivate_process close them.
+       (Fmake_network_process): Do not discard the unwind-protect
+       until it's safe to do so.
+       (deactivate_process): Close the fds opened by create_process etc.
+       (Fprocess_send_eof): Adjust to new way of recording open fds.
+       Report an error if /dev/null can't be opened, instead of aborting.
+       * process.h (PROCESS_OPEN_FDS): New constant.
+       (struct Lisp_Process): New member open_fds.
+       (record_kill_process, record_deleted_pid): Adjust signatures.
+       (record_deleted_pid): Move decl here ...
+       * syswait.h (record_deleted_pid): ... from here.
+
+2013-08-11  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * decompress.c: Fix bugs with large buffers and weird inputs.
+       Tune a bit.  Reindent as per usual Emacs style.
+       (BUFFER_SIZE): Remove.
+       (Fdecompress_gzipped_region): Do not mishandle input buffers with
+       more than UINT_MAX bytes.  Decompress into the gap instead of into
+       an auto buffer, as this should avoid copying.  Return nil if
+       'inflate' returns Z_NEED_DICT, as we have no dictionary.  Do not
+       set immediate_quit; we shouldn't trust zlib code that much.
+
+2013-08-11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * decompress.c (Fdecompress_gzipped_region): Respect all zlib
+       errors, and really move the gap to where we want it.
+
+       * lisp.h: Include decompress.c support.
+
+       * emacs.c (main): Include decompress.c support.
+
+       * Makefile.in: Include -lz if present.
+
+2013-08-11  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * nsmenu.m (ns_update_menubar): Call fillWithWidgetValue:frame:
+       (initWithTitle:): Initialize frame to 0.
+       (fillWithWidgetValue:): Call fillWithWidgetValue:frame.
+       (fillWithWidgetValue:frame:): Renamed from
+       fillWithWidgetValue:setDelegate, call initWithTile:frame: if f.
+
+       * nsterm.h (EmacsMenu): fillWithWidgetValue:setDelegate renamed to
+       fillWithWidgetValue:frame:
+
+       * nsfns.m (Fns_convert_utf8_nfd_to_nfc): Allocate and release pool to
+       remove memory leak warnings.
+
+       * nsterm.m (menu_pending_title, ns_get_pending_menu_title): Remove.
+       (ns_check_menu_open): Handle menu == nil.  Remove assignment to
+       menu_pending_title.
+
+       * nsmenu.m (ns_update_menubar): Call fillWithWidgetValue:setDelegate.
+       (x_activate_menubar): Update the whole menu.
+       (trackingNotification:): Call ns_check_menu_open if tracking ends.
+       (menuWillOpen:): Increment trackingMenu.  For OSX <= 10.6, exit if
+       current event is not NSSystemDefined (Bug#15001).
+       Call ns_check_menu_open only if trackingMenu is 2.
+       (menuDidClose:): New method, decrease trackingMenu.
+       (fillWithWidgetValue:setDelegate:): New method.
+       (fillWithWidgetValue:): Call the above.
+
+       * nsterm.h (EmacsMenu): Add fillWithWidgetValue:setDelegate:
+
+2013-08-11  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Omit some unnecessary casts.
+       Many of these go back to the old pre-C89 days, when they may have
+       been needed, but we've been assuming C89 or later for a while now.
+       * alloc.c (live_string_p, live_cons_p, live_symbol_p)
+       (live_float_p, live_misc_p, live_vector_p):
+       * buffer.c (compare_overlays, cmp_for_strings, mmap_find)
+       (mmap_alloc, alloc_buffer_text, enlarge_buffer_text)
+       (defvar_per_buffer):
+       * callint.c (Fcall_interactively):
+       * doc.c (Fsubstitute_command_keys):
+       * filelock.c (get_boot_time):
+       * frame.c (xrdb_get_resource):
+       * gtkutil.c (hierarchy_ch_cb, qttip_cb, style_changed_cb)
+       (delete_cb, xg_dialog_response_cb, xg_maybe_add_timer)
+       (xg_get_file_name_from_selector, menuitem_destroy_callback)
+       (menuitem_highlight_callback, menu_destroy_callback)
+       (xg_update_menu_item, xg_modify_menubar_widgets, menubar_map_cb)
+       (xg_tool_bar_callback, xg_get_tool_bar_widgets)
+       (xg_tool_bar_detach_callback, xg_tool_bar_attach_callback)
+       (xg_tool_bar_help_callback, tb_size_cb):
+       * image.c (xpm_alloc_color, png_read_from_memory)
+       (png_read_from_file, png_load_body, our_memory_skip_input_data)
+       (jpeg_memory_src, jpeg_file_src, imagemagick_load_image)
+       (syms_of_image):
+       * keymap.c (describe_map):
+       * nsfns.m (Fns_display_monitor_attributes_list):
+       * nsmenu.m (process_dialog:):
+       * nsterm.m (hold_event):
+       * process.c (wait_reading_process_output):
+       * regex.c (REGEX_REALLOCATE, re_set_registers, re_exec, regexec):
+       * scroll.c (do_direct_scrolling, scrolling_1):
+       * termcap.c (tgetent):
+       * window.c (check_window_containing, add_window_to_list)
+       (freeze_window_starts):
+       * xdisp.c (compare_overlay_entries, vmessage):
+       * xfns.c (x_window, x_get_monitor_attributes_xinerama)
+       (x_get_monitor_attributes_xrandr)
+       (Fx_display_monitor_attributes_list, x_display_info_for_name)
+       (Fx_open_connection, file_dialog_cb, file_dialog_unmap_cb):
+       * xfont.c (xfont_match, xfont_open):
+       * xmenu.c (x_menu_wait_for_event, menu_highlight_callback)
+       (menubar_selection_callback, menu_position_func)
+       (popup_selection_callback, create_and_show_popup_menu)
+       (dialog_selection_callback, create_and_show_dialog):
+       * xrdb.c (x_get_string_resource):
+       (main) [TESTRM]:
+       * xsmfns.c (x_session_check_input):
+       * xterm.c (x_draw_glyphless_glyph_string_foreground)
+       (xm_scroll_callback, xg_scroll_callback, xg_end_scroll_callback)
+       (xaw_jump_callback, xaw_scroll_callback):
+       Omit unnecessary casts.
+
+2013-08-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Minor string-length refactoring.
+       * alloc.c (xstrdup): Use memcpy, not strcpy, since the length's known.
+       * frame.c (make_monitor_attribute_list):
+       Prefer build_string to strlen + make_string.
+
+2013-08-10  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * xterm.c (x_error_handler): Also ignore BadWindow for X_SetInputFocus,
+       don't check minor_code (Bug#14417).
+
+2013-08-09  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (draw_glyphs): Don't compare row pointers, compare row
+       vertical positions instead.  This avoids calling MATRIX_ROW with
+       row numbers that are possibly beyond valid limits.  (Bug#15064)
+
+2013-08-09  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Use xstrdup and build_unibyte_string where applicable.
+       * alloc.c (xstrdup): Tiny cleanup.  Add eassert.
+       * xfns.c (x_window):
+       * xrdb.c (x_get_customization_string):
+       * xterm.c (xim_initialize):
+       * w32fns.c (w32_window): Use xstrdup.
+       (w32_display_monitor_attributes_list):
+       * emacs.c (init_cmdargs):
+       * keyboard.c (PUSH_C_STR):
+       * nsfont.m (nsfont_open):
+       * sysdep.c (system_process_attributes):
+       * w32.c (system_process_attributes):
+       * xdisp.c (message1, message1_nolog): Use build_unibyte_string.
+
+2013-08-09  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32.c (PEXCEPTION_POINTERS, PEXCEPTION_RECORD, PCONTEXT): Define
+       variables of these types so that GDB would know about them, as aid
+       for debugging fatal exceptions.  (Bug#15024)  See also
+       http://sourceware.org/ml/gdb/2013-08/msg00010.html for related
+       discussions.
+
+2013-08-08  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * nsterm.m (ns_update_begin): Don't change clip path if it would be
+       larger than the NSWindow (Bug#14934).
+
+2013-08-08  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Redesign redisplay interface to drop global variable updated_window.
+       Always pass currently updated window as a parameter to update routines.
+       * dispextern.h (updated_window): Remove declaration.
+       (struct redisplay_interface): Pass window parameter to
+       write_glyphs, insert_glyphs, clear_end_of_line, cursor_to
+       and after_update_window_hook.
+       (x_write_glyphs, x_insert_glyphs, x_clear_end_of_line, x_cursor_to):
+       Adjust prototypes.
+       * dispnew.c (updated_window): Remove.
+       (redraw_overlapped_rows, update_marginal_area, update_text_area)
+       (update_window_line): Adjust to match redisplay interface changes.
+       * nsterm.m (ns_update_window_begin, ns_update_window_end)
+       (ns_scroll_run, ns_after_update_window_line):
+       * w32term.c (x_update_window_begin, x_update_window_end)
+       (x_after_update_window_line, x_scroll_run):
+       * xterm.c (x_update_window_begin, x_update_window_end)
+       (x_after_update_window_line, x_scroll_run):
+       * xdisp.c (x_write_glyphs, x_insert_glyphs, x_clear_end_of_line):
+       Likewise.  Adjust comments where appropriate.
+       (x_cursor_to): Simplify because this is always called during window
+       update (but install debugging check anyway).
+       (expose_window): Check must_be_updated_p flag to see whether this
+       function is called during window update.
+
+2013-08-08  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Do not reset window modification event counters excessively.
+       These leftovers and poor man's tricky methods to catch extra
+       redisplay's attention are no longer needed.
+       * frame.c (set_menu_bar_lines_1):
+       * minibuf.c (read_minibuf_unwind):
+       * window.c (Fset_window_start, set_window_buffer, window_resize_apply)
+       (grow_mini_window, shrink_mini_window, window_scroll_pixel_based)
+       (window_scroll_line_based, Fset_window_configuration):
+       * xdisp.c (redisplay_window): Do not reset last_modified and
+       last_overlay_modified counters.
+
 2013-08-07  Jan Djärv  <jan.h.d@swipnet.se>
 
        * xselect.c (x_send_client_event): Set send_event and serial, memset