From b092b63119cbfe3cb4bc786eee81630998996acf Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Sat, 21 Oct 2017 13:02:42 +1030 Subject: [PATCH] fix warning: variable X might be clobbered by 'longjmp' Move calls to setjmp into separate function to avoid clobbering local variables. --- src/cairo-bentley-ottmann-rectangular.c | 8 +++++++- src/cairo-png.c | 17 +++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/cairo-bentley-ottmann-rectangular.c b/src/cairo-bentley-ottmann-rectangular.c index 29f902c1a..15688c744 100644 --- a/src/cairo-bentley-ottmann-rectangular.c +++ b/src/cairo-bentley-ottmann-rectangular.c @@ -593,6 +593,12 @@ 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, @@ -609,7 +615,7 @@ _cairo_bentley_ottmann_tessellate_rectangular (rectangle_t **rectangles, rectangles, num_rectangles, fill_rule, do_traps, container); - if ((status = setjmp (sweep_line.unwind))) + if ((status = sweep_line_setjmp (&sweep_line))) return status; rectangle = rectangle_pop_start (&sweep_line); diff --git a/src/cairo-png.c b/src/cairo-png.c index 562b7439f..eab2537bc 100644 --- a/src/cairo-png.c +++ b/src/cairo-png.c @@ -158,6 +158,14 @@ 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. */ @@ -229,10 +237,8 @@ write_png (cairo_surface_t *surface, goto BAIL4; } -#ifdef PNG_SETJMP_SUPPORTED - if (setjmp (png_jmpbuf (png))) + if (png_setjmp (png)) goto BAIL4; -#endif png_set_write_fn (png, closure, write_func, png_simple_output_flush_fn); @@ -573,12 +579,11 @@ read_png (struct png_read_closure_t *png_closure) png_set_read_fn (png, png_closure, stream_read_func); status = CAIRO_STATUS_SUCCESS; -#ifdef PNG_SETJMP_SUPPORTED - if (setjmp (png_jmpbuf (png))) { + + if (png_setjmp (png)) { surface = _cairo_surface_create_in_error (status); goto BAIL; } -#endif png_read_info (png, info);