...
Although this example is specific to network I/O, the recv() call could be replaced with any blocking call, and the same behavior would occur.
| Code Block | ||
|---|---|---|
| ||
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
void thread_foo(void *ptr) {
uint32_t num;
int result;
int sock;
/* sock is a connected TCP socket */
if ((result = pthread_mutex_lock(&mutex)) != 0) {
/* Handle Error */
}
if ((result = recv(sock, (void *)&num, sizeof(uint32_t), 0)) < 0) {
/* Handle Error */
}
/* ... */
if ((result = pthread_mutex_unlock(&mutex)) != 0) {
/* Handle Error */
}
}
int main() {
pthread_t thread;
int result;
if ((result = pthread_mutexattr_settype(
&mutex, PTHREAD_MUTEX_ERRORCHECK)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutex_init(&mutex, &attr)) != 0) {
/* Handle Error */
}
if (pthread_create(&thread, NULL,(void *)& thread_foo, NULL) != 0) {
/* Handle Error */
}
/* ... */
pthread_join(thread, NULL);
if ((result = pthread_mutex_destroy(&mutex)) != 0) {
/* Handle Error */
}
return 0;
}
|
Compliant Solution (Block
...
While Not Locked)
This compliant solution performs the recv() call when the lock has not been acquired. This causes the blocking behavior to only affect the thread that called the blocking function.
| Code Block | ||
|---|---|---|
| ||
void thread_foo(void *ptr) {
uint32_t num;
int result;
int sock;
/* sock is a connected TCP socket */
if ((result = recv(sock, (void *)&num, sizeof(uint32_t), 0)) < 0) {
/* Handle Error */
}
if ((result = pthread_mutex_lock(&mutex)) != 0) {
/* Handle Error */
}
/* ... */
if ((result = pthread_mutex_unlock(&mutex)) != 0) {
/* Handle Error */
}
}
|
Compliant Solution (Use a
...
Non-
...
Blocking Call)
This compliant solution performs the recv() call with the parameter o_nonblock, which causes the call to fail if there are no messages available on the socket.
...
CON36-EX1: A thread may block while holding one or more locks and waiting to acquire another lock. When acquiring multiple locks, the order of locking must avoid deadlock, as specified in guideline CON35-C. Avoid deadlock by locking in predefined order.
...
Rule | Severity | Likelihood | Remediation Cost | Level | Priority |
|---|---|---|---|---|---|
CON36-C | low | probable | high | L3 | P2 |
Related Guidelines
The CERT Oracle Secure Coding Standard for Java: LCK09-J. Do not perform operations that can block while holding a lock
...
| Wiki Markup |
|---|
\[[Barney 2010|AA. Bibliography#Barney 10]\] [POSIX Threads Programming|https://computing.llnl.gov/tutorials/pthreads/] |
| Wiki Markup |
\[[Open Group|AA. Bibliography#OpenGroup04]\] [pthread_cancel()|http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cancel.html]{{,}} [recv()|http://www.opengroup.org/onlinepubs/009695399/functions/recv.html]\\ |
...