Pthread mutual exclusion (mutex) locks are used to avoid simultaneous usage of common resources. Several types of mutex locks are defined by pthreads: NORMAL, ERRORCHECK, RECURSIVE, and DEFAULT.
POSIX defines PTHREAD_MUTEX_NORMAL locks to have the following undefined behavior [Open Group 4]:
This type of mutex does not provide deadlock detection. A thread attempting to relock this mutex without first unlocking it shall deadlock. An error is not returned to the caller. Attempting to unlock a mutex locked by a different thread results in undefined behavior. Attempting to unlock an unlocked mutex results in undefined behavior.
The DEFAULT mutex pthread is also generally mapped to PTHREAD_MUTEX_NORMAL but is known to vary from platform to platform [SOL 10]. Consequently, NORMAL locks should not be used, and ERRORCHECK or RECURSIVE locks should be defined explicitly when mutex locks are used.
Noncompliant Code Example
This noncompliant code example shows a simple mutex being created using PTHREAD_MUTEX_NORMAL. Note that the caller does not expect a return code when NORMAL mutex locks are used.
pthread_mutexattr_t attr; pthread_mutex_t mutex; size_t const shared_var = 0; int main(){ int rc =0; rc = pthread_mutexattr_settype(&mutex, PTHREAD_MUTEX_NORMAL); if(rc != 0){ /* Handle Error */ } rc = pthread_mutex_init(&mutex, &attr); if(rc != 0){ /* Handle Error */ } pthread_mutex_lock(&mutex); /* Critical Region*/ pthread_mutex_unlock(&mutex); return 0; }
Compliant Solution
This compliant solution shows an ERRORCHECK mutex lock being created where return codes will be available during locking and unlocking.
pthread_mutexattr_t attr; pthread_mutex_t mutex; size_t const shared_var = 0; int main(){ int rc =0; rc = pthread_mutexattr_settype(&mutex, PTHREAD_MUTEX_ERRORCHECK); if(rc != 0){ /* Handle Error */ } rc = pthread_mutex_init(&mutex, &attr); if(rc != 0){ /* Handle Error */ } rc = pthread_mutex_lock(&mutex); if(rc != 0){ /* Handle Error */ } /* Critical Region*/ rc = pthread_mutex_unlock(&mutex); if(rc != 0){ /* Handle Error */ } return 0; }
Risk Assessment
Using NORMAL mutex locks can lead to deadlocks or abnormal program termination.
Recommendation |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
POS04-C |
low |
unlikely |
medium |
P1 |
L3 |
References
[Open Group 4]
[SOL 10]