From: Colin Leroy Date: Tue, 11 Sep 2012 19:35:27 +0000 (+0000) Subject: 2012-09-11 [colin] 3.8.1cvs49 X-Git-Tag: REL_3_9_0~75 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=02471d74f30e3f743b52b4ca52b6c6dda04e3f4b 2012-09-11 [colin] 3.8.1cvs49 * src/main.c Fix race condition at start. --- diff --git a/ChangeLog b/ChangeLog index ad4a7cbd3..1c207f907 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-09-11 [colin] 3.8.1cvs49 + + * src/main.c + Fix race condition at start. + 2012-09-10 [colin] 3.8.1cvs48 * src/main.c diff --git a/PATCHSETS b/PATCHSETS index 309243e0a..84eb8639f 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -4423,3 +4423,4 @@ ( cvs diff -u -r 1.100.2.83 -r 1.100.2.84 AUTHORS; cvs diff -u -r 1.155.2.101 -r 1.155.2.102 src/Makefile.am; cvs diff -u -r 1.12.2.72 -r 1.12.2.73 src/action.c; cvs diff -u -r 1.27.2.63 -r 1.27.2.64 src/addr_compl.c; cvs diff -u -r 1.22.2.28 -r 1.22.2.29 src/addrbook.c; cvs diff -u -r 1.382.2.609 -r 1.382.2.610 src/compose.c; cvs diff -u -r 1.50.2.67 -r 1.50.2.68 src/compose.h; cvs diff -u -r 1.14.2.63 -r 1.14.2.64 src/editaddress.c; cvs diff -u -r 1.60.2.63 -r 1.60.2.64 src/filtering.c; cvs diff -u -r 1.213.2.209 -r 1.213.2.210 src/folder.c; cvs diff -u -r 1.87.2.66 -r 1.87.2.67 src/folder.h; cvs diff -u -r 1.20.2.29 -r 1.20.2.30 src/folderview.h; cvs diff -u -r 1.2.2.8 -r 1.2.2.9 src/headerview.h; cvs diff -u -r 1.1.2.71 -r 1.1.2.72 src/imap_gtk.c; cvs diff -u -r 1.3.4.9 -r 1.3.4.10 src/localfolder.c; cvs diff -u -r 1.115.2.253 -r 1.115.2.254 src/main.c; cvs diff -u -r 1.274.2.349 -r 1.274.2.350 src/mainwindow.c; cvs diff -u -r 1.39.2.64 -r 1.39.2.65 src/mainwindow.h; cvs diff -u -r 1.75.2.73 -r 1.75.2.74 src/matcher.c; cvs diff -u -r 1.25.2.35 -r 1.25.2.36 src/matcher_parser_parse.y; cvs diff -u -r 1.94.2.238 -r 1.94.2.239 src/messageview.c; cvs diff -u -r 1.19.2.32 -r 1.19.2.33 src/messageview.h; cvs diff -u -r 1.79.2.74 -r 1.79.2.75 src/mh.c; cvs diff -u -r 1.2.2.43 -r 1.2.2.44 src/mh_gtk.c; cvs diff -u -r 1.83.2.193 -r 1.83.2.194 src/mimeview.c; cvs diff -u -r 1.20.2.38 -r 1.20.2.39 src/mimeview.h; cvs diff -u -r 1.3.8.12 -r 1.3.8.13 src/noticeview.h; cvs diff -u -r 1.105.2.174 -r 1.105.2.175 src/prefs_account.c; cvs diff -u -r 1.49.2.49 -r 1.49.2.50 src/prefs_account.h; cvs diff -u -r 1.59.2.91 -r 1.59.2.92 src/prefs_filtering.c; cvs diff -u -r 1.1.4.77 -r 1.1.4.78 src/prefs_filtering_action.c; cvs diff -u -r 1.5.2.21 -r 1.5.2.22 src/prefs_gtk.h; cvs diff -u -r 1.43.2.95 -r 1.43.2.96 src/prefs_matcher.c; cvs diff -u -r 1.12.2.81 -r 1.12.2.82 src/prefs_template.c; cvs diff -u -r 1.30.2.72 -r 1.30.2.73 src/prefs_toolbar.c; cvs diff -u -r 1.10.2.27 -r 1.10.2.28 src/privacy.c; cvs diff -u -r 1.11.2.14 -r 1.11.2.15 src/procheader.h; cvs diff -u -r 1.49.2.148 -r 1.49.2.149 src/procmime.c; cvs diff -u -r 1.17.2.29 -r 1.17.2.30 src/procmime.h; cvs diff -u -r 1.150.2.125 -r 1.150.2.126 src/procmsg.c; cvs diff -u -r 1.60.2.63 -r 1.60.2.64 src/procmsg.h; diff -u /dev/null src/proctypes.h; cvs diff -u -r 1.1.4.10 -r 1.1.4.11 src/remotefolder.c; cvs diff -u -r 1.395.2.451 -r 1.395.2.452 src/summaryview.c; cvs diff -u -r 1.68.2.60 -r 1.68.2.61 src/summaryview.h; cvs diff -u -r 1.96.2.246 -r 1.96.2.247 src/textview.c; cvs diff -u -r 1.12.2.34 -r 1.12.2.35 src/textview.h; cvs diff -u -r 1.43.2.129 -r 1.43.2.130 src/toolbar.c; cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/uri_opener.c; diff -u /dev/null src/viewtypes.h; cvs diff -u -r 1.9.2.58 -r 1.9.2.59 src/common/defs.h; cvs diff -u -r 1.1.2.79 -r 1.1.2.80 src/gtk/authors.h; cvs diff -u -r 1.5.2.35 -r 1.5.2.36 src/gtk/description_window.c; cvs diff -u -r 1.14.2.82 -r 1.14.2.83 src/plugins/trayicon/trayicon.c; ) > 3.8.1cvs46.patchset ( cvs diff -u -r 1.1.2.43 -r 1.1.2.44 src/plugins/bogofilter/bogofilter.c; ) > 3.8.1cvs47.patchset ( cvs diff -u -r 1.115.2.254 -r 1.115.2.255 src/main.c; ) > 3.8.1cvs48.patchset +( cvs diff -u -r 1.115.2.255 -r 1.115.2.256 src/main.c; ) > 3.8.1cvs49.patchset diff --git a/configure.ac b/configure.ac index e27246bec..0134d5103 100644 --- a/configure.ac +++ b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=8 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=48 +EXTRA_VERSION=49 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/main.c b/src/main.c index c01d236fc..ef0a31e54 100644 --- a/src/main.c +++ b/src/main.c @@ -45,6 +45,10 @@ #include #endif +#if HAVE_FLOCK +#include +#endif + #include "wizard.h" #ifdef HAVE_STARTUP_NOTIFICATION # define SN_API_NOT_YET_FROZEN @@ -2301,14 +2305,51 @@ static gint prohibit_duplicate_launch(void) gchar *path; path = claws_get_socket_name(); + /* Try to connect to the control socket */ uxsock = fd_connect_unix(path); if (x_display == NULL) x_display = g_strdup(g_getenv("DISPLAY")); if (uxsock < 0) { +#if HAVE_FLOCK + gchar *socket_lock; + gint lock_fd; + gint ret; + /* If connect failed, no other process is running. + * Unlink the potentially existing socket, then + * open it. This has to be done locking a temporary + * file to avoid the race condition where another + * process could have created the socket just in + * between. + */ + socket_lock = g_strconcat(path, ".lock", + NULL); + lock_fd = g_open(socket_lock, O_RDWR|O_CREAT, 0); + if (lock_fd < 0) { + debug_print("Couldn't open %s: %s (%d)\n", socket_lock, + strerror(errno), errno); + g_free(socket_lock); + return -1; + } + if (flock(lock_fd, LOCK_EX) < 0) { + debug_print("Couldn't lock %s: %s (%d)\n", socket_lock, + strerror(errno), errno); + close(lock_fd); + g_free(socket_lock); + return -1; + } +#endif + claws_unlink(path); - return fd_open_unix(path); + debug_print("Opening socket %s\n", path); + ret = fd_open_unix(path); +#if HAVE_FLOCK + flock(lock_fd, LOCK_UN); + claws_unlink(socket_lock); + g_free(socket_lock); +#endif + return ret; } #else HANDLE hmutex;