(release/25.1) RegionValidate: Fix double free of badreg->data on the error path - #3799
Conversation
RegionValidate() copies *badreg into ri[0].reg, so ri[0].reg.data aliases badreg->data. A later RECTALLOC_BAIL() can realloc() that block and move it, updating ri[0].reg.data but not badreg->data. On the bail path, freeing ri[0].reg.data and then calling RegionBreak(badreg) frees badreg->data a second time, which by then is a stale pointer into memory already freed or reallocated to something else. Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2281> (cherry picked from commit 4ef1b4c) (cherry picked from commit bb02769445b1a516f33b4855977cc227f0542cb7) (cherry picked from commit bc0760d) (cherry picked from commit e84a806)
Review: passContent verified against the master commit rather than taken on faith. Patch fidelityThe added lines are byte-identical to master #3779 ( ProvenanceExemplary, and worth calling out because it is easy to get wrong:
The fix, restated for the release branch
Rule 3 — driver ABINo impact. One file, Rule 2 — backport assessmentAlready the backport, and it is the right one: memory safety, client-reachable. No CI for this PR
|
Verification basisNachprüfbar statt behauptet. Alle Werte gemessen, nicht aus dem PR-Body abgelesen. Warum
|
|
Korrektur zur Beschriftung im Verifikationsblock: die Zeile Gemessen wurde Bei diesem PR fallen beide zusammen — die Basis ist unveraendert |
Backport-Ursprung
Dieser PR ist ein Backport. Quelle auf master:
GH-3779
Der Merge-Status des Originals steht in der Referenz oben.
Backport-Übersicht
Master-PR: #3779
Backport von #3779 auf
release/25.1.Was
RegionValidate()kopiert*badregnachri[0].reg, wodurchri[0].reg.dataundbadreg->dataauf denselben Block zeigen. Ein spaeteresRECTALLOC_BAIL()kanndiesen Block per
realloc()verschieben —ri[0].reg.datawird dann aktualisiert,badreg->datanicht. Auf dem Bail-Pfad gibtxfreeData(&ri[i].reg)den Speicherfrei, und
RegionBreak(badreg)gibtbadreg->dataein zweites Mal frei: ein stalePointer auf bereits freigegebenen oder umallozierten Speicher. Doppel-Frei.
Fix:
badreg->data = NULL;direkt vorreturn RegionBreak(badreg).dix/region.c(eine Datei, +5 Zeilen)e84a8065c4f33178bbc687fa0a67511fb9eb4165RegionValidate()laeuft auf Client-Regions (XFixes/XComposite)Source-SHA — bitte beachten
Der in der Auftrags-Direktive genannte Wert
e02f90995bfcist nicht auforigin/master; er liegt nur auf dem make-PR-Branch-Tip von #3779(
origin/pr/master-regionvalidate-...-2026-10-01_15-16-20). Bei rebase-Merge sind daszwei verschiedene SHAs. Korrekt und auf master ist
e84a8065c4. Die Patches sindbyteweise identisch (
git diff e84a8065c4^ e84a8065c4 -- dix/region.cgegen denBranch-Tip: leerer Diff), es ist also die Beschriftung, nicht der Inhalt.
Backport-Commits
Genau ein Commit, cherry-pickt mit
-x. Kein Sammel-Commit, damit der Fixeinzeln entfernbar bleibt, falls er zurueckgenommen werden muss.
Trailer:
Part-of:zeigt auf den xorg-Ursprung (MR 2281), nicht auf unseren PR.Kein
[PR #NNNN]-Marker — der gehoert in unser Incubation-Ledger, nicht in einenPort eines xorg-Commits.
Branch
rfc/backport-25.1-region-double-free, direkt vonorigin/release/25.1(c961c43) abgezweigt. Kontrolle:
git rev-list --count origin/release/25.1..HEAD= 1 (nur der Backport).
Bewusst nicht auf
rfc/backport-25.1— das ist der geteilte xorg/main-Inkubator.Auf 25.1 liegt er 6 Commits vor
release/25.1(
git rev-list --left-right --count origin/release/25.1...origin/rfc/backport-25.1->
2 6). Die Groesse unterscheidet sich pro Release, die Falle nicht: auf 25.2sind es 32.
Build
meson setup -Dwerror=true -Dxephyr=true -Dxnest=true -Dxvfb=true -Dxorg=true,dann
ninja -k 0ueber alle 710 Targets.Genau ein Fehler, und er ist die eine dokumentierte vorbestehende Ausnahme:
Gegenprobe am unpatchten Tip
84636fd095mit demselben Build-Dir: identischeFehlermenge, identisches FAILED-Target (
os/libxserver_os.a.p/transport.c.o).Der Backport fuegt also nichts hinzu. Alles andere waere aus dem Backport
gekommen — es ist nichts.
Dashboard
Topic:
task-backport-3779-regionvalidate-double-free-to-release-25-1Batch-Topic:
task-backport-batch-2026-10-01-3776-3777-3779-auf-release-25-2-25-1-25-0Kein Merge durch die Flotte —
release/*wird vom Maintainer von Hand gemergt,Merge-Mode rebase.
Verknüpfung
Release merges are manual, by the maintainer.