Merge from trunk.
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 29 Jul 2011 05:31:12 +0000 (22:31 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 29 Jul 2011 05:31:12 +0000 (22:31 -0700)
13 files changed:
1  2 
src/ChangeLog
src/buffer.c
src/callproc.c
src/editfns.c
src/frame.c
src/image.c
src/lread.c
src/nsmenu.m
src/nsterm.h
src/nsterm.m
src/xdisp.c
src/xfaces.c
src/xfns.c

diff --cc src/ChangeLog
- 2011-07-19  Paul Eggert  <eggert@cs.ucla.edu>
 +2011-07-29  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Integer and memory overflow issues.
 +
 +      * bidi.c (bidi_shelve_header_size): New constant.
 +      (bidi_cache_ensure_space, bidi_shelve_cache): Use it.
 +      (bidi_cache_ensure_space): Avoid integer overflow when allocating.
 +
 +      * buffer.c (overlays_at, overlays_in, record_overlay_string)
 +      (overlay_strings):
 +      Don't update size of array until after memory allocation succeeds,
 +      because xmalloc/xrealloc may not return.
 +
 +      * callproc.c (child_setup): Don't assume strlen fits in int.
 +
 +      * ccl.c (Fccl_execute_on_string): Check for memory overflow.
 +      Use ptrdiff_t rather than EMACS_INT where ptrdiff_t will do.
 +      Redo buffer-overflow calculations to avoid integer overflow.
 +
 +      * character.c (Fstring): Check for size-calculation overflow.
 +
 +      * coding.c (produce_chars): Redo buffer-overflow calculations to avoid
 +      unnecessary integer overflow.  Check for size overflow.
 +      (encode_coding_object): Don't update size until xmalloc succeeds.
 +
 +      * composite.c (get_composition_id): Check for overflow in glyph
 +      length calculations.
 +
 +      Integer and memory overflow fixes for display code.
 +      * dispextern.h (struct glyph_pool.nglyphs): Now ptrdiff_t, not int.
 +      * dispnew.c (adjust_glyph_matrix, realloc_glyph_pool)
 +      (scrolling_window): Check for overflow in size calculations.
 +      (line_draw_cost, realloc_glyph_pool, add_row_entry):
 +      Don't assume glyph table len fits in int.
 +      (struct row_entry.bucket, row_entry_pool_size, row_entry_idx)
 +      (row_table_size): Now ptrdiff_t, not int.
 +      (scrolling_window): Avoid overflow in size calculations.
 +      Don't update size until allocation succeeds.
 +      * fns.c (concat): Check for overflow in size calculations.
 +      (next_almost_prime): Verify NEXT_ALMOST_PRIME_LIMIT.
 +      * lisp.h (RANGED_INTEGERP, TYPE_RANGED_INTEGERP): New macros.
 +      (NEXT_ALMOST_PRIME_LIMIT): New constant.
 +
 +      * doc.c (get_doc_string_buffer_size): Now ptrdiff_t, not int.
 +      (get_doc_string): Check for size calculation overflow.
 +      Don't update size until allocation succeeds.
 +      (get_doc_string, Fsubstitute_command_keys): Use ptrdiff_t, not
 +      EMACS_INT, where ptrdiff_t will do.
 +      (Fsubstitute_command_keys): Check for string overflow.
 +
 +      * editfns.c (set_time_zone_rule): Don't assume environment length
 +      fits in int.
 +      (message_length): Now ptrdiff_t, not int.
 +      (Fmessage_box): Don't update size until allocation succeeds.
 +      Don't assume message length fits in int.
 +      (Fformat): Use ptrdiff_t, not EMACS_INT, where ptrdiff_t will do.
 +
 +      * emacs.c (main, sort_args): Check for size-calculation overflow.
 +
 +      * eval.c (init_eval_once, grow_specpdl): Don't update size until
 +      alloc succeeds.
 +      (call_debugger, grow_specpdl): Redo calculations to avoid overflow.
 +
 +      * frame.c (set_menu_bar_lines, x_set_frame_parameters)
 +      (x_set_scroll_bar_width, x_figure_window_size):
 +      Check for integer overflow.
 +      (x_set_alpha): Do not assume XINT fits in int.
 +
 +      * frame.h (struct frame): Use int, not EMACS_INT, where int works.
 +      This is for the members text_lines, text_cols, total_lines, total_cols,
 +      where the system imposes an 'int' limit.
 +
 +      * fringe.c (Fdefine_fringe_bitmap):
 +      Don't update size until alloc works.
 +
 +      * ftfont.c (ftfont_get_open_type_spec, setup_otf_gstring)
 +      (ftfont_shape_by_flt): Check for integer overflow in size calculations.
 +
 +      * gtkutil.c (get_utf8_string, xg_store_widget_in_map):
 +      Check for size-calculation overflow.
 +      (get_utf8_string): Use ptrdiff_t, not size_t, where either will
 +      do, as we prefer signed integers.
 +      (id_to_widget.max_size, id_to_widget.used)
 +      (xg_store_widget_in_map, xg_remove_widget_from_map)
 +      (xg_get_widget_from_map, xg_get_scroll_id_for_window)
 +      (xg_remove_scroll_bar, xg_update_scrollbar_pos):
 +      Use and return ptrdiff_t, not int.
 +      (xg_gtk_scroll_destroy): Don't assume ptrdiff_t fits in int.
 +      * gtkutil.h: Change prototypes to match the above.
 +
 +      * image.c (RANGED_INTEGERP, TYPE_RANGED_INTEGERP): Remove; these
 +      are duplicate now that they've been promoted to lisp.h.
 +      (x_allocate_bitmap_record, x_alloc_image_color)
 +      (make_image_cache, cache_image, xpm_load):
 +      Don't update size until alloc is done.
 +      (xpm_load, lookup_rgb_color, lookup_pixel_color, x_to_xcolors)
 +      (x_detect_edges):
 +      Check for size calculation overflow.
 +      (ct_colors_allocated_max): New constant.
 +      (x_to_xcolors, x_detect_edges): Reorder multiplicands to avoid
 +      overflow.
 +
 +      * keyboard.c (read_char, menu_bar_items, tool_bar_items)
 +      (read_char_x_menu_prompt, read_char_minibuf_menu_width)
 +      (read_char_minibuf_menu_prompt, follow_key, read_key_sequence):
 +      Use ptrdiff_t, not int, to count maps.
 +      (read_char_minibuf_menu_prompt): Check for overflow in size
 +      calculations.  Don't update size until allocation succeeds.  Redo
 +      calculations to avoid overflow.
 +      * keyboard.h: Change prototypes to match the above.
 +
 +      * keymap.c (cmm_size, current_minor_maps): Use ptrdiff_t, not int,
 +      to count maps.
 +      (current_minor_maps): Check for size calculation overflow.
 +      * keymap.h: Change prototypes to match the above.
 +
 +      * lread.c (read1, init_obarray): Don't update size until alloc done.
 +
 +      * macros.c (Fstart_kbd_macro): Don't update size until alloc done.
 +      (store_kbd_macro_char): Reorder multiplicands to avoid overflow.
 +
 +      * minibuf.c (read_minibuf_noninteractive): Don't leak memory
 +      on memory overflow.
 +
 +      * nsterm.h (struct ns_color_table.size, struct ns_color_table.avail):
 +      Now ptrdiff_t, not int.
 +      * nsterm.m (ns_index_color): Use ptrdiff_t, not int, for table indexes.
 +      (ns_draw_fringe_bitmap): Rewrite to avoid overflow.
 +
 +      * process.c (Fnetwork_interface_list): Check for overflow
 +      in size calculation.
 +
 +      * region-cache.c (move_cache_gap): Check for size calculation overflow.
 +
 +      * scroll.c (do_line_insertion_deletion_costs): Check for size calc
 +      overflow.  Don't bother calling xmalloc when xrealloc will do.
 +
 +      * search.c (Freplace_match): Check for size calculation overflow.
 +      (Fset_match_data): Don't assume list lengths fit in 'int'.
 +
 +      * sysdep.c (system_process_attributes): Use ptrdiff_t, not int,
 +      for command line length.  Do not attempt to address one before the
 +      beginning of an array, as that's not portable.
 +
 +      * term.c (max_frame_lines): Remove; unused.
 +      (encode_terminal_src_size, encode_terminal_dst_size): Now ptrdiff_t,
 +      not int.
 +      (encode_terminal_code, calculate_costs): Check for size
 +      calculation overflow.
 +      (encode_terminal_code): Use ptrdiff_t, not int, to record glyph
 +      table lengths and related sizes.  Don't update size until alloc
 +      done.  Redo calculations to avoid overflow.
 +      (calculate_costs): Don't bother calling xmalloc when xrealloc will do.
 +
 +      * termcap.c (tgetent): Use ptrdiff_t, not int, to record results of
 +      subtracting pointers.
 +      (gobble_line): Check for overflow more carefully.  Don't update size
 +      until alloc done.
 +
 +      * tparam.c (tparam1): Use ptrdiff_t, not int, for sizes.
 +      Don't update size until alloc done.
 +      Redo size calculations to avoid overflow.
 +      Check for size calculation overflow.
 +
 +      * xdisp.c (store_mode_line_noprop_char, x_consider_frame_title):
 +      Use ptrdiff_t, not int, for sizes.
 +      (store_mode_line_noprop_char): Don't update size until alloc done.
 +
 +      * xfaces.c (Finternal_make_lisp_face): Use ptrdiff_t, not int, for
 +      sizes.  Check for size calculation overflow.
 +      (cache_face): Do not overflow in size calculation.
 +
 +      * xfns.c (x_encode_text, x_set_name_internal)
 +      (Fx_change_window_property): Use ptrdiff_t, not int, to count
 +      sizes, since they can exceed INT_MAX in size.  Check for size
 +      calculation overflow.
 +
 +      * xgselect.c (xg_select): Check for size calculation overflow.
 +      Don't update size until alloc done.
 +
 +      * xrdb.c (magic_file_p): Plug memory leak on size overflow.
 +      (get_environ_db): Don't assume path length fits in int,
 +      as sprintf is limited to int lengths.
 +
 +      * xselect.c (X_LONG_SIZE, X_USHRT_MAX, X_ULONG_MAX): New macros.
 +      Use them to make the following changes clearer.
 +      (MAX_SELECTION_QUANTUM): Make the other bounds on this value clearer.
 +      This change doesn't affect the value now, but it may help remind
 +      future maintainers not to raise the value too much later.
 +      (SELECTION_QUANTUM): Remove, replacing with ...
 +      (selection_quantum): ... new function, which avoids overflow.
 +      All uses changed.
 +      (struct selection_data.size): Now ptrdiff_t, not int, to avoid
 +      assumption that selection length fits in 'int'.
 +      (x_reply_selection_request, x_handle_selection_request)
 +      (x_get_window_property, receive_incremental_selection)
 +      (x_get_window_property_as_lisp_data, selection_data_to_lisp_data)
 +      (lisp_data_to_selection_data, clean_local_selection_data):
 +      Use ptrdiff_t, not int, to record length of selection.
 +      (x_reply_selection_request, x_get_window_property)
 +      (receive_incremental_selection, x_property_data_to_lisp):
 +      Redo calculations to avoid overflow.
 +      (x_reply_selection_request): When sending hint, ceiling it at
 +      X_ULONG_MAX rather than relying on wraparound overflow to send
 +      something.
 +      (x_get_window_property, receive_incremental_selection)
 +      (lisp_data_to_selection_data, x_property_data_to_lisp):
 +      Check for size-calculation overflow.
 +      (x_get_window_property, receive_incremental_selection)
 +      (lisp_data_to_selection_data, Fx_register_dnd_atom):
 +      Don't store size until memory allocation succeeds.
 +      (x_get_window_property): Plug memory leak on memory exhaustion.
 +      Don't double-block input; malloc is safe here.  Don't assume 2**34
 +      - 4 fits in unsigned long.  Add an xassert to check
 +      XGetWindowProperty overflow.  Be more careful about overflow
 +      calculations, and distinguish size from memory overflow better.
 +      (receive_incremental_selection): When tracing, don't assume
 +      unsigned int is less than INT_MAX.
 +      (x_selection_data_to_lisp_data): Remove unnecessary (and in theory
 +      harmful) conversions of unsigned short to int.
 +      (lisp_data_to_selection_data): Don't assume that integers
 +      in the range -65535 through -1 fit in an X unsigned short.
 +      Don't assume that ULONG_MAX == X_ULONG_MAX.  Don't store into
 +      result parameters unless successful.  Rely on cons_to_unsigned
 +      to report problems with elements; the old code wasn't right anyway.
 +      (x_check_property_data): Check for int overflow; we cannot use
 +      a wider type due to X limits.
 +      (x_handle_dnd_message): Use unsigned int, to avoid int overflow.
 +
 +      * xsmfns.c (smc_save_yourself_CB): Check for size calc overflow.
 +
 +      * xterm.c (x_color_cells, handle_one_xevent, x_term_init):
 +      Check for size calculation overflow.
 +      (x_color_cells): Don't store size until memory allocation succeeds.
 +      (handle_one_xevent): Use ptrdiff_t, not int, for byte counts.
 +      (x_term_init): Don't assume length fits in int (sprintf is limited
 +      to int size).
 +
- 2011-07-19  Paul Eggert  <eggert@cs.ucla.edu>
 +      Use ptrdiff_t for composition IDs.
 +      * character.c (lisp_string_width):
 +      * composite.c (composition_table_size, n_compositions)
 +      (get_composition_id, composition_gstring_from_id):
 +      * dispextern.h (struct glyph_string.cmp_id, struct composition_it.id):
 +      * xdisp.c (BUILD_COMPOSITE_GLYPH_STRING):
 +      * window.c (Frecenter):
 +      Use ptrdiff_t, not int, for composition IDs.
 +      * composite.c (get_composition_id): Check for integer overflow.
 +      * composite.h: Adjust prototypes to match the above changes.
 +
 +      Use ptrdiff_t for hash table indexes.
 +      * category.c (hash_get_category_set):
 +      * ccl.c (ccl_driver):
 +      * charset.h (struct charset.hash_index, CHECK_CHARSET_GET_ID):
 +      * coding.c (coding_system_charset_list, detect_coding_system):
 +      * coding.h (struct coding_system.id):
 +      * composite.c (get_composition_id, gstring_lookup_cache):
 +      * fns.c (hash_lookup, hash_put, Fgethash, Fputhash):
 +      * image.c (xpm_get_color_table_h):
 +      * lisp.h (hash_lookup, hash_put):
 +      * minibuf.c (Ftest_completion):
 +      Use ptrdiff_t for hash table indexes, not int (which is too
 +      narrow, on 64-bit hosts) or EMACS_INT (which is too wide, on
 +      32-bit --with-wide-int hosts).
 +
 +      * charset.c (Fdefine_charset_internal): Check for integer overflow.
 +      Add a FIXME comment about memory leaks.
 +      (syms_of_charset): Don't assume xmalloc returns.
 +
 +      Don't assume that stated character widths fit in int.
 +      * character.c (Fchar_width, c_string_width, lisp_string_width):
 +      * character.h (CHAR_WIDTH):
 +      * indent.c (MULTIBYTE_BYTES_WIDTH):
 +      Use sanitize_char_width to avoid undefined and/or bad behavior
 +      with outlandish widths.
 +      * character.h (sanitize_tab_width): Renamed from sanitize_width,
 +      now that we have two such functions.  All uses changed.
 +      (sanitize_char_width): New inline function.
 +
 +      Don't assume that tab-width fits in int.
 +      * character.h (sanitize_width): New inline function.
 +      (SANE_TAB_WIDTH): New macro.
 +      (ASCII_CHAR_WIDTH): Use it.
 +      * indent.c (sane_tab_width): Remove.  All uses replaced by
 +      SANE_TAB_WIDTH (current_buffer).
 +      * xdisp.c (init_iterator): Use SANE_TAB_WIDTH.
 +
 +      * fileio.c: Integer overflow issues with file modes.
 +      (Fset_file_modes, auto_save_1): Don't assume EMACS_INT fits in int.
 +
 +      * charset.c (read_hex): New arg OVERFLOW.  All uses changed.
 +      Remove unreachable code.
 +      (read_hex, load_charset_map_from_file): Check for integer overflow.
 +
 +      * xterm.c: don't go over XClientMessageEvent limit
 +      (scroll_bar_windows_size): Now ptrdiff_t, as we prefer signed.
 +      (x_send_scroll_bar_event): Likewise.  Check that the size does not
 +      exceed limits imposed by XClientMessageEvent, as well as the usual
 +      ptrdiff_t and size_t limits.
 +
 +      * keyboard.c: Overflow, signedness and related fixes.
 +      (make_lispy_movement): Use same integer type in forward decl
 +      that is used in the definition.
 +      (read_key_sequence, keyremap_step):
 +      Change bufsize argument back to int, undoing my 2011-03-30 change.
 +      We prefer signed types, and int is wide enough here.
 +      (parse_tool_bar_item): Don't assume tool_bar_max_label_size is less
 +      than TYPE_MAXIMUM (EMACS_INT) / 2.  Don't let the label size grow
 +      larger than STRING_BYTES_BOUND.  Use ptrdiff_t for Emacs string
 +      length, not size_t.  Use ptrdiff_t for index, not int.
 +      (keyremap_step, read_key_sequence): Redo bufsize check to avoid
 +      possibility of integer overflow.
 +
 +      Overflow, signedness and related fixes for images.
 +
 +      * dispextern.h (struct it.stack[0].u.image.image_id)
 +      (struct_it.image_id, struct image.id, struct image_cache.size)
 +      (struct image_cache.used, struct image_cache.ref_count):
 +      * gtkutil.c (update_frame_tool_bar):
 +      * image.c (x_reference_bitmap, Fimage_size, Fimage_mask_p)
 +      (Fimage_metadata, free_image_cache, clear_image_cache, lookup_image)
 +      (cache_image, mark_image_cache, x_kill_gs_process, Flookup_image):
 +      * nsmenu.m (update_frame_tool_bar):
 +      * xdisp.c (calc_pixel_width_or_height):
 +      * xfns.c (image_cache_refcount):
 +      Image IDs are now ptrdiff_t, not int, to avoid arbitrary limits
 +      on typical 64-bit hosts.
 +
 +      * image.c (RANGED_INTEGERP, TYPE_RANGED_INTEGERP): New macros.
 +      (x_bitmap_pixmap, x_create_x_image_and_pixmap):
 +      Omit unnecessary casts to int.
 +      (parse_image_spec): Check that integers fall into 'int' range
 +      when the callers expect that.
 +      (image_ascent): Redo ascent calculation to avoid int overflow.
 +      (clear_image_cache): Avoid overflow when sqrt (INT_MAX) < nimages.
 +      (lookup_image): Remove unnecessary tests.
 +      (xbm_image_p): Locals are now of int, not EMACS_INT,
 +      since parse_image_check makes sure they fit into int.
 +      (png_load, gif_load, svg_load_image):
 +      Prefer int to unsigned where either will do.
 +      (tiff_handler): New function, combining the cores of the
 +      old tiff_error_handler and tiff_warning_handler.  This
 +      function is rewritten to use vsnprintf and thereby avoid
 +      stack buffer overflows.  It uses only the features of vsnprintf
 +      that are common to both POSIX and native Microsoft.
 +      (tiff_error_handler, tiff_warning_handler): Use it.
 +      (tiff_load, gif_load, imagemagick_load_image):
 +      Don't assume :index value fits in 'int'.
 +      (gif_load): Omit unnecessary cast to double, and avoid double-rounding.
 +      (imagemagick_load_image): Check that crop parameters fit into
 +      the integer types that MagickCropImage accepts.  Don't assume
 +      Vimagemagick_render_type has a nonnegative value.  Don't assume
 +      size_t fits in 'long'.
 +      (gs_load): Use printmax_t to print the widest integers possible.
 +      Check for integer overflow when computing image height and width.
 +
+ 2011-07-28  Andreas Schwab  <schwab@linux-m68k.org>
+       * print.c (print_object): Print empty symbol as ##.
+       * lread.c (read1): Read ## as empty symbol.
+ 2011-07-28  Alp Aker  <alp.tekin.aker@gmail.com>
+       * nsfns.m (x_set_foreground_color): Set f->foreground_pixel when
+       setting frame foreground color (Bug#9175).
+       (x_set_background_color): Likewise.
+       * nsmenu.m (-setText): Size tooltip dimensions precisely to
+       contents (Bug#9176).
+       (EmacsTooltip -init): Remove bezels and add shadows to
+       tooltip windows.
+       * nsterm.m (ns_dumpglyphs_stretch): Avoid overwriting left fringe
+       or scroll bar (Bug#8470).
+       * nsfont.m (nsfont_open): Remove assignment to voffset and
+       unnecessary vars hshink, expand, hd, full_height, min_height.
+       (nsfont_draw): Use s->ybase as baseline for glyph drawing (Bug#8913).
+       * nsterm.h (nsfont_info): Remove voffset field.
+ 2011-07-28  Alp Aker  <alp.tekin.aker@gmail.com>
+       Implement strike-through and overline on NextStep (Bug#8863).
+       * nsfont.m (nsfont_open): Use underline position provided by font,
+       instead of hard-coded value of 2.
+       (nsfont_draw): Call ns_draw_text_decoration instead.
+       * nsterm.h: Add declaration for ns_draw_text_decoration.
+       * nsterm.m (ns_draw_text_decoration): New function for drawing
+       underline, overline, and strike-through.
+       (ns_dumpglyphs_image, ns_dumpglyphs_stretch): Add call to
+       ns_draw_text_decoration.  Change treatment of cursor drawing to
+       accomodate underlining, etc.
+ 2011-07-28  Eli Zaretskii  <eliz@gnu.org>
+       * buffer.c (init_buffer_once): Set bidi-display-reordering to t by
+       default.
+ 2011-07-28  Paul Eggert  <eggert@cs.ucla.edu>
+       * alloc.c (memory_full) [!SYNC_INPUT]: Fix signal-related race.
+       Without this fix, if a signal arrives just after memory fills up,
+       'malloc' might be invoked reentrantly.
+       * image.c (x_check_image_size) [!HAVE_X_WINDOWS]: Return 1.
+       In other words, assume that every image size is allowed, on non-X
+       hosts.  This assumption is probably wrong, but it lets Emacs compile.
+ 2011-07-28  Andreas Schwab  <schwab@linux-m68k.org>
+       * regex.c (re_iswctype): Convert return values to boolean.
+ 2011-07-28  Eli Zaretskii  <eliz@fencepost.gnu.org>
+       * xdisp.c (compute_display_string_pos): Don't use cached display
+       string position if the buffer had its restriction changed.
+       (Bug#9184)
+ 2011-07-28  Paul Eggert  <eggert@cs.ucla.edu>
+       * callproc.c (Fcall_process): Use 'volatile' to avoid vfork clobbering.
+ 2011-07-28  Paul Eggert  <eggert@cs.ucla.edu>
  
        Integer signedness and overflow and related fixes.  (Bug#9079)
  
diff --cc src/buffer.c
Simple merge
diff --cc src/callproc.c
Simple merge
diff --cc src/editfns.c
Simple merge
diff --cc src/frame.c
Simple merge
diff --cc src/image.c
Simple merge
diff --cc src/lread.c
Simple merge
diff --cc src/nsmenu.m
Simple merge
diff --cc src/nsterm.h
Simple merge
diff --cc src/nsterm.m
Simple merge
diff --cc src/xdisp.c
Simple merge
diff --cc src/xfaces.c
Simple merge
diff --cc src/xfns.c
Simple merge