]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: unix: do not unlink() abstract namespace sockets upon failure.
authorJan Seda <hodor@hodor.cz>
Thu, 26 Jun 2014 18:44:05 +0000 (20:44 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 2 Jul 2014 15:57:28 +0000 (17:57 +0200)
When bind() fails (function uxst_bind_listener()), the fail path doesn't
consider the abstract namespace and tries to unlink paths held in
uninitiliazed memory (tempname and backname). See the strace excerpt;
the strings still hold the path from test1.

===============================================================================================
23722 bind(5, {sa_family=AF_FILE, path=@"test2"}, 110) = -1 EADDRINUSE (Address already in use)
23722 unlink("/tmp/test1.sock.23722.tmp") = -1 ENOENT (No such file or directory)
23722 close(5)                          = 0
23722 unlink("/tmp/test1.sock.23722.bak") = -1 ENOENT (No such file or directory)
===============================================================================================

This patch should be backported to 1.5.

src/proto_uxst.c

index f83d34e1198c1bf9ac5d515ad84ab826951df390..c9a52ff499eb5d40e8b4116fbb8204983ea61190 100644 (file)
@@ -309,11 +309,11 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle
        if (ret < 0 && errno == ENOENT)
                unlink(path);
  err_unlink_temp:
-       if (!ext)
+       if (!ext && path[0])
                unlink(tempname);
        close(fd);
  err_unlink_back:
-       if (!ext)
+       if (!ext && path[0])
                unlink(backname);
  err_return:
        if (msg && errlen) {