Linux: net/rds: clear cp_flags bits individually in rds_conn_path_reset()
What fixes it
- 6b8d7563c28b8112e6e54abe413b028ef3f8c549LinuxCVE List
- 103c4b13c4f50322910078d1c02f29334a574122LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
net/rds: clear cp_flags bits individually in rds_conn_path_reset()
rds_conn_path_reset() wipes the whole flag word with a plain cp->cp_flags = 0 store. Every other accessor of that word uses atomic bitops, and some of them can run concurrently with the reset: RDS_LL_SEND_FULL is set from rds_send_xmit() and cleared from the transport completion paths, neither of which holds anything that excludes the shutdown worker. A plain store racing an atomic read-modify-write on the same word is a data race, and whichever side loses has its update silently discarded.
Clear the two bits the reset is actually responsible for instead. RDS_IN_XMIT and RDS_RECV_REFILL need no store at all here: they belong to the caller, rds_conn_shutdown(), which waits for both to be clear before calling the transport shutdown and this reset.
This also gives every bit in cp_flags a single well-defined writer discipline, which the following patches rely on when they turn RDS_IN_XMIT and RDS_RECV_REFILL into bit locks held across the teardown: a blanket store mid-teardown would destroy lock ownership that an atomic clear preserves.
Oracle UEK carries the same conversion ("net/rds: Preserve essential connection state flags"), motivated by its asynchronous shutdown state machine, whose progress and destroy flags must survive the reset. UEK's variant also clears RDS_IN_XMIT and RDS_RECV_REFILL because there the reset runs as the final step of a teardown that owns both bits, making those clears its unlock. Upstream that release belongs in rds_conn_shutdown(): once a later patch in this series turns the two bits into locks held across the teardown, ending ownership needs release semantics and a wake-up that a plain clear inside the reset would not provide.
Based on Oracle UEK commit "net/rds: Preserve essential connection state flags" by Gerd Rausch.
Text from CVE List
Affected versions 18
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before c9a7c1eb0ad41dcf004a9e870e452cafedcd9172CVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before b767b48614c38687d717082860de7aa46f3b142cCVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before b7dc5da660eb5ffa7f7b4d33f2c74cb71c6edd6cCVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before b8a8b6d25e7426a638c60eaba2129c0664131e84CVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before ed3ee0ac4aafda50c2f4381eb973beefeb7879acCVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before 6b8d7563c28b8112e6e54abe413b028ef3f8c549CVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before cb62aa8f04655a4df487913949719c0a1266ed73CVE List
- Linuxaffected: 00e0f34c616603ba6500f41943cbf89eb4a8a5be before 103c4b13c4f50322910078d1c02f29334a574122CVE List
- Linuxaffected: 2.6.30CVE List
- Linuxunaffected: all versions before 2.6.30CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.111 through 6.12.*CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/c9a7c1eb0ad41dcf004a9e870e452cafedcd9172Referencevia CVE List
- git.kernel.org/stable/c/b767b48614c38687d717082860de7aa46f3b142cReferencevia CVE List
- git.kernel.org/stable/c/b7dc5da660eb5ffa7f7b4d33f2c74cb71c6edd6cReferencevia CVE List
- git.kernel.org/stable/c/b8a8b6d25e7426a638c60eaba2129c0664131e84Referencevia CVE List
- git.kernel.org/stable/c/ed3ee0ac4aafda50c2f4381eb973beefeb7879acReferencevia CVE List
- git.kernel.org/stable/c/6b8d7563c28b8112e6e54abe413b028ef3f8c549Referencevia CVE List
- git.kernel.org/stable/c/cb62aa8f04655a4df487913949719c0a1266ed73Referencevia CVE List
- git.kernel.org/stable/c/103c4b13c4f50322910078d1c02f29334a574122Referencevia CVE List