[FFmpeg-user] x11grab segfault when display is closed
Moritz Barsnick
barsnick at gmx.net
Tue Jun 26 14:42:59 EEST 2018
On Tue, Jun 26, 2018 at 00:35:19 +0200, Carl Eugen Hoyos wrote:
> > # ./ffmpeg -an -f x11grab -framerate 10 -video_size 1280x1024 -i :13
> > /tmp/cap.mp4
> > However, if ffmpeg is still running when the display (:13 in the above
> > command) is closed, ffmpeg segfaults.
>
> Please provide backtrace, disassembly and register dump to
> allow us to debug the issue you see.
Without providing that (too lazy, and I'm not the original poster), I
can tell you that I can reporduce this, and it happens in this code in
libavdevice/xcbgrab.c:xcbgrab_read_packet():
if (c->follow_mouse || c->draw_mouse) {
pc = xcb_query_pointer(c->conn, c->screen->root);
gc = xcb_get_geometry(c->conn, c->screen->root);
p = xcb_query_pointer_reply(c->conn, pc, NULL);
geo = xcb_get_geometry_reply(c->conn, gc, NULL);
}
if (c->follow_mouse && p->same_screen)
xcbgrab_reposition(s, p, geo);
if (c->show_region)
xcbgrab_update_region(s);
#if CONFIG_LIBXCB_SHM
if (c->has_shm && xcbgrab_frame_shm(s, pkt) < 0)
c->has_shm = 0;
#endif
if (!c->has_shm)
ret = xcbgrab_frame(s, pkt);
#if CONFIG_LIBXCB_XFIXES
if (ret >= 0 && c->draw_mouse && p->same_screen)
xcbgrab_draw_mouse(s, pkt, p, geo);
#endif
I get a crash at "if (ret >= 0 && c->draw_mouse && p->same_screen)"
because p is NULL. Presumably, all those xcb_*() functions at the top
of my quote can return NULL if the display is no longer accessible:
(gdb) p p
$2 = (xcb_query_pointer_reply_t *) 0x0
(gdb) p geo
$3 = (xcb_get_geometry_reply_t *) 0x0
(gdb) p pc
$4 = {sequence = 1247}
(gdb) p gc
$5 = {sequence = 1248}
The xcbgrab code probably needs to detect this and somehow generate
EOF.
(To reproduce:
Terminal 1:
$ Xvfb :1 -nolisten tcp -screen 0 800x600x24
Terminal 2:
$ ffmpeg -f x11grab -i :1 -f null -
or rather
$ gdb -ex r --args ffmpeg_g -f x11grab -i :1 -f null -
Then terminate Xvfb while ffmpeg is running.)
Cheers,
Moritz
More information about the ffmpeg-user
mailing list