Overflow, signedness and related fixes for images.
[bpt/emacs.git] / src / ChangeLog
index c9706aa..680e67e 100644 (file)
@@ -1,13 +1,99 @@
-2011-07-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-       * bidi.c (bidi_dump_cached_states): Use pD to print ptrdiff_t.
+2011-07-16  Paul Eggert  <eggert@cs.ucla.edu>
+
+       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-14  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Integer signedness and overflow and related fixes.  (Bug#9079)
+
+       * bidi.c: Integer size and overflow fixes.
+       (bidi_cache_size, bidi_cache_idx, bidi_cache_last_idx)
+       (bidi_cache_start, bidi_cache_fetch_state, bidi_cache_search)
+       (bidi_cache_find_level_change, bidi_cache_ensure_space)
+       (bidi_cache_iterator_state, bidi_cache_find, bidi_cache_start_stack)
+       (bidi_find_other_level_edge):
+       Use ptrdiff_t instead of EMACS_INT where either will do.
+       This works better on 32-bit hosts configured --with-wide-int.
+       (bidi_cache_ensure_space): Check for size-calculation overflow.
+       Use % rather than repeated addition, for better worst-case speed.
+       Don't set bidi_cache_size until after xrealloc returns, because it
+       might not return.
+       (bidi_dump_cached_states): Use ptrdiff_t, not int, to avoid overflow.
+
+       * alloc.c (__malloc_size_t): Remove.
+       All uses replaced by size_t.  See Andreas Schwab's note
+       <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9079#8>.
+
+       * image.c: Improve checking for integer overflow.
+       (check_image_size): Assume that f is nonnull, since
+       it is always nonnull in practice.  This is one less thing to
+       worry about when checking for integer overflow later.
+       (x_check_image_size): New function, which checks for integer
+       overflow issues inside X.
+       (x_create_x_image_and_pixmap, xbm_read_bitmap_data): Use it.
+       This removes the need for a memory_full check.
+       (xbm_image_p): Rewrite to avoid integer multiplication overflow.
+       (Create_Pixmap_From_Bitmap_Data, xbm_load): Use x_check_image_size.
+       (xbm_read_bitmap_data): Change locals back to 'int', since
+       their values must fit in 'int'.
+       (xpm_load_image, png_load, tiff_load):
+       Invoke x_create_x_image_and_pixmap earlier,
+       to avoid much needless work if the image is too large.
+       (tiff_load): Treat overly large images as if
+       x_create_x_image_and_pixmap failed, not as malloc failures.
+       (gs_load): Use x_check_image_size.
+
+       * gtkutil.c: Omit integer casts.
+       (xg_get_pixbuf_from_pixmap): Remove unnecessary cast.
+       (xg_set_toolkit_scroll_bar_thumb): Rewrite to avoid need for cast.
+
+       * image.c (png_load): Don't assume height * row_bytes fits in 'int'.
 
        * xfaces.c (Fbitmap_spec_p): Fix integer overflow bug.
        Without this fix, (bitmap-spec-p '(34359738368 1 "x"))
        would wrongly return t on a 64-bit host.
 
-2011-07-11  Paul Eggert  <eggert@cs.ucla.edu>
-
        * dispnew.c (init_display): Use *_RANGE_OVERFLOW macros.
        The plain *_OVERFLOW macros run afoul of GCC bug 49705
        <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49705>
        Use ptrdiff_t rather than size_t when either will do, as we prefer
        signed integers.
 
-       * bidi.c: Integer signedness and overflow fixes.
-       (bidi_cache_idx, bidi_cache_last_idx, bidi_cache_fetch_state)
-       (bidi_cache_search, bidi_cache_find_level_change)
-       (bidi_cache_iterator_state, bidi_cache_find, bidi_find_other_level_edge)
-       (bidi_dump_cached_states):
-       Don't arbitrarily limit cache indexes to int; use ptrdiff_t instead.
-       (bidi_cache_size): Use ptrdiff_t rather than size_t, as we prefer
-       signed integers.
-       (elsz): Make it a (signed) constant.
-       (bidi_cache_iterator_state): Check for size-calculation overflow.
-
        * alloc.c: Integer signedness and overflow fixes.
        Do not impose an arbitrary 32-bit limit on malloc sizes when debugging.
        (__malloc_size_t): Default to size_t, not to int.
        * gmalloc.c (memcpy, memset, memmove): Remove; we assume C89 now.
        (__malloc_safe_bcopy): Remove; no longer needed.
 
-       * lisp.h (struct vectorlike_header, struct Lisp_Subr):  Signed sizes.
+       * lisp.h (struct vectorlike_header, struct Lisp_Subr): Signed sizes.
        Use EMACS_INT, not EMACS_UINT, for sizes.  The code works equally
        well either way, and we prefer signed to unsigned.
 
+2011-07-14  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Fix minor problems found by static checking.
+       * bidi.c (bidi_cache_size): Now EMACS_INT, not size_t.
+       (elsz): Now a signed constant, not a size_t var.  We prefer signed
+       types to unsigned, to avoid integer comparison confusion.  Without
+       this change, GCC 4.6.1 with -Wunsafe-loop-optimizations complains
+       "cannot optimize loop, the loop counter may overflow", a symptom
+       of the confusion.
+       * indent.c (Fvertical_motion): Mark locals as initialized.
+       * xdisp.c (reseat_to_string): Fix pointer signedness issue.
+
+2011-07-14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * data.c (Fcdr, Fcar): Revert the last change, since it didn't
+       really clarify much.
+
+       * search.c (Fre_search_backward): Mention `case-fold-search' in
+       all the re_search_* functions (bug#8138).
+
+       * keyboard.c (Fopen_dribble_file): Document when the file is
+       closed (bug#8056).
+
+2011-07-14  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c (bidi_dump_cached_states): Fix format of displaying
+       bidi_cache_idx.
+
+       Support bidi reordering of display and overlay strings.
+       * xdisp.c (compute_display_string_pos)
+       (compute_display_string_end): Accept additional argument STRING.
+       (init_iterator, reseat_1): Initialize bidi_it->string.s to NULL.
+       (reseat_to_string): Initialize bidi_it->string.s and
+       bidi_it->string.schars.
+       (Fcurrent_bidi_paragraph_direction): Initialize itb.string.s to
+       NULL (avoids a crash in bidi_paragraph_init).  Initialize
+       itb.string.lstring.
+       (init_iterator): Call bidi_init_it only of a valid
+       buffer position was specified.  Initialize paragraph_embedding to
+       L2R.
+       (reseat_to_string): Initialize the bidi iterator.
+       (display_string): If we need to ignore text properties of
+       LISP_STRING, set IT->stop_charpos to IT->end_charpos.  (The
+       original value of -1 will not work with bidi.)
+       (compute_display_string_pos): First arg is now struct
+       `text_pos *'; all callers changed.  Support display properties on
+       Lisp strings.
+       (compute_display_string_end): Support display properties on Lisp
+       strings.
+       (init_iterator, reseat_1, reseat_to_string): Initialize the
+       string.bufpos member to 0 (zero, for compatibility with IT_CHARPOS
+       when iterating on a string not from display properties).
+       (compute_display_string_pos, compute_display_string_end): Fix
+       calculation of the object to scan.  Fixes an error when using
+       arrow keys.
+       (next_element_from_buffer): Don't abort when IT_CHARPOS is before
+       base_level_stop; instead, set base_level_stop to BEGV.  Fixes
+       crashes in vertical-motion.
+       (next_element_from_buffer): Improve commentary for when
+       the iterator is before prev_stop.
+       (init_iterator): Initialize bidi_p from the default value of
+       bidi-display-reordering, not from buffer-local value.  Use the
+       buffer-local value only if initializing for buffer iteration.
+       (handle_invisible_prop): Support invisible properties on strings
+       that are being bidi-reordered.
+       (set_iterator_to_next): Support bidi reordering of C strings and
+       Lisp strings.
+       (next_element_from_string): Support bidi reordering of Lisp
+       strings.
+       (handle_stop_backwards): Support Lisp strings as well.
+       (display_string): Support display of R2L glyph rows.  Use
+       IT_STRING_CHARPOS when displaying from a Lisp string.
+       (init_iterator): Don't initialize it->bidi_p for strings
+       here.
+       (reseat_to_string): Initialize it->bidi_p for strings here.
+       (next_element_from_string, next_element_from_c_string)
+       (next_element_from_buffer): Add xassert's for correspondence
+       between IT's object being iterated and it->bidi_it.string
+       structure.
+       (face_before_or_after_it_pos): Support bidi iteration.
+       (next_element_from_c_string): Handle the case of the first string
+       character that is not the first one in the visual order.
+       (get_visually_first_element): New function, refactored from common
+       parts of next_element_from_buffer, next_element_from_string, and
+       next_element_from_c_string.
+       (tool_bar_lines_needed, redisplay_tool_bar)
+       (display_menu_bar): Force left-to-right direction.  Add a FIXME
+       comment for making that be controlled by a user option.
+       (push_it, pop_it): Save and restore the state of the
+       bidi iterator.  Save and restore the bidi_p flag.
+       (pop_it): Iterate out of display property for string iteration as
+       well.
+       (iterate_out_of_display_property): Support iteration over strings.
+       (handle_single_display_spec): Set up it->bidi_it for iteration
+       over a display string, and call bidi_init_it.
+       (handle_single_display_spec, next_overlay_string)
+       (get_overlay_strings_1, push_display_prop): Set up the bidi
+       iterator for displaying display or overlay strings.
+       (forward_to_next_line_start): Don't use the shortcut if
+       bidi-iterating.
+       (back_to_previous_visible_line_start): If handle_display_prop
+       pushed the iterator stack, restore the internal state of the bidi
+       iterator by calling bidi_pop_it same number of times.
+       (reseat_at_next_visible_line_start): If ON_NEWLINE_P is non-zero,
+       and we are bidi-iterating, don't decrement the iterator position;
+       instead, set the first_elt flag in the bidi iterator, to produce
+       the same effect.
+       (reseat_1): Remove redundant setting of string_from_display_prop_p.
+       (push_display_prop): xassert that we are iterating a buffer.
+       (push_it, pop_it): Save and restore paragraph_embedding member.
+       (handle_single_display_spec, next_overlay_string)
+       (get_overlay_strings_1, reseat_1, reseat_to_string)
+       (push_display_prop): Set up the `unibyte' member of bidi_it.string
+       correctly.  Don't assume unibyte strings are not bidi-reordered.
+       (compute_display_string_pos)
+       (compute_display_string_end): Fix handling the case of C string.
+       (push_it, pop_it): Save and restore from_disp_prop_p.
+       (handle_single_display_spec, push_display_prop): Set the
+       from_disp_prop_p flag.
+       (get_overlay_strings_1): Reset the from_disp_prop_p flag.
+       (pop_it): Call iterate_out_of_display_property only if we are
+       popping after iteration over a string that came from a display
+       property.  Fix a typo in popping stretch info.  Add an assertion
+       for verifying that the iterator position is in sync with the bidi
+       iterator.
+       (handle_single_display_spec, get_overlay_strings_1)
+       (push_display_prop): Fix initialization of paragraph direction for
+       string when that of the parent object is not yet determined.
+       (reseat_1): Call bidi_init_it to resync the bidi
+       iterator with IT's position.  (Bug#7616)
+       (find_row_edges): If ROW->start.pos gives position
+       smaller than min_pos, use it as ROW->minpos.  (Bug#7616)
+       (handle_stop, back_to_previous_visible_line_start, reseat_1):
+       Reset the from_disp_prop_p flag.
+       (SAVE_IT, RESTORE_IT): New macros.
+       (pos_visible_p, face_before_or_after_it_pos)
+       (back_to_previous_visible_line_start)
+       (move_it_in_display_line_to, move_it_in_display_line)
+       (move_it_to, move_it_vertically_backward, move_it_by_lines)
+       (try_scrolling, redisplay_window, display_line): Use them when
+       saving a temporary copy of the iterator and restoring it back.
+       (back_to_previous_visible_line_start, reseat_1)
+       (init_iterator): Empty the bidi cache "stack".
+       (move_it_in_display_line_to): If iterator ended up at
+       EOL, but we never saw any buffer positions smaller than
+       to_charpos, return MOVE_POS_MATCH_OR_ZV.  Fixes vertical cursor
+       motion in bidi-reordered lines.
+       (move_it_in_display_line_to): Record prev_method and prev_pos
+       immediately before the call to set_iterator_to_next.  Fixes cursor
+       motion in bidi-reordered lines with stretch glyphs and strings
+       displayed in margins.  (Bug#8133) (Bug#8867)
+       Return MOVE_POS_MATCH_OR_ZV only if iterator position is past
+       TO_CHARPOS.
+       (pos_visible_p): Support positions in bidi-reordered lines.  Save
+       and restore bidi cache.
+
+       * bidi.c (bidi_level_of_next_char): clen should be EMACS_NT, not int.
+       (bidi_paragraph_info): Delete unused struct.
+       (bidi_cache_idx, bidi_cache_last_idx): Declare EMACS_INT.
+       (bidi_cache_start): New variable.
+       (bidi_cache_reset): Reset bidi_cache_idx to bidi_cache_start, not
+       to zero.
+       (bidi_cache_fetch_state, bidi_cache_search)
+       (bidi_cache_find_level_change, bidi_cache_iterator_state)
+       (bidi_cache_find, bidi_peek_at_next_level)
+       (bidi_level_of_next_char, bidi_find_other_level_edge)
+       (bidi_move_to_visually_next): Compare cache index with
+       bidi_cache_start rather than with zero.
+       (bidi_fetch_char): Accept new argument STRING; all callers
+       changed.  Support iteration over a string.  Support strings with
+       display properties.  Support unibyte strings.  Fix the type of
+       `len' according to what STRING_CHAR_AND_LENGTH expects.
+       (bidi_paragraph_init, bidi_resolve_explicit_1)
+       (bidi_resolve_explicit, bidi_resolve_weak)
+       (bidi_level_of_next_char, bidi_move_to_visually_next): Support
+       iteration over a string.
+       (bidi_set_sor_type, bidi_resolve_explicit_1)
+       (bidi_resolve_explicit, bidi_type_of_next_char): ignore_bn_limit
+       can now be zero (for strings); special values 0 and -1 were
+       changed to -1 and -2, respectively.
+       (bidi_char_at_pos): New function.
+       (bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak):
+       Call it instead of FETCH_MULTIBYTE_CHAR.
+       (bidi_move_to_visually_next): Abort if charpos or bytepos were not
+       initialized to valid values.
+       (bidi_init_it): Don't initialize charpos and bytepos with invalid
+       values.
+       (bidi_level_of_next_char): Allow the sentinel "position" to pass
+       the test for valid cached positions.  Fix the logic for looking up
+       the sentinel state in the cache.  GCPRO the Lisp string we are
+       iterating.
+       (bidi_push_it, bidi_pop_it): New functions.
+       (bidi_initialize): Initialize the bidi cache start stack pointer.
+       (bidi_cache_ensure_space): New function, refactored from part of
+       bidi_cache_iterator_state.  Don't assume the required size is just
+       one BIDI_CACHE_CHUNK away.
+       (bidi_cache_start_stack, bidi_push_it): Use IT_STACK_SIZE.
+       (bidi_count_bytes, bidi_char_at_pos): New functions.
+       (bidi_cache_search): Don't assume bidi_cache_last_idx is
+       always valid if bidi_cache_idx is valid.
+       (bidi_cache_find_level_change): xassert that bidi_cache_last_idx
+       is valid if it's going to be used.
+       (bidi_shelve_cache, bidi_unshelve_cache): New functions.
+       (bidi_cache_fetch_state, bidi_cache_search)
+       (bidi_cache_find_level_change, bidi_cache_ensure_space)
+       (bidi_cache_iterator_state, bidi_cache_find)
+       (bidi_find_other_level_edge, bidi_cache_start_stack): All
+       variables related to cache indices are now EMACS_INT.
+
+       * dispextern.h (struct bidi_string_data): New structure.
+       (struct bidi_it): New member `string'.  Make flag members be 1-bit
+       fields, and put them last in the struct.
+       (compute_display_string_pos, compute_display_string_end): Update
+       prototypes.
+       (bidi_push_it, bidi_pop_it): Add prototypes.
+       (struct iterator_stack_entry): New members bidi_p,
+       paragraph_embedding, and from_disp_prop_p.
+       (struct it): Member bidi_p is now a bit field 1 bit wide.
+       (bidi_shelve_cache, bidi_unshelve_cache): Declare
+       prototypes.
+
+       * .gdbinit (xvectype, xvector, xcompiled, xchartable, xboolvector)
+       (xpr, xfont, xbacktrace): Use "header.size" when accessing vectors
+       and vector-like objects.
+
+       * dispnew.c (buffer_posn_from_coords): Save and restore the bidi
+       cache around display iteration.
+
+       * window.c (Fwindow_end, window_scroll_pixel_based)
+       (displayed_window_lines, Frecenter): Save and restore the bidi
+       cache around display iteration.
+
+2011-07-14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * editfns.c (Fdelete_region): Clarify the use of the named
+       parameters (bug#6788).
+
+2011-07-14  Martin Rudalics  <rudalics@gmx.at>
+
+       * indent.c (Fvertical_motion): Set and restore w->pointm when
+       saving and restoring the window's buffer (Bug#9006).
+
+2011-07-13  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * editfns.c (Fstring_to_char): Clarify just what is returned
+       (bug#6576).  Text by Eli Zaretskii.
+
+2011-07-13  Juanma Barranquero  <lekktu@gmail.com>
+
+       * gnutls.c (init_gnutls_functions): Honor gnutls_log_level (bug#9059).
+
+2011-07-13  Eli Zaretskii  <eliz@gnu.org>
+
+       * buffer.c (mmap_find): Fix a typo.
+
+2011-07-13  Johan Bockgård  <bojohan@gnu.org>
+
+       Fix execution of x selection hooks.
+       * xselect.c (Qx_lost_selection_functions)
+       (Qx_sent_selection_functions): New vars.
+       (syms_of_xselect): DEFSYM them.
+       (x_handle_selection_request): Pass Qx_sent_selection_functions
+       rather than Vx_sent_selection_functions to Frun_hook_with_args.
+       (x_handle_selection_clear,x_clear_frame_selections):
+       Pass Qx_lost_selection_functions rather than
+       Vx_lost_selection_functions to Frun_hook_with_args.
+
+2011-07-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * buffer.c (Fget_buffer_create): Initialize inhibit_shrinking.
+       The old code sometimes used this field without initializing it.
+
+       * alloc.c (gc_sweep): Don't read past end of array.
+       In theory, the old code could also have corrupted Emacs internals,
+       though it'd be very unlikely.
+
+2011-07-12  Andreas Schwab  <schwab@linux-m68k.org>
+
+       * character.c (Fcharacterp): Don't advertise optional ignored
+       argument.  (Bug#4026)
+
+2011-07-12  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * keymap.c (syms_of_keymap): Clarify that "modifier" is "modifier
+       key" (bug#4257).
+
+       * window.c (Fset_window_start): Doc fix (bug#4199).
+       (Fset_window_hscroll): Ditto.
+
+2011-07-12  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Fix minor new problems caught by GCC 4.6.1.
+       * term.c (init_tty): Remove unused local.
+       * xsettings.c (store_monospaced_changed): Define this function only
+       if (defined HAVE_GSETTINGS || defined HAVE_GCONF), as it's
+       not used otherwise.
+
+2011-07-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * xdisp.c (Vresize_mini_windows): Minor doc fix (Bug#3300).
+
 2011-07-11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * xdisp.c (syms_of_xdisp): Make it explicit that the mini-windows
        (char_table_ascii): Uncompress the compressed values.
        (sub_char_table_ref): New arg is_uniprop.  Callers changed.
        Uncompress the compressed values.
-       (sub_char_table_ref_and_range):  Likewise.
+       (sub_char_table_ref_and_range): Likewise.
        (char_table_ref_and_range): Uncompress the compressed values.
        (sub_char_table_set): New arg is_uniprop.  Callers changed.
        Uncompress the compressed values.
        (xpm_put_color_table_h):
        * lisp.h (struct Lisp_Hash_Table):
        * minibuf.c (Ftry_completion, Fall_completions, Ftest_completion):
-       * print.c (print):  Use 'EMACS_UINT' and 'EMACS_INT'
+       * print.c (print): Use 'EMACS_UINT' and 'EMACS_INT'
        for hashes and hash indexes, instead of 'unsigned' and 'int'.
        * alloc.c (allocate_vectorlike):
        Check for overflow in vector size calculations.
 
        * dispnew.c (shift_glyph_matrix, scrolling_window): Mark scrolled row
        for fringe update if it has periodic bitmap.
-       (row_equal_p): Also compare left_fringe_offset, right_fringe_offset,
+       (row_equal_p): Also compare left_fringe_offset, right_fringe_offset,
        and fringe_bitmap_periodic_p.
 
        * fringe.c (get_fringe_bitmap_data): New function.