CERT.CONC.WAKE_IN_LOOP_C
疑似的にループで起動する可能性のある関数はラップする
このチェッカーは、ループで開始されない 'cnd_wait'、cnd_timedwait'、'wait'、'wait_for'、および 'wait_until' の呼び出しを報告します。
脆弱性とリスク
cnd_wait() 関数または cnd_timedwait() 関数を while ループに含めないと、無期限ブロックやサービス拒否 (DoS) につながる可能性があります。
軽減と防止
cnd_wait() 関数の呼び出しを while ループ内から行い、cnd_wait() を呼び出す前と後に状態をチェックするようにします。
脆弱コード例
struct node_t {
void *node;
struct node_t *next;
};
struct node_t list;
static mtx_t lock;
static cnd_t condition;
void consume_list_element(void) {
if (thrd_success != mtx_lock(&lock)) {
/* エラーを処理します */
}
if (list.next == NULL) {
if (thrd_success != cnd_wait(&condition, &lock)) {
/* エラーを処理します */
}
}
/* 条件が当てはまる場合、続行します */
if (thrd_success != mtx_unlock(&lock)) {
/* エラーを処理します */
}
}
この非準拠コード例は、cnd_wait() 関数を if ブロック内にネストしているため、その結果として通知を受け取った後、条件述部をチェックできません。通知が偽物であったり、悪意のあるものであった場合、スレッドが早々に起動する可能性があります。