[PATCH v2 4/3] debuginfod: create libdebuginfod files using a race-free method

Dmitry V. Levin ldv@altlinux.org
Sun Dec 6 14:44:46 GMT 2020


Before this change, both the soname and the fully versioned
libdebuginfod file name were created after libdebuginfod.so, opening
a race for all libdebuginfod users that have Makefile dependencies
on libdebuginfod.so but actually use libdebuginfod.so.1 or the fully
versioned libdebuginfod file name.

After this change, the libdebuginfod.so symlink is created the last
of all libdebuginfod files, closing the race.
---
 debuginfod/ChangeLog   |  4 ++++
 debuginfod/Makefile.am | 12 ++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog
index 27abdfda..03eabb6b 100644
--- a/debuginfod/ChangeLog
+++ b/debuginfod/ChangeLog
@@ -1,5 +1,9 @@
 2020-12-06  Dmitry V. Levin  <ldv@altlinux.org>
 
+	* Makefile.am [LIBDEBUGINFOD]: Create the fully versioned
+	libdebuginfod file name first, turn the soname and libdebuginfod.so
+	into symlinks.
+
 	* Makefile.am (LIBDEBUGINFOD_FULL_NAME): New variable.
 	(libdebuginfod.so): Use it to create the fully versioned file name.
 	(install, uninstall): Replace libdebuginfod-$(PACKAGE_VERSION).so with
diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am
index 7df66125..b667ad6d 100644
--- a/debuginfod/Makefile.am
+++ b/debuginfod/Makefile.am
@@ -101,21 +101,25 @@ else
 libdebuginfod_so_LDLIBS = $(libcurl_LIBS) $(fts_LIBS)
 endif
 LIBDEBUGINFOD_FULL_NAME = libdebuginfod-$(PACKAGE_VERSION).so
-libdebuginfod.so: $(srcdir)/libdebuginfod.map $(libdebuginfod_so_LIBS)
+$(LIBDEBUGINFOD_FULL_NAME): $(srcdir)/libdebuginfod.map $(libdebuginfod_so_LIBS)
 	$(AM_V_CCLD)$(LINK) $(dso_LDFLAGS) -o $@ \
 		-Wl,--soname,$(LIBDEBUGINFOD_SONAME) \
 		-Wl,--version-script,$<,--no-undefined \
 		-Wl,--whole-archive $(libdebuginfod_so_LIBS) -Wl,--no-whole-archive \
 		$(libdebuginfod_so_LDLIBS)
 	@$(textrel_check)
-	$(AM_V_at)ln -fs $@ $(LIBDEBUGINFOD_FULL_NAME)
-	$(AM_V_at)ln -fs $@ $(LIBDEBUGINFOD_SONAME)
+
+$(LIBDEBUGINFOD_SONAME): $(LIBDEBUGINFOD_FULL_NAME)
+	ln -fs $< $@
+
+libdebuginfod.so: $(LIBDEBUGINFOD_SONAME)
+	ln -fs $< $@
 endif
 
 if LIBDEBUGINFOD
 install: install-am libdebuginfod.so
 	$(mkinstalldirs) $(DESTDIR)$(libdir)
-	$(INSTALL_PROGRAM) libdebuginfod.so $(DESTDIR)$(libdir)/$(LIBDEBUGINFOD_FULL_NAME)
+	$(INSTALL_PROGRAM) $(LIBDEBUGINFOD_FULL_NAME) $(DESTDIR)$(libdir)/
 	ln -fs $(LIBDEBUGINFOD_FULL_NAME) $(DESTDIR)$(libdir)/$(LIBDEBUGINFOD_SONAME)
 	ln -fs $(LIBDEBUGINFOD_FULL_NAME) $(DESTDIR)$(libdir)/libdebuginfod.so
 
-- 
ldv


More information about the Elfutils-devel mailing list