diff --git a/rpm-4.4.2-rpmsq-deadlock.patch b/rpm-4.4.2-rpmsq-deadlock.patch new file mode 100644 index 0000000..6bd5c7a --- /dev/null +++ b/rpm-4.4.2-rpmsq-deadlock.patch @@ -0,0 +1,115 @@ +--- rpm-4.4.2/rpmio/rpmsq.c.deadlock 2005-07-13 06:47:03.000000000 -0400 ++++ rpm-4.4.2/rpmio/rpmsq.c 2006-01-30 21:00:13.000000000 -0500 +@@ -218,7 +218,6 @@ + + sq->id = ME(); + ret = pthread_mutex_init(&sq->mutex, NULL); +- ret = pthread_cond_init(&sq->cond, NULL); + insque(elem, (prev != NULL ? prev : rpmsqQueue)); + ret = sigrelse(SIGCHLD); + } +@@ -240,8 +239,11 @@ + ret = sighold (SIGCHLD); + if (ret == 0) { + remque(elem); +- ret = pthread_cond_destroy(&sq->cond); +- ret = pthread_mutex_destroy(&sq->mutex); ++ ++ /* Unlock the mutex and then destroy it */ ++ if((ret = pthread_mutex_unlock(&sq->mutex)) == 0) ++ ret = pthread_mutex_destroy(&sq->mutex); ++ + sq->id = NULL; + /*@-bounds@*/ + if (sq->pipes[1]) ret = close(sq->pipes[1]); +@@ -315,11 +317,20 @@ + sq != NULL && sq != rpmsqQueue; + sq = sq->q_forw) + { ++ int ret; ++ + if (sq->child != reaped) + /*@innercontinue@*/ continue; + sq->reaped = reaped; + sq->status = status; +- (void) pthread_cond_signal(&sq->cond); ++ ++ /* Unlock the mutex. The waiter will then be able to ++ * aquire the lock. ++ * ++ * XXX: jbj, wtd, if this fails? ++ */ ++ ret = pthread_mutex_unlock(&sq->mutex); ++ + /*@innerbreak@*/ break; + } + } +@@ -391,6 +402,7 @@ + { + pid_t pid; + int xx; ++ int nothreads = 0; /* XXX: Shouldn't this be a global? */ + + if (sq->reaper) { + xx = rpmsqInsert(sq, NULL); +@@ -405,6 +417,24 @@ + + xx = sighold(SIGCHLD); + ++ /* ++ * Initialize the cond var mutex. We have to aquire the lock we ++ * use for the condition before we fork. Otherwise it is possible for ++ * the child to exit, we get sigchild and the sig handler to send ++ * the condition signal before we are waiting on the condition. ++ */ ++ if (!nothreads) { ++ if(pthread_mutex_lock(&sq->mutex)) { ++ /* Yack we did not get the lock, lets just give up */ ++/*@-bounds@*/ ++ xx = close(sq->pipes[0]); ++ xx = close(sq->pipes[1]); ++ sq->pipes[0] = sq->pipes[1] = -1; ++/*@=bounds@*/ ++ goto out; ++ } ++ } ++ + pid = fork(); + if (pid < (pid_t) 0) { /* fork failed. */ + /*@-bounds@*/ +@@ -462,10 +492,6 @@ + /* Protect sq->reaped from handler changes. */ + ret = sighold(SIGCHLD); + +- /* Initialize the cond var mutex. */ +- if (!nothreads) +- ret = pthread_mutex_lock(&sq->mutex); +- + /* Start the child, linux often runs child before parent. */ + /*@-bounds@*/ + if (sq->pipes[0] >= 0) +@@ -486,7 +512,13 @@ + ret = sigpause(SIGCHLD); + else { + xx = sigrelse(SIGCHLD); +- ret = pthread_cond_wait(&sq->cond, &sq->mutex); ++ ++ /* ++ * We start before the fork with this mutex locked; ++ * The only one that unlocks this the signal handler. ++ * So if we get the lock the child has been reaped. ++ */ ++ ret = pthread_mutex_lock(&sq->mutex); + xx = sighold(SIGCHLD); + } + } +@@ -495,9 +527,6 @@ + /* Accumulate stopwatch time spent waiting, potential performance gain. */ + sq->ms_scriptlets += rpmswExit(&sq->op, -1)/1000; + +- /* Tear down cond var mutex, our child has been reaped. */ +- if (!nothreads) +- xx = pthread_mutex_unlock(&sq->mutex); + xx = sigrelse(SIGCHLD); + + #ifdef _RPMSQ_DEBUG diff --git a/rpm.spec b/rpm.spec index d40e9cb..778fcfe 100644 --- a/rpm.spec +++ b/rpm.spec @@ -20,7 +20,7 @@ Name: rpm %define version 4.4.2 Version: %{version} %{expand: %%define rpm_version %{version}} -Release: 14 +Release: 15 Group: System Environment/Base Source: ftp://wraptastic.org/pub/rpm-4.4.x/rpm-%{rpm_version}.tar.gz Source1: mono-find-provides @@ -44,6 +44,7 @@ Patch15: rpm-4.4.2-mono.patch Patch16: rpm-4.4.2-file-softmagic.patch Patch17: rpm-4.4.2-no-large-mmap.patch Patch18: rpm-4.4.2-perlmainprov.patch +Patch19: rpm-4.4.2-rpmsq-deadlock.patch License: GPL Conflicts: patch < 2.5 %ifos linux @@ -174,6 +175,7 @@ shell-like rules. %patch16 -p1 -b .magic %patch17 -p1 -b .no_large_mmap %patch18 -p1 -b .perlmainprov +%patch19 -p1 -b .deadlock %build @@ -566,6 +568,10 @@ exit 0 %{__includedir}/popt.h %changelog +* Mon Jan 30 2006 Paul Nasrat - 4.4.2-15 +- Rebuild for newer neon +- Fix scriptlet deadlock (#146549) + * Wed Jan 18 2006 Paul Nasrat - 4.4.2-14 - Don't emit perl(main) (#177960)