RSS/Atom feed Twitter
Site is read-only, email is disabled

Bit rot in GEGL examples

This discussion is connected to the gegl-developer-list.gnome.org mailing list which is provided by the GIMP developers and not related to gimpusers.com.

This is a read-only list on gimpusers.com so this discussion thread is read-only, too.

1 of 1 message available
Toggle history

Please log in to manage your subscriptions.

Bit rot in GEGL examples Klaus Pedersen 25 Feb 17:23
Klaus Pedersen
2010-02-25 17:23:52 UTC (almost 15 years ago)

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