summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2016-10-14 13:41:26 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-11-08 23:47:13 +0000
commit6962ee368906e096cf2df3031ca5142117e7c52a (patch)
treef1c63d713bcc10cb30256c9655d1c1d5164eee4a
parent191666022aec6105296a7cead4ee5dc892c288cd (diff)
downloadpoky-6962ee368906e096cf2df3031ca5142117e7c52a.tar.gz
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] (From OE-Core rev: 84de3283fa2a2908d367eb58953903ae685b0298) (From OE-Core rev: 1ae228ee5181f12955356c1fe10d341373dd5fcc) Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/rpm/rpm/rpmdb-more-verbose-error-logging-in-rpmTempFile.patch26
-rw-r--r--meta/recipes-devtools/rpm/rpm/rpmdb-prevent-race-in-tmpdir-creation.patch41
-rw-r--r--meta/recipes-devtools/rpm/rpm_5.4.16.bb1
3 files changed, 44 insertions, 24 deletions
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]
5Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com> 5Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
6 6
7diff --git a/rpmdb/signature.c b/rpmdb/signature.c 7diff --git a/rpmdb/signature.c b/rpmdb/signature.c
8index dce6c4e..a1d0f06 100644 8index 100204b..e56ab3d 100644
9--- a/rpmdb/signature.c 9--- a/rpmdb/signature.c
10+++ b/rpmdb/signature.c 10+++ b/rpmdb/signature.c
11@@ -37,6 +37,7 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr) 11@@ -72,12 +72,16 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr)
12 int temput;
13 FD_t fd = NULL;
14 unsigned int ran;
15+ int ret = 0;
16
17 if (!prefix) prefix = "";
18
19@@ -44,8 +45,11 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr)
20 if (!_initialized) {
21 _initialized = 1;
22 tempfn = rpmGenPath(prefix, tpmacro, NULL);
23- if (rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1))
24- goto errxit;
25+ ret = rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1);
26+ if (ret) {
27+ rpmlog(RPMLOG_ERR, _("error creating temporary directory %s: %d\n"), tempfn, ret);
28+ goto errxit;
29+ }
30 }
31
32 /* XXX should probably use mkstemp here */
33@@ -68,12 +72,16 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr)
34 #endif 12 #endif
35 13
36 temput = urlPath(tempfn, &tfn); 14 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 @@
1rpmdb: prevent race in tmpdir creation
2
3If two (or more) instances of rpm are running at the same time they may
4be trying to create the same (base-)temporary directory at the same time
5which causes the other mkdir to fail with EEXIST. This patch prevents a
6failure caused by this race by ignoring EEXIST error on directory
7creation.
8
9Upstream-Status: Pending
10
11Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
12
13diff --git a/rpmdb/signature.c b/rpmdb/signature.c
14index dce6c4e..100204b 100644
15--- a/rpmdb/signature.c
16+++ b/rpmdb/signature.c
17@@ -37,6 +37,7 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr)
18 int temput;
19 FD_t fd = NULL;
20 unsigned int ran;
21+ int ret = 0;
22
23 if (!prefix) prefix = "";
24
25@@ -44,8 +45,11 @@ int rpmTempFile(const char * prefix, const char ** fnptr, void * fdptr)
26 if (!_initialized) {
27 _initialized = 1;
28 tempfn = rpmGenPath(prefix, tpmacro, NULL);
29- if (rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1))
30- goto errxit;
31+ ret = rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1);
32+ if (ret && ret != EEXIST) {
33+ rpmlog(RPMLOG_ERR, _("error creating temporary directory %s: %d\n"), tempfn, ret);
34+ goto errxit;
35+ }
36 }
37
38 /* XXX should probably use mkstemp here */
39--
402.6.6
41
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.16.bb b/meta/recipes-devtools/rpm/rpm_5.4.16.bb
index 71ebace730..eb2d4f9c94 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 += " \
154 file://rpm-rpmdb-grammar.patch \ 154 file://rpm-rpmdb-grammar.patch \
155 file://rpm-disable-blaketest.patch \ 155 file://rpm-disable-blaketest.patch \
156 file://rpm-autogen-force.patch \ 156 file://rpm-autogen-force.patch \
157 file://rpmdb-prevent-race-in-tmpdir-creation.patch \
157 file://rpmdb-more-verbose-error-logging-in-rpmTempFile.patch \ 158 file://rpmdb-more-verbose-error-logging-in-rpmTempFile.patch \
158" 159"
159 160