123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- https://rt.openssl.org/Ticket/Display.html?id=3780&user=guest&pass=guest
- From cc81af135bda47eaa6956a0329cbbc55bf993ac1 Mon Sep 17 00:00:00 2001
- From: Mike Frysinger <vapier@gentoo.org>
- Date: Fri, 3 Apr 2015 01:16:23 -0400
- Subject: [PATCH] fix race when symlink shareds libs
- When the crypto/ssl targets attempt to build their shared libs, they run:
- cd ..; make libcrypto.so.1.0.0
- The top level Makefile in turn runs the build-shared target for that lib.
- The build-shared target depends on both do_$(SHLIB_TARGET) & link-shared.
- When building in parallel, make is allowed to run both of these. They
- both run Makefile.shared for their respective targets:
- do_$(SHLIB_TARGET) ->
- link_a.linux-shared ->
- link_a.gnu ->
- ...; $(LINK_SO_A) ->
- $(LINK_SO) ->
- $(SYMLINK_SO)
- link-shared ->
- symlink.linux-shared ->
- symlink.gnu ->
- ...; $(SYMLINK_SO)
- The shell code for SYMLINK_SO attempts to do a [ -e lib ] check, but fails
- basic TOCTOU semantics. Depending on the load, that means two processes
- will run the sequence:
- rm -f libcrypto.so
- ln -s libcrypto.so.1.0.0 libcrypto.so
- Which obviously fails:
- ln: failed to create symbolic link 'libcrypto.so': File exists
- Since we know do_$(SHLIB_TARGET) will create the symlink for us, don't
- bother depending on link-shared at all in the top level Makefile when
- building things.
- Reported-by: Martin von Gagern <Martin.vGagern@gmx.net>
- URL: https://bugs.gentoo.org/545028
- ---
- Makefile.org | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
- diff --git a/Makefile.org b/Makefile.org
- index 890bfe4..576c60e 100644
- --- a/Makefile.org
- +++ b/Makefile.org
- @@ -350,7 +350,10 @@ link-shared:
- libs="$$libs -l$$i"; \
- done
-
- -build-shared: do_$(SHLIB_TARGET) link-shared
- +# The link target in Makefile.shared will create the symlink for us, so no need
- +# to call link-shared directly. Doing so will cause races with two processes
- +# trying to symlink the lib.
- +build-shared: do_$(SHLIB_TARGET)
-
- do_$(SHLIB_TARGET):
- @ set -e; libs='-L. $(SHLIBDEPS)'; for i in $(SHLIBDIRS); do \
- --
- 2.3.4
|