SQLite Forum

DATA RACE: Found in sqlite3.c
Login
Dear SQLite developers:

I used my fuzz-testing tool, connzer, to detect data race in SQLite. Here is a data race found by connzer. I wish you can help me check whether it is a real race, thanks!!

The following is the race report.

## Race report ##

Race object: `pShmNode->pShmMutex`

**Thread 1:**

**Access:** `pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);`

**Line number:** `sqlite3.c, 37258`

**Call stack:**

1. `unixOpenSharedMemory()`
2. `unixShmMap()`
3. `sqlite3OsShmMap()`
4. `walIndexPageRealloc()`
5. `walIndexPage()`
6. `walIndexReadHdr()`
7. `walTryBeginRead()`
8. `sqlite3WalBeginReadTransaction()`
9. `pagerBeginReadTransaction()`
10. `sqlite3PagerSharedLock()`
11. `lockBtree()`
12. `sqlite3BtreeBeginTrans()`
13. `sqlite3VdbeExec()`
14. `sqlite3Step()`
15. `sqlite3_step()`
16. `sqlite3_exec()`
17. `sql_script_x()`
18. `walthread2_thread()`
19. `launch_thread_main()`

**Lock:**

1. `unixEnterMutex()`

**Thread 2:**

**Access:** `sqlite3_mutex_leave(pShmNode->pShmMutex);`

**Line number:** `sqlite3.c; 37308`

**Call stack:**

0. `unixOpenSharedMemory()`
1. `unixShmMap()`
2. `sqlite3OsShmMap()`
3. `walIndexPageRealloc()`
4. `walIndexPage()`
5. `walIndexReadHdr()`
6. `walTryBeginRead()`
7. `sqlite3WalBeginReadTransaction()`
8. `pagerBeginReadTransaction()`
9. `sqlite3PagerSharedLock()`
10. `lockBtree()`
11. `sqlite3BtreeBeginTrans()`
12. `sqlite3BtreeSetVersion()`
13. `sqlite3VdbeExec()`
14. `sqlite3Step()`
15. `sqlite3_step()`
16. `sqlite3_exec()`
17. `sql_script_x()`
18. `walthread2_thread()`
19. `launch_thread_main()`

**Lock:**
  
1. `sqlite3_mutex_enter(pShmNode->pShmMutex)`

My fuzzer finds that these 2 accesses can be executed concurrently, and they are protected by different locks, so my fuzzer report this race.