GIMP Forums » For GEGL developers
Bit rot in GEGL examples
Jump to message:
- Bit rot in GEGL examples — Klaus Pedersen, 25 Feb 2010 05:23 PM
As a registered user, you can subscribe forum threads in order to get notified when replies are posted. Just log in at the right top of the page if you already have an account, otherwise you can register for free.
| Permalink: | loom.20100225T161010-713@post.gmane.org |
|---|---|
| Date: | 25 Feb 2010 05:23 PM |
| From: | Klaus Pedersen |
| Subject: | Bit rot in GEGL examples |
Hi,
On Klaus Wrote to the gmame robot:
>
> No I am not top-posting!
>
Recently I have been playing with GEGL, the api and design is easy enough but
unfortunately the examples doesn't compile/run any more.
For example:
examples/hello-world.c:
GeglNode *display = gegl_node_create_child (gegl, "gegl:display");
and
examples/hello-world-video.c:
GeglNode *display = gegl_node_new_child (gegl, "operation",
"gegl:ff-save", "path", "test.avi", "bitrate", 1200000.0, NULL);
With these two examples you get runtime errors complaining about the operations
"gegl:display" and "gegl:ff-save" are unknown.
examples/gegl-paint.c:
Running ./paint without parameters terminate with a buffer overflow.
I tried to trace it. Here is how it looks with function traces:
$ ./paint
...
expose_event:441
gegl_view_repaint:505
gegl_view_repaint:511 (roi={0,0,513,513})
*** buffer overflow detected ***: ./paint terminated
======= Backtrace: =========
/lib64/libc.so.6(__fortify_fail+0x37)[0x3b4c4f75e7]
/lib64/libc.so.6[0x3b4c4f5600]
/usr/lib64/libgegl-0.0.so.0(gegl_buffer_header_init+0x54)
Notice that the repaint area in "gegl_view_repaint()" is bigger
than the allocated area. To fix it we can change gegl_view_repaint():
void
gegl_view_repaint (GeglView *view)
{
GtkWidget *widget = GTK_WIDGET (view);
GeglViewPrivate *priv = GEGL_VIEW_GET_PRIVATE (view);
GeglRectangle roi;
GtkAllocation allocation;
roi.x = priv->x / priv->scale;
roi.y = priv->y / priv->scale;
gtk_widget_get_allocation (widget, &allocation);
roi.width = ceil(allocation.width / priv->scale+1);
roi.height = ceil(allocation.height / priv->scale+1);
Should probably be changed to:
+ roi.width = ceil(allocation.width / priv->scale);
+ roi.height = ceil(allocation.height / priv->scale);
Making this change make the program run a little longer. But still
crash after flashing the window on the screen:
$ ./paint
...
gegl_view_class_init:105
gegl_view_init:176
gegl_view_repaint:513
gegl_view_repaint:519 (roi={0,0,1,1})
expose_event:447
gegl_view_repaint:513
gegl_view_repaint:519 (roi={0,0,512,512})
*** buffer overflow detected ***: ./paint terminated
======= Backtrace: =========
/lib64/libc.so.6(__fortify_fail+0x37)[0x3b4c4f75e7]
/lib64/libc.so.6[0x3b4c4f5600]
/usr/lib64/libgegl-0.0.so.0(gegl_buffer_header_init+0x54)[0x34b421b684]
/usr/lib64/libgegl-0.0.so.0[0x34b4226bff]
/usr/lib64/libgegl-0.0.so.0[0x34b4227cd6]
/usr/lib64/libgegl-0.0.so.0[0x34b4229f04]
/usr/lib64/libgegl-0.0.so.0(gegl_tile_store+0x8a)[0x34b422517a]
After removing the call to gegl_buffer_linear_close (buffer, buf)
in main() - the program executes without buffer overflows (why??).
> buf = gegl_buffer_linear_open(buffer, NULL, NULL, babl_format("Y' u8"));
> /* it would be useful to have a programmatic way of doing this */
> memset (buf, 100, 512 * 512);
>// gegl_buffer_linear_close (buffer, buf);
The program can run, but nothing happens on the screen (it's black)...
BR, Klaus
On Klaus Wrote to the gmame robot:
>
> No I am not top-posting!
>
Recently I have been playing with GEGL, the api and design is easy enough but
unfortunately the examples doesn't compile/run any more.
For example:
examples/hello-world.c:
GeglNode *display = gegl_node_create_child (gegl, "gegl:display");
and
examples/hello-world-video.c:
GeglNode *display = gegl_node_new_child (gegl, "operation",
"gegl:ff-save", "path", "test.avi", "bitrate", 1200000.0, NULL);
With these two examples you get runtime errors complaining about the operations
"gegl:display" and "gegl:ff-save" are unknown.
examples/gegl-paint.c:
Running ./paint without parameters terminate with a buffer overflow.
I tried to trace it. Here is how it looks with function traces:
$ ./paint
...
expose_event:441
gegl_view_repaint:505
gegl_view_repaint:511 (roi={0,0,513,513})
*** buffer overflow detected ***: ./paint terminated
======= Backtrace: =========
/lib64/libc.so.6(__fortify_fail+0x37)[0x3b4c4f75e7]
/lib64/libc.so.6[0x3b4c4f5600]
/usr/lib64/libgegl-0.0.so.0(gegl_buffer_header_init+0x54)
Notice that the repaint area in "gegl_view_repaint()" is bigger
than the allocated area. To fix it we can change gegl_view_repaint():
void
gegl_view_repaint (GeglView *view)
{
GtkWidget *widget = GTK_WIDGET (view);
GeglViewPrivate *priv = GEGL_VIEW_GET_PRIVATE (view);
GeglRectangle roi;
GtkAllocation allocation;
roi.x = priv->x / priv->scale;
roi.y = priv->y / priv->scale;
gtk_widget_get_allocation (widget, &allocation);
roi.width = ceil(allocation.width / priv->scale+1);
roi.height = ceil(allocation.height / priv->scale+1);
Should probably be changed to:
+ roi.width = ceil(allocation.width / priv->scale);
+ roi.height = ceil(allocation.height / priv->scale);
Making this change make the program run a little longer. But still
crash after flashing the window on the screen:
$ ./paint
...
gegl_view_class_init:105
gegl_view_init:176
gegl_view_repaint:513
gegl_view_repaint:519 (roi={0,0,1,1})
expose_event:447
gegl_view_repaint:513
gegl_view_repaint:519 (roi={0,0,512,512})
*** buffer overflow detected ***: ./paint terminated
======= Backtrace: =========
/lib64/libc.so.6(__fortify_fail+0x37)[0x3b4c4f75e7]
/lib64/libc.so.6[0x3b4c4f5600]
/usr/lib64/libgegl-0.0.so.0(gegl_buffer_header_init+0x54)[0x34b421b684]
/usr/lib64/libgegl-0.0.so.0[0x34b4226bff]
/usr/lib64/libgegl-0.0.so.0[0x34b4227cd6]
/usr/lib64/libgegl-0.0.so.0[0x34b4229f04]
/usr/lib64/libgegl-0.0.so.0(gegl_tile_store+0x8a)[0x34b422517a]
After removing the call to gegl_buffer_linear_close (buffer, buf)
in main() - the program executes without buffer overflows (why??).
> buf = gegl_buffer_linear_open(buffer, NULL, NULL, babl_format("Y' u8"));
> /* it would be useful to have a programmatic way of doing this */
> memset (buf, 100, 512 * 512);
>// gegl_buffer_linear_close (buffer, buf);
The program can run, but nothing happens on the screen (it's black)...
BR, Klaus
_______________________________________________
Gegl-developer mailing list
Gegl-developer@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gegl-developer
Gegl-developer mailing list
Gegl-developer@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gegl-developer


