From 84de3283fa2a2908d367eb58953903ae685b0298 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Fri, 14 Oct 2016 13:41:26 +0300 Subject: rpm: prevent race in tempdir creation This patch fixes an extramely rare race condition in creation of rpmdb temporary directory. The "rpmdb-more-verbose-error-logging" patch is still left in place, just for the case. [YOCTO #9416] Signed-off-by: Markus Lehtonen Signed-off-by: Ross Burton --- ...more-verbose-error-logging-in-rpmTempFile.patch | 26 ++------------ .../rpmdb-prevent-race-in-tmpdir-creation.patch | 41 ++++++++++++++++++++++ meta/recipes-devtools/rpm/rpm_5.4.16.bb | 1 + 3 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 meta/recipes-devtools/rpm/rpm/rpmdb-prevent-race-in-tmpdir-creation.patch (limited to 'meta/recipes-devtools/rpm') diff --git a/meta/recipes-devtools/rpm/rpm/rpmdb-more-verbose-error-logging-in-rpmTempFile.patch b/meta/recipes-devtools/rpm/rpm/rpmdb-more-verbose-error-logging-in-rpmTempFile.patch index 809e54e9cb..3a6f8746cc 100644 --- a/meta/recipes-devtools/rpm/rpm/rpmdb-more-verbose-error-logging-in-rpmTempFile.patch +++ b/meta/recipes-devtools/rpm/rpm/rpmdb-more-verbose-error-logging-in-rpmTempFile.patch @@ -5,32 +5,10 @@ Upstream-Status: Inappropriate [debugging] Signed-off-by: Markus Lehtonen diff --git a/rpmdb/signature.c b/rpmdb/signature.c -index dce6c4e..a1d0f06 100644 +index 100204b..e56ab3d 100644 --- a/rpmdb/signature.c +++ b/rpmdb/signature.c -@@ -37,6 +37,7 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) - int temput; - FD_t fd = NULL; - unsigned int ran; -+ int ret = 0; - - if (!prefix) prefix = ""; - -@@ -44,8 +45,11 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) - if (!_initialized) { - _initialized = 1; - tempfn = rpmGenPath(prefix, tpmacro, NULL); -- if (rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1)) -- goto errxit; -+ ret = rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1); -+ if (ret) { -+ rpmlog(RPMLOG_ERR, _("error creating temporary directory %s: %d\n"), tempfn, ret); -+ goto errxit; -+ } - } - - /* XXX should probably use mkstemp here */ -@@ -68,12 +72,16 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) +@@ -72,12 +72,16 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) #endif temput = urlPath(tempfn, &tfn); diff --git a/meta/recipes-devtools/rpm/rpm/rpmdb-prevent-race-in-tmpdir-creation.patch b/meta/recipes-devtools/rpm/rpm/rpmdb-prevent-race-in-tmpdir-creation.patch new file mode 100644 index 0000000000..f483f3ad90 --- /dev/null +++ b/meta/recipes-devtools/rpm/rpm/rpmdb-prevent-race-in-tmpdir-creation.patch @@ -0,0 +1,41 @@ +rpmdb: prevent race in tmpdir creation + +If two (or more) instances of rpm are running at the same time they may +be trying to create the same (base-)temporary directory at the same time +which causes the other mkdir to fail with EEXIST. This patch prevents a +failure caused by this race by ignoring EEXIST error on directory +creation. + +Upstream-Status: Pending + +Signed-off-by: Markus Lehtonen + +diff --git a/rpmdb/signature.c b/rpmdb/signature.c +index dce6c4e..100204b 100644 +--- a/rpmdb/signature.c ++++ b/rpmdb/signature.c +@@ -37,6 +37,7 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) + int temput; + FD_t fd = NULL; + unsigned int ran; ++ int ret = 0; + + if (!prefix) prefix = ""; + +@@ -44,8 +45,11 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) + if (!_initialized) { + _initialized = 1; + tempfn = rpmGenPath(prefix, tpmacro, NULL); +- if (rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1)) +- goto errxit; ++ ret = rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1); ++ if (ret && ret != EEXIST) { ++ rpmlog(RPMLOG_ERR, _("error creating temporary directory %s: %d\n"), tempfn, ret); ++ goto errxit; ++ } + } + + /* XXX should probably use mkstemp here */ +-- +2.6.6 + diff --git a/meta/recipes-devtools/rpm/rpm_5.4.16.bb b/meta/recipes-devtools/rpm/rpm_5.4.16.bb index dd6e103b22..1332397120 100644 --- a/meta/recipes-devtools/rpm/rpm_5.4.16.bb +++ b/meta/recipes-devtools/rpm/rpm_5.4.16.bb @@ -154,6 +154,7 @@ SRC_URI += " \ file://rpm-rpmdb-grammar.patch \ file://rpm-disable-blaketest.patch \ file://rpm-autogen-force.patch \ + file://rpmdb-prevent-race-in-tmpdir-creation.patch \ file://rpmdb-more-verbose-error-logging-in-rpmTempFile.patch \ " -- cgit 1.2.3-korg