2012-09-11 [colin] 3.8.1cvs49
authorColin Leroy <colin@colino.net>
Tue, 11 Sep 2012 19:35:27 +0000 (19:35 +0000)
committerColin Leroy <colin@colino.net>
Tue, 11 Sep 2012 19:35:27 +0000 (19:35 +0000)
* src/main.c
Fix race condition at start.

ChangeLog
PATCHSETS
configure.ac
src/main.c

index ad4a7cbd3dcd484b4b9ff118a0a467dc9d6e6b7a..1c207f907bb54728182e17978925897096dbb697 100644 (file)
--- 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
index 309243e0aac7d8f95819898fdcb58cbfa856fb21..84eb8639f93da44937437945a0862331780c33b2 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index e27246bec97c39641e277e0c003172cd6e40e52d..0134d51039f000759ecc79e4307b4a8c69ca2f5e 100644 (file)
@@ -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=
 
index c01d236fcaca7bcb3ba13e47db24cae8c7cdcfb3..ef0a31e54c4a8d1d1f3d4c46c0c924b095bed93b 100644 (file)
 #include <X11/SM/SMlib.h>
 #endif
 
+#if HAVE_FLOCK
+#include <sys/file.h>
+#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;