-2011-07-13 Paul Eggert <eggert@cs.ucla.edu>
+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.
* image.c (png_load): Don't assume height * row_bytes fits in 'int'.
- * bidi.c (bidi_dump_cached_states): Use pD to print ptrdiff_t.
-
* 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.
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.
2011-07-13 Paul Eggert <eggert@cs.ucla.edu>
- * buffer.c (Fget_buffer_create): Initialized inhibit_shrinking.
+ * 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.
2011-07-12 Andreas Schwab <schwab@linux-m68k.org>
* character.c (Fcharacterp): Don't advertise optional ignored
- argument. (Bug#4026)
+ argument. (Bug#4026)
2011-07-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
(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.