From: Richard Jones Date: Fri, 10 Jul 2009 10:41:43 +0000 (+0100) Subject: Properly close fds and unregister handlers in guestfs_close. X-Git-Tag: 1.0.57~7 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=03e1f74ee08dc71bc09cc7655bf4732685f80b43;p=libguestfs.git Properly close fds and unregister handlers in guestfs_close. This caused a segfault if you tried to repeatedly open and close a guestfs handle in the same program. The reason is that the old handler remained registered (not always - it was racey). This adds proper cleanup to the guestfs_close path, also for file descriptors. --- diff --git a/src/guestfs.c b/src/guestfs.c index 66ab12a..7ab7200 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -327,6 +327,25 @@ guestfs_close (guestfs_h *g) if (g->state != CONFIG) guestfs_kill_subprocess (g); + /* Close any sockets and deregister any handlers. */ + if (g->stdout_watch >= 0) + g->main_loop->remove_handle (g->main_loop, g, g->stdout_watch); + if (g->sock_watch >= 0) + g->main_loop->remove_handle (g->main_loop, g, g->sock_watch); + g->stdout_watch = -1; + g->sock_watch = -1; + + if (g->fd[0] >= 0) + close (g->fd[0]); + if (g->fd[1] >= 0) + close (g->fd[1]); + if (g->sock >= 0) + close (g->sock); + g->fd[0] = -1; + g->fd[1] = -1; + g->sock = -1; + + /* Remove tmpfiles. */ if (g->tmpdir) { snprintf (filename, sizeof filename, "%s/sock", g->tmpdir); unlink (filename);