dm-crypt: fix a tiny race condition in crypt_dec_pending
Impact
In the Linux kernel, the following vulnerability has been resolved:
Source excerpt · LinuxAffected packages
Affected products
Vendor version evidence. Product records are separate from automatic dependency matching.
Linux · Linux
Other versions: unaffected
| Version / range | Source status |
|---|---|
| b35f8caa0890169000fec22902290d9a15274cbd to before ac5d887ab93592fc5e3605fe30c1d8d232d609b3 | affected |
| b35f8caa0890169000fec22902290d9a15274cbd to before 4f16bb982b27b9f5a15301f622c318001fe521f8 | affected |
| b35f8caa0890169000fec22902290d9a15274cbd to before 148845aa1921d95ef5dc851c76e6a284f6657df6 | affected |
| 9c8f3fcd3ffd3283cc0971c8919058356f20a963 | affected |
| 2.6.28.9 to before 2.6.29 | affected |
Linux · Linux
Other versions: affected
| Version / range | Source status |
|---|---|
| 2.6.29 | affected |
| 0 to before 2.6.29 | unaffected |
| 6.18.59 through 6.18.* (inclusive) | unaffected |
| 7.2.13 through 7.2.* (inclusive) | unaffected |
| 7.3 through * (inclusive) | unaffected |
Original source description
In the Linux kernel, the following vulnerability has been resolved:
dm-crypt: fix a tiny race condition in crypt_dec_pending
crypt_dec_pending reads io->error before calling atomic_dec_and_test. Another context, for example crypt_endio called from an interrupt, may set io->error and drop its reference between the read and the decrement. crypt_dec_pending then drops the last reference and completes the bio with the stale status - so a read that failed and was never decrypted, or a write that failed, is reported as successful.
The read was placed before the decrement by commit b35f8caa0890 ("dm crypt: wait for endio to complete before destruction"), because that commit freed dm_crypt_io before calling bio_endio. This is no longer the case, dm_crypt_io lives in the per-bio data now.
Read io->error after atomic_dec_and_test instead. atomic_dec_and_test is fully ordered, so no additional barrier is needed.