Revert "fix warning: variable X might be clobbered by 'longjmp'"

This reverts commit b092b63119 which
introduced a wrapper function around setjmp(). To quote from man setjmp:

  If the function which called setjmp() returns before longjmp() is
  called, the behavior is undefined.  Some kind of subtle or unsubtle
  chaos is sure to result.

Since after the above commit setjmp() is called from the wrapper
function, the result might or might not work, depending on compiler
settings. If the setjmp() wrapper is not inlined, then the state of the
stack after longjmp() will likely be garbage.
This commit is contained in:
Uli Schlachter 2017-12-23 13:04:59 +01:00
parent 3e07efd21e
commit 82f4028532
2 changed files with 7 additions and 18 deletions

View file

@ -593,12 +593,6 @@ sweep_line_insert (sweep_line_t *sweep, rectangle_t *rectangle)
pqueue_push (sweep, rectangle);
}
static int
sweep_line_setjmp (sweep_line_t *sweep_line)
{
return setjmp (sweep_line->unwind);
}
static cairo_status_t
_cairo_bentley_ottmann_tessellate_rectangular (rectangle_t **rectangles,
int num_rectangles,
@ -615,7 +609,7 @@ _cairo_bentley_ottmann_tessellate_rectangular (rectangle_t **rectangles,
rectangles, num_rectangles,
fill_rule,
do_traps, container);
if ((status = sweep_line_setjmp (&sweep_line)))
if ((status = setjmp (sweep_line.unwind)))
return status;
rectangle = rectangle_pop_start (&sweep_line);

View file

@ -158,14 +158,6 @@ png_simple_warning_callback (png_structp png,
*/
}
static int
png_setjmp (png_struct *png)
{
#ifdef PNG_SETJMP_SUPPORTED
return setjmp (png_jmpbuf (png));
#endif
return 0;
}
/* Starting with libpng-1.2.30, we must explicitly specify an output_flush_fn.
* Otherwise, we will segfault if we are writing to a stream. */
@ -237,8 +229,10 @@ write_png (cairo_surface_t *surface,
goto BAIL4;
}
if (png_setjmp (png))
#ifdef PNG_SETJMP_SUPPORTED
if (setjmp (png_jmpbuf (png)))
goto BAIL4;
#endif
png_set_write_fn (png, closure, write_func, png_simple_output_flush_fn);
@ -584,11 +578,12 @@ read_png (struct png_read_closure_t *png_closure)
png_set_read_fn (png, png_closure, stream_read_func);
status = CAIRO_STATUS_SUCCESS;
if (png_setjmp (png)) {
#ifdef PNG_SETJMP_SUPPORTED
if (setjmp (png_jmpbuf (png))) {
surface = _cairo_surface_create_in_error (status);
goto BAIL;
}
#endif
png_read_info (png, info);