You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

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]

  • No labels