Ticket #177 (closed defect: fixed)

Opened 1 year ago

Last modified 9 months ago

rpmsq portability issues with pthread mutex type assumptions

Reported by: pmatilai Assigned to: RpmTickets
Priority: minor Milestone:
Component: rpm Version: RPM Development
Keywords: Cc: gary.quakenbush@hp.com

Description

Description of problem (originally reported as RhBug:591732) by Gary Quakenbush:

The rpmsq.c check for PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL appears to have no effect except to break portability. The default mutex type appears to not matter here, because the mutex type is set in INIT_LOCK macro to PTHREAD_MUTEX_RECURSIVE. In fact, checking for _NORMAL default type conflicts with always setting type to _RECURSIVE.

One possible fix would be to remove lines 16-20 of rpmsq.c. Or to fix this only for HP-UX builds, line 17 could be changed to:

#if !defined(__hpux) && PTHREAD_MUTEX_DEFAULT != PTHREAD_MUTEX_NORMAL

Version-Release number of selected component (if applicable): rpm 4.8.0

How reproducible: Compile in HP-UX 11iv2 environment

Actual results: An HP-UX 11iv2 build of rpm 4.8.0 breaks with this msg: rpmsq.c:18:4: error: #error RPM expects PTHREAD_MUTEX_DEFAULT == PTHREAD_MUTEX_NORMAL

Expected results: No error during build.

Additional info: Pertinent rpmsq.c code from rpm 4.8.0:

16  /* XXX suggested in bugzilla #159024 */
17  #if PTHREAD_MUTEX_DEFAULT != PTHREAD_MUTEX_NORMAL
18    #error RPM expects PTHREAD_MUTEX_DEFAULT == PTHREAD_MUTEX_NORMAL
19  #endif
20
21  #ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
22  static pthread_mutex_t rpmsigTbl_lock = PTHREAD_MUTEX_INITIALIZER;
23  #else
24  static pthread_mutex_t rpmsigTbl_lock =
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
25  #endif
26
27  #define DO_LOCK()       pthread_mutex_lock(&rpmsigTbl_lock);
28  #define DO_UNLOCK()     pthread_mutex_unlock(&rpmsigTbl_lock);
29  #define INIT_LOCK()     \
30      {   pthread_mutexattr_t attr; \
31          (void) pthread_mutexattr_init(&attr); \
32          (void) pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
33          (void) pthread_mutex_init (&rpmsigTbl_lock, &attr); \
34          (void) pthread_mutexattr_destroy(&attr); \
35          rpmsigTbl_sigchld->active = 0; \
36      }    

Change History

(follow-up: ↓ 3 ) 08/13/10 11:09:36 changed by pmatilai

Just removing the offending test wont fix it: INIT_LOCK() is only used by rpmsqExecve() which in turn is not used by rpm at all. AFAICS all the pthread_mutex_init() paths need to be fixed to specify explicit mutex type before the check can be removed.

08/13/10 16:07:22 changed by garyq

  • cc set to gary.quakenbush@hp.com.

(in reply to: ↑ 1 ) 08/13/10 16:15:49 changed by garyq

Replying to pmatilai:

Just removing the offending test wont fix it: INIT_LOCK() is only used by rpmsqExecve() which in turn is not used by rpm at all. AFAICS all the pthread_mutex_init() paths need to be fixed to specify explicit mutex type before the check can be removed.

Yes, that makes sense if the bug#159024 assertion about requiring a value of NORMAL everywhere except INIT_LOCK is valid.

05/17/11 09:36:56 changed by pmatilai

  • status changed from new to closed.
  • resolution set to fixed.

Fixed in HEAD now by chainsawing most of the over-complex machinery in rpmsq out: http://rpm.org/gitweb?p=rpm.git;a=commitdiff;h=269df02ae1fc3955bee4e5f471b1172c04c714e2