[cairo-commit] src/cairo-bentley-ottmann-rectangular.c src/cairo-png.c
Uli Schlachter
psychon at kemper.freedesktop.org
Sat Dec 23 12:09:21 UTC 2017
src/cairo-bentley-ottmann-rectangular.c | 8 +-------
src/cairo-png.c | 17 ++++++-----------
2 files changed, 7 insertions(+), 18 deletions(-)
New commits:
commit 82f4028532c11152a0110f1b277e3358dfca6545
Author: Uli Schlachter <psychon at znc.in>
Date: Sat Dec 23 13:04:59 2017 +0100
Revert "fix warning: variable X might be clobbered by 'longjmp'"
This reverts commit b092b63119cbfe3cb4bc786eee81630998996acf 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.
diff --git a/src/cairo-bentley-ottmann-rectangular.c b/src/cairo-bentley-ottmann-rectangular.c
index 15688c74..29f902c1 100644
--- a/src/cairo-bentley-ottmann-rectangular.c
+++ b/src/cairo-bentley-ottmann-rectangular.c
@@ -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);
diff --git a/src/cairo-png.c b/src/cairo-png.c
index fe23fcf9..596b506a 100644
--- a/src/cairo-png.c
+++ b/src/cairo-png.c
@@ -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);
More information about the cairo-commit
mailing list