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