Odebrany

CVE-2026-98069

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

net/rds: zdobądź blokady Fastpath w rds_conn_shutdown()

rds_conn_shutdown() wycisza ścieżki transmisji i odbioru-uzupełniania poprzez
oczekiwanie na wyczyszczenie próbek RDS_IN_XMIT i RDS_RECV_REFILL i
następnie uruchamia zamknięcie transportu i funkcję rds_conn_path_reset(). Próbkowanie
czyste bity to nie to samo, co ich posiadanie: chwila po
Wait_event() zwraca, rds_send_xmit() może ponownie uzyskać RDS_IN_XMIT (lub
rds_ib_recv_refill() może ponownie uzyskać RDS_RECV_REFILL) i uruchomić
równocześnie z rozbiórką.

Nadawca ponownie sprawdza stan połączenia po przejęciu blokady,
ale to ponowne sprawdzenie to klasyczny wzorzec buforowania sklepu: zapisuje porzucenie
stanu i odczytuje bit, podczas gdy nadawca zapisuje bit i czyta
stan. nabyć_in_xmit() jest tylko operacją nabycia, i tak dalej
słabo uporządkowane architektury obie strony mogą przegapić wzajemne zapisy,
a następnie ścieżka transmisji przebiega, podczas gdy transport zeruje swoje pierścienie
(np. rds_ib_ring_init()) i rds_send_path_reset() przepisują
przesyłać stan pod nim.

Oracle UEK naprawił awarie tej samej klasy – koniec 14 lat
BUG_ON() w rds_ib_sub_signaled(), nieoczekiwane kody operacji i NULL
dereferencje w rds_ib_send_cqe_handler() podczas testowania przełączania awaryjnego -
zamiast tego *nabywanie* ścieżki rozrywania powoduje zablokowanie bitu szybkiej ścieżki
ich przetestowania („rds: Upewnij się, że ścieżka transmisji i połączenie
rozbieranie nie przebiega jednocześnie”). Własność jednego słowa jest
decyduje atomowość RMW, więc nie jest potrzebne porządkowanie zmiennych między zmiennymi.

Zrób to samo tutaj: weź oba zamki przed wezwaniem transportu
zamknięcie, przytrzymaj je w funkcji rds_conn_path_reset() i zwolnij
wyraźnie z późniejszym przebudzeniem. Oba są wydawane z
clear_bit_unlock(), tak że ponowna inicjalizacja pierścienia wykonana przez
zamknięcie transportu i przepisanie stanu transmisji przez
rds_send_path_reset() są uporządkowane, zanim którykolwiek bit zostanie wyczyszczony
następna funkcja nabyć_in_xmit() lub nabyć_refill().

Użytkownicy Fastpath tych bitów - rds_send_xmit() i
rds_ib_recv_refill() - działają w stylu trylock i wycofują się podczas porzucania
jest właścicielem blokad, więc nie jest dla nich wprowadzana żadna nowa zależność od blokad.
rds_tcp_reset_callbacks() jest inna: od poprzedniej łatki
przejmuje również RDS_IN_XMIT i blokuje to, więc teraz czeka
obejmuje rozbiórkę, a nie co najwyżej jedną partię wysłania. Ten kelner
działa z rds_tcp_accept_one() w jednowątkowej kolejce roboczej krdsd
i trzyma rds_tcp_accept_lock i t_conn_path_lock podczas oczekiwania, więc
pojedynkowy SYN zaakceptowany, podczas gdy jego ścieżka jest burzona w parkach
zaakceptować przetwarzanie na czas porzucenia - dla protokołu TCP ograniczonego
przez (do 5 s) pętlę drenażową w rds_tcp_conn_path_shutdown(). IB
odpływ ścieżki w rds_ib_conn_path_shutdown() nie ma okrągłego wieczka, ale nie
blokujący kelner albo: rds_tcp_reset_callbacks() jest jedyną blokadą
nabywca tych bitów i czeka tylko na własnej ścieżce TCP, oraz
szybkie ścieżki są typu trylock-and-back-off w obu transportach, więc długi IB
drenaż wydłuża jedynie spokój tej ścieżki. The
okno jest wąskie: sprawdzenie stanu po stronie akceptacji musi przejść przed
porzucenie przenosi ścieżkę do RDS_CONN_DISCONNECTING.

Ponieważ krdsd jest pojedynczą globalną kolejką roboczą, wszystko inne znajduje się w kolejce
tam - zaakceptuj przetwarzanie dla innych połączeń i sieci
przestrzenie nazw i kolejka Flush_workqueue(rds_wq) w rds_tcp_listen_stop()
podczas rozłączania przestrzeni nazw — czeka za zaparkowanym pracownikiem akceptującym
ten czas. Nie może się zablokować, chociaż oczekiwania wskazują na każde z nich
inne: rozrywanie blokuje się do momentu zwolnienia uchwytu bitu, oraz
posiadaczem może być pracownik akceptowany przez krdsd. Posiadacz kończy
bez potrzeby posiadania czegokolwiek, co posiada porzucenie: synchronizacja zostaje anulowana
rds_tcp_reset_callbacks() wystawia cele cp_send_w i cp_recv_w na
uporządkowana ścieżka cp_wq, której jedyne miejsce wykonania jest zajęte
zablokowany sam cp_down_w, więc co najwyżej oczekują i anulują
bez opróżniania - teraz poleganie na zamówieniu cp_wq
zaznaczone obok tych anulowań (na
---obcięty---

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org