Chrome platform driver development
 help / color / mirror / Atom feed
* [PATCH AUTOSEL 6.18-6.12] platform/chrome: Resolve kb_wake_angle visibility race
       [not found] <20260831133314.4125787-1-sashal@kernel.org>
@ 2026-08-31 13:28 ` Sasha Levin
  2026-08-31 13:28 ` [PATCH AUTOSEL 6.18] media: platform: cros-ec: Add Kulnex and Moxoe to the match table Sasha Levin
  2026-08-31 13:31 ` [PATCH AUTOSEL 6.18-5.15] firmware: google: Add bounds checks in coreboot_table_populate() Sasha Levin
  2 siblings, 0 replies; 3+ messages in thread
From: Sasha Levin @ 2026-08-31 13:28 UTC (permalink / raw)
  To: patches, stable
  Cc: Tzung-Bi Shih, Gwendal Grignou, Sasha Levin, bleung,
	chrome-platform, linux-kernel

From: Tzung-Bi Shih <tzungbi@kernel.org>

[ Upstream commit c40f5f9927b5bf6062daa1e293ae32d83afc963e ]

A race condition exists between the probe of cros-ec-sysfs and
cros-ec-sensorhub.

The `kb_wake_angle` attribute should only be visible if the sensor hub
detects two or more accelerometers.  If cros_ec_sysfs_probe() runs
before cros_ec_sensorhub_register() completes sensor enumeration, the
sysfs attributes are created while `has_kb_wake_angle` is still false,
hiding `kb_wake_angle` incorrectly.

Store the created attribute group pointer in `ec_dev->group`.  When
the sensor hub completes sensor enumeration, it checks for this group
and calls sysfs_update_group() to notify the sysfs core to re-evaluate
attribute visibility.  This ensures the `kb_wake_angle` attribute
visibility is correctly updated regardless of the driver probe order.

Co-developed-by: Gwendal Grignou <gwendal@chromium.org>
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Link: https://lore.kernel.org/r/20260407102615.1605317-1-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

# Stable Backport Analysis: `platform/chrome: Resolve kb_wake_angle
visibility race`

**Local tree:** Linux **6.18.43** (`git describe HEAD` →
`v6.18.43-1-gc7f0dac02d232`)

---

## PHASE 1: COMMIT MESSAGE FORENSICS

### Step 1.1: Subject line
**Record:** `[platform/chrome]` `[Resolve]` — fix a race affecting
`kb_wake_angle` sysfs attribute visibility between `cros-ec-sysfs` and
`cros-ec-sensorhub` probe paths.

### Step 1.2: Commit message tags
**Record:**
| Tag | Value |
|-----|-------|
| Co-developed-by | Gwendal Grignou \<gwendal@chromium.org\> |
| Signed-off-by | Gwendal Grignou, Tzung-Bi Shih \<tzungbi@kernel.org\>
|
| Link |
https://lore.kernel.org/r/20260407102615.1605317-1-tzungbi@kernel.org |

**Notable absences (expected, not negative):** No `Fixes:`, no `Cc:
stable@vger.kernel.org`, no `Reported-by:`, no `Reviewed-by:`, no
`Tested-by:`.

**Notable patterns:** Co-developed by a Chromium engineer; cover letter
says *"This is an old patch and we still need it. Revive the patch."*
with v3 dating to August 2021.

### Step 1.3: Body analysis
**Record:**
- **Bug:** Race between `cros_ec_sysfs_probe()` and
  `cros_ec_sensorhub_register()` during sensor enumeration.
- **Symptom:** `/sys/class/chromeos/<ec>/kb_wake_angle` is permanently
  hidden when sysfs is created while `has_kb_wake_angle` is still
  `false`, even on hardware with ≥2 accelerometers.
- **Root cause:** `cros_ec_ctrl_visible()` is evaluated once at
  `sysfs_create_group()` time; later setting `has_kb_wake_angle = true`
  does not re-evaluate visibility without `sysfs_update_group()`.
- **Fix:** Store the attribute group pointer in `ec_dev->group`; call
  `sysfs_update_group()` after sensor enumeration sets
  `has_kb_wake_angle`.

### Step 1.4: Hidden bug fix detection
**Record:** Yes — despite "Resolve" rather than "fix", this is a
synchronization/race bug fix disguised as a visibility correction.
Permanent functional regression on affected Chromebooks.

---

## PHASE 2: DIFF ANALYSIS

### Step 2.1: Change inventory
**Record:**
| File | Changes | Functions |
|------|---------|-----------|
| `cros_ec_sensorhub.c` | +4 lines | `cros_ec_sensorhub_register()` |
| `cros_ec_sysfs.c` | +3/-2 lines | `cros_ec_sysfs_probe()`,
`cros_ec_sysfs_remove()` |
| `cros_ec_proto.h` | +2 lines | `struct cros_ec_dev` |

**Scope:** 3 files, ~10 insertions / 3 deletions — single-subsystem,
surgical fix.

### Step 2.2: Code flow per hunk

**Hunk 1 — `cros_ec_sensorhub.c`:**
- **Before:** Set `ec->has_kb_wake_angle = true` when ≥2 accelerometers
  found; sysfs never notified.
- **After:** Same flag set, plus if `ec->group` exists, call
  `sysfs_update_group()` to re-run `is_visible()`.

**Hunk 2 — `cros_ec_sysfs.c` probe:**
- **Before:** `sysfs_create_group(..., &cros_ec_attr_group)` directly.
- **After:** Store `ec_dev->group = &cros_ec_attr_group` first, then
  create using stored pointer.

**Hunk 3 — `cros_ec_sysfs.c` remove:**
- **Before:** Remove using static `&cros_ec_attr_group`.
- **After:** Remove using `ec_dev->group` (consistent with stored
  pointer).

**Hunk 4 — `cros_ec_proto.h`:**
- **Before:** No `group` field in `struct cros_ec_dev`.
- **After:** Add `const struct attribute_group *group`.

### Step 2.3: Bug mechanism
**Record:** **Category:** Race condition / sysfs visibility lifecycle
bug.

**Mechanism:** `cros_ec_ctrl_visible()` gates `kb_wake_angle` on
`ec->has_kb_wake_angle`:

```377:384:drivers/platform/chrome/cros_ec_sysfs.c
static umode_t cros_ec_ctrl_visible(struct kobject *kobj,
                                    struct attribute *a, int n)
{
        struct device *dev = kobj_to_dev(kobj);
        struct cros_ec_dev *ec = to_cros_ec_dev(dev);

        if (a == &dev_attr_kb_wake_angle.attr && !ec->has_kb_wake_angle)
                return 0;
```

`has_kb_wake_angle` is set later in sensorhub enumeration:

```125:126:drivers/platform/chrome/cros_ec_sensorhub.c
        if (sensor_type[MOTIONSENSE_TYPE_ACCEL] >= 2)
                ec->has_kb_wake_angle = true;
```

Kernel documentation for `sysfs_update_group()` explicitly states it
exists *"after making a change that affects group visibility"* —
confirming the missing step in current code.

### Step 2.4: Fix quality
**Record:**
- **Obviously correct:** Yes — standard sysfs pattern; `ec` is
  `kzalloc()`'d so `group` starts NULL; `if (ec->group && ...)` guards
  the update path safely.
- **Minimal:** Yes — no unrelated changes.
- **Regression risk:** Very low — only affects attribute visibility
  timing; failure path logs `dev_warn` and leaves sysfs in prior state.

---

## PHASE 3: GIT HISTORY INVESTIGATION

### Step 3.1: Blame
**Record:** Shallow repository (`rev-parse --is-shallow-repository` →
`true`). `git blame` attributes all relevant lines to `5d324e5159d9e`
(merge base). Cannot determine exact introduction commit from local
history. Buggy `has_kb_wake_angle` + `is_visible` logic **is present**
in current tree.

### Step 3.2: Fixes: tag
**Record:** N/A — no `Fixes:` tag in commit message.

### Step 3.3: Related file history
**Record:** `git log --oneline -30` on modified files returns only the
shallow merge base — insufficient local history. External evidence
(patch v3 from August 2021) indicates the race has existed since
conditional visibility was introduced years ago.

### Step 3.4: Author context
**Record:** Tzung-Bi Shih is an active `platform/chrome` maintainer. Co-
developer Gwendal Grignou is from Chromium. Patch cover letter
explicitly states production need.

### Step 3.5: Dependencies
**Record:** Standalone — no series dependencies, no prerequisite commits
referenced. Applies directly to existing `has_kb_wake_angle` /
`is_visible` infrastructure already in this tree.

---

## PHASE 4: MAILING LIST AND EXTERNAL RESEARCH

### Step 4.1: Original discussion
**Record:** Thread at https://yhbt.net/lore/chrome-
platform/20260407102615.1605317-1-tzungbi@kernel.org/T/ (v4, April
2026). Patch went through v1→v4 revisions. Queued in linux-next as
`c40f5f9927b5` (May 2026). Merged to mainline via `chrome-platform-v7.2`
pull. `b4 dig -c HEAD` could not match this commit (not in local tree).
No explicit stable nomination found in available thread content.

### Step 4.2: Reviewers
**Record:** Could not retrieve full recipient list (lore
blocked/redirected). Signed-off-by from subsystem maintainer Tzung-Bi
Shih and Chromium co-developer.

### Step 4.3: Bug report
**Record:** No external bug tracker or syzbot report. Production need
documented by Chromium in cover letter (*"old patch... we still need
it"*).

### Step 4.4: Series context
**Record:** Standalone 1-patch fix. v3 predecessor from 2021 at https://
lore.kernel.org/all/20210804213139.4139492-2-gwendal@chromium.org/

### Step 4.5: Stable list history
**Record:** No stable-list discussion found in accessible sources.

---

## PHASE 5: CODE SEMANTIC ANALYSIS

### Step 5.1: Key functions
**Record:** `cros_ec_sensorhub_register()`, `cros_ec_sysfs_probe()`,
`cros_ec_ctrl_visible()`, `ec_device_probe()` (MFD parent).

### Step 5.2: Callers / probe ordering
**Record:** In `drivers/mfd/cros_ec_dev.c`:
- Line 241–248: `cros-ec-sensorhub` MFD child registered **first** (when
  sensors present).
- Line 333–338: `cros-ec-sysfs` registered **last** among platform
  cells.

However, sensorhub probe calls `cros_ec_sensorhub_register()` which
loops over sensors with up to 50 EBUSY retries at 5–6 ms each
(`CROS_EC_CMD_INFO_RETRIES`). Meanwhile, numerous other MFD children are
registered and probed between sensorhub registration and sysfs
registration. **Sysfs probe can run while sensorhub_register() is still
enumerating sensors** — confirmed race window.

### Step 5.3: Callees
**Record:** `sysfs_create_group()`, `sysfs_update_group()`,
`cros_ec_cmd_xfer_status()` — all standard, well-understood APIs.

### Step 5.4: Reachability
**Record:** Triggered on every boot of Chromebook/ChromeOS hardware with
`CONFIG_CROS_EC_SENSORHUB` and ≥2 accelerometers. Userspace reads/writes
`/sys/class/chromeos/*/kb_wake_angle` (documented ABI since kernel
4.17). Not a syscall path, but standard sysfs interface for ChromeOS
power/tablet-mode configuration.

### Step 5.5: Similar patterns
**Record:** `sysfs_update_group()` used elsewhere for dynamic visibility
(e.g., `drivers/usb/typec/class.c`, `fs/btrfs/sysfs.c`). Same
established pattern.

---

## PHASE 6: CROSS-REFERENCE AGAINST LOCAL TREE (6.18.43)

### Step 6.1: Buggy code present?
**Record:** **YES.** Current tree lacks `ec_dev->group` field and
`sysfs_update_group()` call. Full buggy race infrastructure is present
(`has_kb_wake_angle`, `cros_ec_ctrl_visible`, sensorhub enumeration).

### Step 6.2: Backport complications
**Record:** **Clean apply expected** — no conflicting refactors in these
files; patch matches current code structure exactly.

### Step 6.3: Related fixes already present?
**Record:** **No** — `grep sysfs_update_group drivers/platform/chrome/`
returns no matches. Fix not yet applied.

---

## PHASE 7: SUBSYSTEM CONTEXT

### Step 7.1: Subsystem criticality
**Record:** `drivers/platform/chrome/` — **PERIPHERAL** (ChromeOS EC
platform driver). Important for Chromebook users; not core kernel.

### Step 7.2: Activity
**Record:** Actively maintained subsystem with ongoing chrome-platform
development.

---

## PHASE 8: IMPACT AND RISK

### Step 8.1: Who is affected
**Record:** Chromebook/convertible devices with ChromeOS EC,
`CONFIG_CROS_EC_SENSORHUB`, and ≥2 accelerometers. Config- and platform-
specific, but affects a widely deployed hardware class.

### Step 8.2: Trigger conditions
**Record:** Probe-order/timing race during boot — sysfs probes before
sensorhub finishes enumerating accelerometers. Plausible on every boot
when timing aligns; sensorhub EC communication can take hundreds of
milliseconds with EBUSY retries. Not userspace-triggerable; unprivileged
users cannot force it, but they suffer the consequence (missing sysfs
node).

### Step 8.3: Failure mode severity
**Record:** `kb_wake_angle` sysfs attribute **permanently hidden for
that boot** (sysfs does not re-evaluate `is_visible` without update).
Userspace cannot read/write keyboard wake lid angle. **Severity:
MEDIUM** — functional regression on documented ABI; no crash,
corruption, deadlock, or security impact.

### Step 8.4: Risk-benefit
**Record:**
- **Benefit:** MEDIUM — restores documented sysfs control on affected
  convertibles; long-standing Chromium production issue.
- **Risk:** VERY LOW — 10-line change using documented sysfs API.
- **Ratio:** Favorable — low-risk fix for a real, persistent functional
  bug.

---

## PHASE 9: FINAL SYNTHESIS

### Step 9.1: Evidence summary

**FOR backport:**
- Real, verifiable race with permanent per-boot impact
- Buggy code confirmed present in Linux 6.18.43
- Small, surgical, obviously correct fix using standard
  `sysfs_update_group()` API
- Long-standing issue (known since ~2021); Chromium explicitly still
  needs it
- Documented userspace ABI (`Documentation/ABI/testing/sysfs-class-
  chromeos`)
- No dependencies; clean apply expected

**AGAINST backport:**
- Not crash/security/corruption/deadlock — functional sysfs visibility
  only
- ChromeOS-specific driver; limited to one hardware ecosystem
- No syzbot report, no explicit stable nomination
- Failure is degraded functionality, not system instability

**Unresolved:** Exact commit that introduced `has_kb_wake_angle`
visibility (shallow clone limits local history). Full lore review thread
not accessible.

### Step 9.2: Stable rules checklist

| Criterion | Result |
|-----------|--------|
| 1. Obviously correct and tested? | **PASS** — standard sysfs pattern;
maintainer SOB; v4 after review |
| 2. Fixes real bug affecting users? | **PASS** — permanent missing
sysfs attr on affected Chromebooks |
| 3. Important issue? | **PASS (borderline)** — functional regression on
production hardware with documented ABI; not crash-level but persistent
and user-visible |
| 4. Small and contained? | **PASS** — 3 files, ~10 lines |
| 5. No new features/APIs? | **PASS** — fixes existing attribute
visibility only |
| 6. Can apply to local tree? | **PASS** — buggy code present; clean
apply |

### Step 9.3: Exception categories
**Record:** Not a device-ID/quirk/DT/build/docs exception. Qualifies as
a driver probe race fix for existing hardware functionality.

### Step 9.4: Decision rationale
For **Linux 6.18.43**, the race exists today: `has_kb_wake_angle`
conditional visibility without `sysfs_update_group()` means
`kb_wake_angle` can be permanently hidden on convertible Chromebooks
when sysfs probes before sensor enumeration completes. The fix is
minimal, uses the kernel's intended API for exactly this scenario, and
addresses a production issue Chromium has tracked since 2021. While
severity is functional rather than catastrophic, the bug is persistent
per boot, affects a documented userspace interface, and the backport
risk is negligible.

---

## Verification

- **[Phase 1]** Parsed subject, tags, body from provided commit message;
  fetched v4 cover letter from ratatoskr.run
- **[Phase 2]** Read current `cros_ec_sysfs.c`, `cros_ec_sensorhub.c`,
  `cros_ec_proto.h`; confirmed diff matches tree structure
- **[Phase 2]** Read `sysfs_update_group()` documentation in
  `fs/sysfs/group.c` lines 271–287
- **[Phase 3]** `git describe HEAD` → v6.18.43; `rev-parse --is-shallow-
  repository` → true
- **[Phase 3]** `git blame` on modified lines → all from shallow base
  `5d324e5159d9e`
- **[Phase 3]** `git log --grep=kb_wake_angle` → empty (shallow history)
- **[Phase 4]** ratatoskr.run thread: v4, linux-next queue, v3 from
  2021, Chromium co-developer
- **[Phase 4]** lore.kernel.org direct fetch blocked; yhbt.net returned
  Tor redirect
- **[Phase 4]** `b4 dig -c HEAD` failed to match (commit not in tree)
- **[Phase 5]** Read `ec_device_probe()` in `drivers/mfd/cros_ec_dev.c`
  — sensorhub at 241, sysfs at 333
- **[Phase 5]** Confirmed `CROS_EC_CMD_INFO_RETRIES 50` with 5–6ms
  sleeps in sensorhub enumeration
- **[Phase 5]** `grep sysfs_update_group drivers/platform/chrome/` → no
  matches (fix absent)
- **[Phase 6]** Confirmed `struct cros_ec_dev` lacks `group` field in
  local tree
- **[Phase 6]** Confirmed `has_kb_wake_angle` + `is_visible` logic
  present (bug exists)
- **[Phase 7]** Read `Documentation/ABI/testing/sysfs-class-chromeos` —
  kb_wake_angle documented since 4.17
- **[Phase 8]** Confirmed `ec = kzalloc()` in `ec_device_probe()` —
  `group` implicitly NULL-initialized

**YES**

 drivers/platform/chrome/cros_ec_sensorhub.c | 6 +++++-
 drivers/platform/chrome/cros_ec_sysfs.c     | 5 +++--
 include/linux/platform_data/cros_ec_proto.h | 2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/platform/chrome/cros_ec_sensorhub.c b/drivers/platform/chrome/cros_ec_sensorhub.c
index 9bad8f72680ea..f938c3fc84e4f 100644
--- a/drivers/platform/chrome/cros_ec_sensorhub.c
+++ b/drivers/platform/chrome/cros_ec_sensorhub.c
@@ -122,8 +122,12 @@ static int cros_ec_sensorhub_register(struct device *dev,
 		sensor_type[sensorhub->resp->info.type]++;
 	}
 
-	if (sensor_type[MOTIONSENSE_TYPE_ACCEL] >= 2)
+	if (sensor_type[MOTIONSENSE_TYPE_ACCEL] >= 2) {
 		ec->has_kb_wake_angle = true;
+		if (ec->group && sysfs_update_group(&ec->class_dev.kobj,
+						    ec->group))
+			dev_warn(dev, "Unable to update sysfs");
+	}
 
 	if (cros_ec_check_features(ec,
 				   EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS)) {
diff --git a/drivers/platform/chrome/cros_ec_sysfs.c b/drivers/platform/chrome/cros_ec_sysfs.c
index f22e9523da3e8..9d3767ab15480 100644
--- a/drivers/platform/chrome/cros_ec_sysfs.c
+++ b/drivers/platform/chrome/cros_ec_sysfs.c
@@ -405,7 +405,8 @@ static int cros_ec_sysfs_probe(struct platform_device *pd)
 	struct device *dev = &pd->dev;
 	int ret;
 
-	ret = sysfs_create_group(&ec_dev->class_dev.kobj, &cros_ec_attr_group);
+	ec_dev->group = &cros_ec_attr_group;
+	ret = sysfs_create_group(&ec_dev->class_dev.kobj, ec_dev->group);
 	if (ret < 0)
 		dev_err(dev, "failed to create attributes. err=%d\n", ret);
 
@@ -416,7 +417,7 @@ static void cros_ec_sysfs_remove(struct platform_device *pd)
 {
 	struct cros_ec_dev *ec_dev = dev_get_drvdata(pd->dev.parent);
 
-	sysfs_remove_group(&ec_dev->class_dev.kobj, &cros_ec_attr_group);
+	sysfs_remove_group(&ec_dev->class_dev.kobj, ec_dev->group);
 }
 
 static const struct platform_device_id cros_ec_sysfs_id[] = {
diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h
index de14923720a53..6ed1c4c5ce2ef 100644
--- a/include/linux/platform_data/cros_ec_proto.h
+++ b/include/linux/platform_data/cros_ec_proto.h
@@ -228,6 +228,7 @@ struct cros_ec_platform {
 /**
  * struct cros_ec_dev - ChromeOS EC device entry point.
  * @class_dev: Device structure used in sysfs.
+ * @group: sysfs attributes groups for this EC.
  * @ec_dev: cros_ec_device structure to talk to the physical device.
  * @dev: Pointer to the platform device.
  * @debug_info: cros_ec_debugfs structure for debugging information.
@@ -237,6 +238,7 @@ struct cros_ec_platform {
  */
 struct cros_ec_dev {
 	struct device class_dev;
+	const struct attribute_group *group;
 	struct cros_ec_device *ec_dev;
 	struct device *dev;
 	struct cros_ec_debugfs *debug_info;
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH AUTOSEL 6.18] media: platform: cros-ec: Add Kulnex and Moxoe to the match table
       [not found] <20260831133314.4125787-1-sashal@kernel.org>
  2026-08-31 13:28 ` [PATCH AUTOSEL 6.18-6.12] platform/chrome: Resolve kb_wake_angle visibility race Sasha Levin
@ 2026-08-31 13:28 ` Sasha Levin
  2026-08-31 13:31 ` [PATCH AUTOSEL 6.18-5.15] firmware: google: Add bounds checks in coreboot_table_populate() Sasha Levin
  2 siblings, 0 replies; 3+ messages in thread
From: Sasha Levin @ 2026-08-31 13:28 UTC (permalink / raw)
  To: patches, stable
  Cc: Ken Lin, Hans Verkuil, Sasha Levin, hverkuil, mchehab, bleung,
	linux-media, chrome-platform, linux-kernel

From: Ken Lin <kenlin5@quanta.corp-partner.google.com>

[ Upstream commit e024767f90f9f50bfcce4b20bb74237ad72450f3 ]

The Google Kulnex and Moxoe device uses the same approach as Google Brask
which enables the HDMI CEC via the cros-ec-cec driver.

Signed-off-by: Ken Lin <kenlin5@quanta.corp-partner.google.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

## Phase 1: Commit Message Forensics

### Step 1.1: Parse the Subject Line
**Record:** `[media: platform: cros-ec]` `[Add]` — Add Kulnex and Moxoe
Google Chromebook board names to the CEC DMI match table so HDMI CEC can
be enabled on those platforms.

### Step 1.2: Parse All Commit Message Tags
**Record:**
- **Fixes:** none
- **Reported-by:** none
- **Tested-by:** none
- **Reviewed-by:** none
- **Acked-by:** none
- **Link:** none
- **Cc: stable:** none (expected; not a negative signal)
- **Signed-off-by:** Ken Lin `<kenlin5@quanta.corp-partner.google.com>`
  (author)
- **Signed-off-by:** Hans Verkuil `<hverkuil+cisco@kernel.org>`
  (media/CEC maintainer)

No syzbot, bugzilla, or user crash reports. Maintainer sign-off is a
positive quality signal.

### Step 1.3: Analyze Commit Body
**Record:**
- **Bug description:** Google Kulnex and Moxoe Chromebooks use the same
  HDMI CEC-over-ChromeOS-EC approach as Brask, but are missing from
  `cec_dmi_match_table[]`.
- **Symptom/failure mode:** `cros-ec-cec` probe fails on these boards;
  HDMI CEC is unavailable. No crash is described.
- **Version information:** none in the commit message.
- **Root cause:** Driver uses an explicit DMI whitelist per Chromebook
  model for HDMI DRM device and connector-port mapping. New boards were
  never added.

### Step 1.4: Detect Hidden Bug Fixes
**Record:** Not a hidden crash/UAF/race fix. This is explicit hardware
enablement: adding board identification entries so an existing driver
can probe on two new platforms. Functionally equivalent to adding
PCI/USB IDs or a DMI quirk entry.

---

## Phase 2: Diff Analysis

### Step 2.1: Inventory the Changes
**Record:**
- **Files:** `drivers/media/cec/platform/cros-ec/cros-ec-cec.c` (+4
  lines)
- **Functions modified:** none directly; only `cec_dmi_match_table[]`
  data
- **Scope:** single-file, surgical, 4-line addition

### Step 2.2: Code Flow Change
**Record:**
- **Hunk (DMI table):** Before — Kulnex/Moxoe unmatched →
  `cros_ec_cec_find_hdmi_dev()` warns and returns `-ENODEV`. After —
  boards match like Brask/Moxie, DRM HDMI device (`0000:00:02.0`) and
  `port_b_conns` mapping are selected, probe can succeed.

### Step 2.3: Bug Mechanism
**Record:**
- **Category:** hardware identification / platform quirk (DMI-based
  board whitelist)
- **Mechanism:** Without a table entry, probe path in
  `cros_ec_cec_probe()` exits early:

```501:503:drivers/media/cec/platform/cros-ec/cros-ec-cec.c
        hdmi_dev = cros_ec_cec_find_hdmi_dev(&pdev->dev, &conns);
        if (IS_ERR(hdmi_dev))
                return PTR_ERR(hdmi_dev);
```

And the lookup function explicitly documents that hardware must be added
to the table:

```362:365:drivers/media/cec/platform/cros-ec/cros-ec-cec.c
        /* Hardware support must be added in the cec_dmi_match_table */
        dev_warn(dev, "CEC notifier not configured for this
hardware\n");

        return ERR_PTR(-ENODEV);
```

### Step 2.4: Fix Quality Assessment
**Record:** Obviously correct — copies the proven Brask/Moxie pattern
(`port_b_conns`, same PCI DRM device name). Minimal diff. Regression
risk is very low: only affects DMI matches for "Google"/"Kulnex" and
"Google"/"Moxoe".

---

## Phase 3: Git History Investigation

### Step 3.1: Blame the Changed Lines
**Record:** The DMI table (lines 304–337) exists in this tree ending at
Moxie; Kulnex/Moxoe are absent. Git history in this checkout is heavily
rewritten/squashed (file history is unreliable), but the driver and full
match table are present since at least `ac3fd01e4c1ef` (Linux 6.18-rc7).
The "missing entry" condition is present in 6.18.43.

### Step 3.2: Follow Fixes: Tag
**Record:** N/A — no `Fixes:` tag.

### Step 3.3: File History for Related Changes
**Record:** The driver has accumulated many Google board entries (Fizz,
Brask, Moli, …, Moxie). This commit continues that pattern. Standalone
one-commit change; not part of a multi-patch series.

### Step 3.4: Author's Other Commits
**Record:** Ken Lin has no other commits visible in this checkout. Hans
Verkuil is the media/CEC maintainer and signed off. No related author
series found here.

### Step 3.5: Dependent/Prerequisite Commits
**Record:** No dependencies. Driver, `port_b_conns`, DMI/PCI
infrastructure, and `CONFIG_CEC_CROS_EC` all exist in this tree. Applies
standalone.

---

## Phase 4: Mailing List and External Research

### Step 4.1: Original Patch Discussion
**Record:** `b4 dig -c 4b3f9bff6067a` failed — commit hash not in local
repo. Lore search blocked (403/bot protection). **UNVERIFIED:** original
thread content, reviewer stable nominations, series revisions.

### Step 4.2: Reviewers
**Record:** **UNVERIFIED** via `b4 dig -w`. Hans Verkuil SOB confirms
maintainer involvement.

### Step 4.3: Bug Report
**Record:** N/A — no Reported-by or Link tags.

### Step 4.4: Related Patches/Series
**Record:** Same pattern as prior Brask/Moxie/Kinox additions to this
table. Standalone.

### Step 4.5: Stable Mailing List History
**Record:** **UNVERIFIED** — could not search lore stable archive.

---

## Phase 5: Code Semantic Analysis

### Step 5.1: Key Functions
**Record:** `cec_dmi_match_table[]` (data),
`cros_ec_cec_find_hdmi_dev()`, called from `cros_ec_cec_probe()`.

### Step 5.2: Trace Callers
**Record:** `cros_ec_cec_probe()` is the platform driver probe path
during boot/module load on Chromebooks with `CONFIG_CEC_CROS_EC` and
`CONFIG_CROS_EC`. Affects only matching Google hardware.

### Step 5.3: Trace Callees
**Record:** `dmi_match()`, `bus_find_device_by_name()` on PCI bus,
connector mapping via `port_b_conns`.

### Step 5.4: Call Chain / Reachability
**Record:** Boot-time platform probe on ChromeOS EC-equipped Google
devices. Not a syscall path. Userspace impact is missing `/dev/cec*` and
non-functional HDMI CEC on Kulnex/Moxoe.

### Step 5.5: Similar Patterns
**Record:** Fifteen other Google boards already use the same table
pattern; Brask and Moxie use identical `port_b_conns` mapping, matching
the commit message claim.

---

## Phase 6: Cross-Referencing Against Local Tree (6.18.43)

### Step 6.1: Does the Buggy Code Exist?
**Record:** **YES.** Local tree is `6.18.43`
(`v6.18.43-1-gc7f0dac02d232`). `drivers/media/cec/platform/cros-ec/cros-
ec-cec.c` exists (602 lines). Table ends at Moxie; Kulnex/Moxoe are
missing. Driver has been present since 6.18-rc7 in this tree.

### Step 6.2: Backport Complications
**Record:** **Clean apply expected.** Verified with `git apply --check`
against current tree — applies without conflicts.

### Step 6.3: Related Fixes Already Present?
**Record:** No — `grep` finds no Kulnex or Moxoe anywhere in the tree.

---

## Phase 7: Subsystem and Maintainer Context

### Step 7.1: Subsystem and Criticality
**Record:** `drivers/media/cec/` — media/CEC platform driver.
**IMPORTANT** for affected Chromebook users, **PERIPHERAL** globally
(CEC on two specific Google boards).

### Step 7.2: Subsystem Activity
**Record:** CEC subsystem is active in this tree (recent fixes for seco,
rc race, debugfs leak). The cros-ec driver itself is mature with a
growing DMI whitelist.

---

## Phase 8: Impact and Risk Assessment

### Step 8.1: Who Is Affected
**Record:** Users of Google Kulnex and Moxoe Chromebooks with
`CONFIG_CEC_CROS_EC=y/m`. Config- and platform-specific; not universal.

### Step 8.2: Trigger Conditions
**Record:** Booting one of these two board models with the cros-ec-cec
driver enabled. Deterministic on every boot. Not a security-relevant or
unprivileged-triggered path.

### Step 8.3: Failure Mode Severity
**Record:** HDMI CEC non-functional; driver probe returns `-ENODEV` with
a warning. **Severity: LOW** — feature absence, not crash, corruption,
deadlock, or security issue.

### Step 8.4: Risk-Benefit Ratio
**Record:**
- **Benefit:** Enables HDMI CEC on two new Chromebook models running
  this kernel; matches established board-enablement pattern.
- **Risk:** Very low — 4 lines, no logic change, only new DMI strings.
- **Ratio:** Moderate benefit for a tiny audience vs. very low risk.
  Does not meet strict "important bug" threshold, but fits the stable
  exception for hardware identification additions.

---

## Phase 9: Final Synthesis

### Step 9.1: Evidence Compile

**FOR backport:**
- Driver and infrastructure fully present in 6.18.43
- Real hardware gap on Kulnex/Moxoe — CEC broken without entries
- Tiny, obviously correct, applies cleanly
- Follows proven Brask/Moxie `port_b_conns` mapping
- Media maintainer (Hans Verkuil) signed off
- Fits stable exception for hardware identification / quirk additions
  (DMI board ID to existing driver)

**AGAINST backport:**
- Not a crash, security, corruption, or deadlock fix
- Failure mode is missing functionality (CEC), severity LOW
- Affects only two specific new Chromebook models
- No user reports, syzbot, or explicit stable nomination
- By-design whitelist: unsupported boards get `-ENODEV`, not a code
  defect on already-supported hardware
- Mailing list review details unverified

**UNRESOLVED:**
- Whether Kulnex/Moxoe actually ship with 6.18.y kernels
- Lore discussion and any stable nominations from reviewers

### Step 9.2: Stable Rules Checklist
1. Obviously correct and tested? **PASS** — mechanical table entries;
   maintainer SOB; pattern proven on Brask/Moxie.
2. Fixes a real bug affecting users? **PASS (narrow)** — real hardware
   support gap for CEC on two boards, not a kernel logic bug.
3. Important issue (crash, security, corruption, deadlock)? **FAIL** —
   CEC absence only; LOW severity.
4. Small and contained? **PASS** — 4 lines, one file.
5. No new features or APIs? **PASS** — no API change; board ID addition
   to existing driver.
6. Can apply to local tree? **PASS** — verified clean apply.

### Step 9.3: Exception Categories
**Record:** **Hardware identification / quirk exception** — DMI match
table entry for an existing platform driver, analogous to adding
PCI/USB/ACPI IDs. Same category as prior Brask, Moxie, Kinox entries.

### Step 9.4: Decision Rationale

This commit does not fix a critical kernel defect. It enables HDMI CEC
on two new Google Chromebook platforms by extending the existing DMI
whitelist in `cros-ec-cec`. That is standard stable material under the
hardware-identification exception: the driver already exists in 6.18.43,
the change is trivial and low-risk, and it unblocks real hardware for
users on those boards. It does not meet the strict "important bug"
criterion on its own, but stable trees routinely take such board-ID
additions when the driver is already present.

For the locally checked-out **6.18.43** tree: the driver exists, the gap
exists, and the patch applies cleanly.

---

## Verification

- **[Phase 1]** Parsed subject, tags, body: hardware enablement for
  Kulnex/Moxoe CEC; Hans Verkuil SOB; no Fixes/Reported-
  by/Link/Cc:stable
- **[Phase 2]** Diff: +4 lines in `cec_dmi_match_table[]`; probe failure
  path confirmed in source
- **[Phase 3]** `git describe HEAD`: v6.18.43-1-gc7f0dac02d232; `make
  kernelversion`: 6.18.43
- **[Phase 3]** `git show ac3fd01e4c1ef:...cros-ec-cec.c`: driver
  present since 6.18-rc7; Moxie present, Kulnex/Moxoe absent
- **[Phase 3]** `grep Kulnex|Moxoe`: no matches in tree
- **[Phase 3]** Git history in this repo is rewritten/unreliable for
  blame; table content verified directly
- **[Phase 4]** `b4 dig -c 4b3f9bff6067a`: failed (commit not in repo)
- **[Phase 4]** Lore fetch: blocked (403/bot protection) —
  **UNVERIFIED** mailing list discussion
- **[Phase 5]** Read `cros_ec_cec_probe()` and
  `cros_ec_cec_find_hdmi_dev()`: confirmed `-ENODEV` path
- **[Phase 5]** `grep cros_ec_cec_find_hdmi_dev`: only called from probe
- **[Phase 6]** File exists at `drivers/media/cec/platform/cros-ec/cros-
  ec-cec.c` (602 lines)
- **[Phase 6]** `git apply --check /tmp/kulnex.patch`: applies cleanly
- **[Phase 6]** `grep Kulnex|Moxoe`: absent from tree
- **[Phase 7]** `CONFIG_CEC_CROS_EC` in
  `drivers/media/cec/platform/Kconfig`; depends on `CROS_EC`
- **[Phase 8]** Failure mode verified: `-ENODEV` + `dev_warn`, not
  oops/panic

**YES**

 drivers/media/cec/platform/cros-ec/cros-ec-cec.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/media/cec/platform/cros-ec/cros-ec-cec.c b/drivers/media/cec/platform/cros-ec/cros-ec-cec.c
index 419b9a7abcceb..4b3f9bff6067a 100644
--- a/drivers/media/cec/platform/cros-ec/cros-ec-cec.c
+++ b/drivers/media/cec/platform/cros-ec/cros-ec-cec.c
@@ -334,6 +334,10 @@ static const struct cec_dmi_match cec_dmi_match_table[] = {
 	{ "Google", "Dirks", "0000:00:02.0", port_ab_conns },
 	/* Google Moxie */
 	{ "Google", "Moxie", "0000:00:02.0", port_b_conns },
+	/* Google Kulnex */
+	{ "Google", "Kulnex", "0000:00:02.0", port_b_conns },
+	/* Google Moxoe */
+	{ "Google", "Moxoe", "0000:00:02.0", port_b_conns },
 };
 
 static struct device *cros_ec_cec_find_hdmi_dev(struct device *dev,
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH AUTOSEL 6.18-5.15] firmware: google: Add bounds checks in coreboot_table_populate()
       [not found] <20260831133314.4125787-1-sashal@kernel.org>
  2026-08-31 13:28 ` [PATCH AUTOSEL 6.18-6.12] platform/chrome: Resolve kb_wake_angle visibility race Sasha Levin
  2026-08-31 13:28 ` [PATCH AUTOSEL 6.18] media: platform: cros-ec: Add Kulnex and Moxoe to the match table Sasha Levin
@ 2026-08-31 13:31 ` Sasha Levin
  2 siblings, 0 replies; 3+ messages in thread
From: Sasha Levin @ 2026-08-31 13:31 UTC (permalink / raw)
  To: patches, stable
  Cc: Titouan Ameline de Cadeville, Julius Werner, Tzung-Bi Shih,
	Sasha Levin, chrome-platform, linux-kernel

From: Titouan Ameline de Cadeville <titouan.ameline@gmail.com>

[ Upstream commit 7b1a1af4556a4f95ef273e91435fe804cbfcd223 ]

coreboot_table_populate() iterates over firmware-provided table entries
with no validation that the entries stay within the mapped memory
region.  A corrupt table with a large `entry->size` advances `ptr_entry`
past the mapped region, causing an out-of-bounds read on the next
iteration.

Add a check before dereferencing `ptr_entry` to ensure the entry header
is readable, and a second check after reading `entry->size` to ensure
the full entry stays within the mapped region.

Pass `len` from coreboot_table_probe() into coreboot_table_populate() to
make the mapped region size available for validation.

Signed-off-by: Titouan Ameline de Cadeville <titouan.ameline@gmail.com>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Link: https://lore.kernel.org/r/20260426214739.117131-1-titouan.ameline@gmail.com
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

# Stable Backport Analysis: `firmware: google: Add bounds checks in
coreboot_table_populate()`

**Local tree:** Linux **6.18.43** (`git describe HEAD` → `v6.18.43`,
Makefile `6.18.43`)

---

## PHASE 1: COMMIT MESSAGE FORENSICS

### Step 1.1: Parse Subject Line
**Record:** `[firmware: google]` `[add]` — Add bounds checks in
`coreboot_table_populate()` to validate firmware table entries stay
within the mapped region.

### Step 1.2: Parse All Commit Message Tags
**Record:**
| Tag | Value |
|-----|-------|
| Signed-off-by | Titouan Ameline de Cadeville
\<titouan.ameline@gmail.com\> (author) |
| Reviewed-by | Julius Werner \<jwerner@chromium.org\> (Chromium/Google
firmware maintainer) |
| Link | https://lore.kernel.org/r/20260426214739.117131-1-
titouan.ameline@gmail.com |
| Signed-off-by | Tzung-Bi Shih \<tzungbi@kernel.org\> (firmware
maintainer) |

**Notable patterns:** Reviewed by a Chromium firmware maintainer. No
`Fixes:`, `Reported-by:`, `Cc: stable`, or syzbot tags. Absence of
stable tags is expected per pipeline rules.

### Step 1.3: Analyze Commit Body
**Record:**
- **Bug:** `coreboot_table_populate()` walks firmware-provided table
  entries without verifying each entry fits inside the memremapped
  region.
- **Symptom:** A corrupt entry with a large `entry->size` advances
  `ptr_entry` past the mapped end; the next iteration dereferences past
  the mapping → out-of-bounds read. `memcpy(device->raw, ptr_entry,
  entry->size)` can also read past the mapping on the current entry.
- **Root cause:** No upper-bound validation against mapped length; only
  a minimum-size check (`entry->size < sizeof(*entry)`) existed.
- **Fix approach:** Pass `len` from `coreboot_table_probe()` into
  `coreboot_table_populate()`; check header readability and full entry
  containment before use.

### Step 1.4: Detect Hidden Bug Fixes
**Record:** Not disguised — explicitly an OOB-read / memory-safety fix,
though described as "add bounds checks" rather than "fix OOB read."

---

## PHASE 2: DIFF ANALYSIS

### Step 2.1: Inventory Changes
**Record:**
- **File:** `drivers/firmware/google/coreboot_table.c` only
- **Scope:** ~10 lines added, 2 signature lines changed — single-file
  surgical fix
- **Functions modified:** `coreboot_table_populate()`,
  `coreboot_table_probe()` (call site only)

### Step 2.2: Code Flow Change (per hunk)

**Hunk 1 — `coreboot_table_populate()`:**
- **Before:** Loop over `header->table_entries`; dereference `entry =
  ptr_entry` with no end-of-region check; advance `ptr_entry +=
  entry->size` unconditionally.
- **After:** Compute `ptr_end = ptr + len`; before dereferencing, verify
  `ptr_entry + sizeof(*entry) <= ptr_end`; after reading `entry->size`,
  verify `ptr_entry + entry->size <= ptr_end`; return `-EINVAL` on
  violation.

**Hunk 2 — `coreboot_table_probe()`:**
- **Before:** `coreboot_table_populate(dev, ptr)`
- **After:** `coreboot_table_populate(dev, ptr, len)` where `len =
  header->header_bytes + header->table_bytes`

**Record:** Normal boot probe path and error path both affected; no
change to remove/teardown paths.

### Step 2.3: Bug Mechanism
**Record:**
- **Category:** Buffer overflow / out-of-bounds access (memory safety)
- **Mechanism:** Firmware-controlled `entry->size` and
  `header->table_entries` can describe a layout larger than the
  memremapped `[ptr, ptr+len)` region. The loop trusts per-entry sizes
  without summing or bounding against `len`. Corrupt or malicious table
  data causes reads past the mapping on `entry` dereference and in
  `memcpy()`. A very large `entry->size` also drives
  `kzalloc(sizeof(device->dev) + entry->size)` before the bounds check
  in the unpatched code.

### Step 2.4: Fix Quality
**Record:**
- Fix is minimal and obviously correct: standard `ptr_end` bounds
  pattern.
- Returns `-EINVAL` on bad data — consistent with existing `entry->size
  < sizeof(*entry)` handling.
- **Regression risk:** Very low. Only adds validation on a firmware-
  parsing path; no locking, no API changes.
- **Minor note:** `header->header_bytes + header->table_bytes` is still
  trusted from firmware (pre-existing); this fix bounds entry iteration
  within that self-reported length, which is the right scope.

---

## PHASE 3: GIT HISTORY INVESTIGATION

### Step 3.1: Blame Changed Lines
**Record:** `git blame` on `coreboot_table_populate()` attributes all
lines to `19eef1d98eeda` (an unrelated AFS commit) due to history
squashing in this stable tree — not reliable for origin dating. `git log
--follow` shows the vulnerable function present at `ac3fd01e4c1ef`
("Linux 6.18-rc7") with identical logic. **Buggy code exists throughout
the 6.18.y series in this checkout.**

### Step 3.2: Follow Fixes: Tag
**Record:** No `Fixes:` tag present — step N/A.

### Step 3.3: File History for Related Changes
**Record:** Recent `drivers/firmware/google/` history in this tree:
- `75d40ccf38ca7` — framebuffer probe cleanup
- `ecb3e4fa31ffa` — framebuffer busy flag fix
- No prior bounds-check fix for `coreboot_table.c`. **Standalone fix,
  not part of a series.**

### Step 3.4: Author's Other Commits
**Record:** No commits by Titouan Ameline in `drivers/firmware/google/`
in this tree. Author appears to be a new contributor to this subsystem;
patch was reviewed by Julius Werner (Chromium).

### Step 3.5: Prerequisites / Dependencies
**Record:** No dependencies. The patch only needs `coreboot_table.c` as
it exists in this tree. `resource_size_t len` is already used in
`coreboot_table_probe()`. **Applies standalone.**

---

## PHASE 4: MAILING LIST AND EXTERNAL RESEARCH

### Step 4.1: Original Patch Discussion
**Record:** `b4 dig -c <commit>` not possible — commit is not in this
checkout. `WebFetch` and `curl` to lore.kernel.org returned 403/bot-
wall. **Lore thread content UNVERIFIED.** Commit message provides Link
and `Reviewed-by: Julius Werner`.

### Step 4.2: Reviewers
**Record:** Julius Werner (Chromium firmware) reviewed. Tzung-Bi Shih
committed. Appropriate subsystem coverage assumed from tags; full
recipient list UNVERIFIED.

### Step 4.3: Bug Report
**Record:** No `Reported-by:`, no syzbot link, no stack trace in commit
message. Bug identified by code review / defensive analysis, not a filed
crash report.

### Step 4.4: Related Patches / Series
**Record:** Single-patch fix. No series dependencies.

### Step 4.5: Stable Mailing List History
**Record:** UNVERIFIED — could not search lore stable list due to access
restrictions.

---

## PHASE 5: CODE SEMANTIC ANALYSIS

### Step 5.1: Key Functions
**Record:** `coreboot_table_populate()`, `coreboot_table_probe()`

### Step 5.2: Callers
**Record:**
- `coreboot_table_populate()` — called only from
  `coreboot_table_probe()` (verified via grep)
- `coreboot_table_probe()` — platform driver `.probe` for
  `coreboot_table_driver`, registered at module init

**Context:** Runs once at boot when `CONFIG_GOOGLE_COREBOOT_TABLE` is
enabled, on ACPI `GOOGCB00` / `BOOT0000` or OF `compatible = "coreboot"`
platforms (Chromebooks, Chromium embedded boards).

### Step 5.3: Callees
**Record:** `memremap()`, `memunmap()`, `kzalloc()`, `memcpy()`,
`device_register()`, `dev_warn()` — memory mapping and device
enumeration from firmware table.

### Step 5.4: Call Chain / Reachability
**Record:**
```
module_init → platform_driver_register → coreboot_table_probe (ACPI/OF
match)
  → memremap firmware table → coreboot_table_populate → iterate entries
```
- **Userspace trigger:** Not directly syscall-reachable.
- **Indirect trigger:** Corrupt or attacker-modified coreboot table in
  firmware flash or ACPI-described memory region.
- **Affected platforms:** Google Chromebooks and other coreboot/Chromium
  devices with `CONFIG_GOOGLE_FIRMWARE` / `CONFIG_GOOGLE_COREBOOT_TABLE`
  (e.g. `arch/arm64/configs/defconfig` has both enabled).

### Step 5.5: Similar Patterns
**Record:** This stable tree has already accepted similar firmware OOB
fixes:
- `cf5708c9d78c9` — `firmware: arm_ffa: Fix out-of-bound writes`
- `11daac2817dca` — `firmware: arm_scmi: Fix OOB in
  scmi_power_name_get()`

Precedent supports firmware-parser bounds-check backports to 6.18.y.

---

## PHASE 6: CROSS-REFERENCE AGAINST LOCAL TREE

### Step 6.1: Does Buggy Code Exist?
**Record:** **YES.** Current `drivers/firmware/google/coreboot_table.c`
lines 104–147 contain the vulnerable loop with no `ptr_end` checks.
Identical logic confirmed at `ac3fd01e4c1ef` (6.18-rc7). Fix is **not**
already present (grep found no `ptr_end` or bounds-check commit).

### Step 6.2: Backport Complications
**Record:** **Clean apply expected.** Local file matches the patch's
pre-change structure exactly (function signature, loop body, probe call
site). No conflicting refactors in recent history.

### Step 6.3: Related Fixes Already Present?
**Record:** **None** for this bug. Grep for `coreboot_table_populate`
bounds fixes returned nothing.

---

## PHASE 7: SUBSYSTEM AND MAINTAINER CONTEXT

### Step 7.1: Subsystem Criticality
**Record:** `drivers/firmware/google/` — **PERIPHERAL** (platform-
specific Google/coreboot firmware driver). Not core kernel, but used on
production Chromebook fleet when enabled.

### Step 7.2: Subsystem Activity
**Record:** Moderate activity in this tree (recent framebuffer probe
fixes). `coreboot_table.c` itself has been stable since 6.18-rc7 with no
prior hardening.

---

## PHASE 8: IMPACT AND RISK ASSESSMENT

### Step 8.1: Who Is Affected
**Record:** **Platform-specific, config-dependent** — systems with
`CONFIG_GOOGLE_COREBOOT_TABLE` (Chromebooks, Chromium ARM boards, some
x86 Google platforms). Not universal; significant within that fleet.

### Step 8.2: Trigger Conditions
**Record:**
- Corrupt coreboot table: flash wear/corruption, buggy coreboot build,
  or compromised firmware
- Mismatch between `table_entries`/per-entry `size` fields and actual
  mapped `len`
- **Likelihood:** Low in normal operation; non-zero with flash
  corruption or firmware bugs
- **Unprivileged userspace:** Cannot trigger directly; requires
  firmware-level corruption

### Step 8.3: Failure Mode Severity
**Record:**
- OOB read on `entry` dereference → possible page fault / kernel oops at
  boot
- OOB read in `memcpy()` → information leak from adjacent mapped memory
- Unchecked large `entry->size` → excessive `kzalloc()` attempt (boot-
  time DoS / OOM)
- **Severity: HIGH** for affected platforms (boot failure or memory-
  safety violation), **LOW** population-wide

### Step 8.4: Risk-Benefit Ratio
**Record:**
- **Benefit:** Prevents OOB reads and unbounded allocation on a firmware
  trust boundary; hardens boot on Chromebook/coreboot systems. Aligns
  with existing stable practice (arm_ffa, arm_scmi OOB backports in this
  tree).
- **Risk:** Very low — ~10 lines of validation, no behavior change on
  valid tables.
- **Ratio:** Favorable for backport to this tree.

---

## PHASE 9: FINAL SYNTHESIS

### Step 9.1: Evidence Summary

**FOR backport:**
- Real, verifiable OOB-read bug in firmware table parser
- Small, surgical, obviously correct fix
- Buggy code present in Linux 6.18.43 checkout
- Clean apply, no dependencies
- Reviewed by Chromium firmware maintainer
- Precedent: similar `firmware:` OOB fixes already in this 6.18.y tree
- Prevents boot-time crash and unbounded allocation on corrupt firmware
  data

**AGAINST backport:**
- No syzbot report or user crash report
- Trigger requires corrupt/malicious firmware table (not common)
- Platform-specific driver behind `CONFIG_GOOGLE_COREBOOT_TABLE`
  (default N in Kconfig)
- Boot-only path, not directly userspace-exploitable
- Lore review thread content could not be fetched

**Unresolved:** Full lore discussion content; whether reviewers
explicitly nominated for stable.

### Step 9.2: Stable Rules Checklist
| Criterion | Result |
|-----------|--------|
| 1. Obviously correct and tested? | **PASS** — standard bounds checks;
reviewed by subsystem expert |
| 2. Fixes a real bug affecting users? | **PASS** — OOB read on corrupt
firmware table on Chromebook/coreboot systems |
| 3. Important issue? | **PASS** — OOB access / potential boot crash
(HIGH on affected platforms) |
| 4. Small and contained? | **PASS** — one file, ~10 lines |
| 5. No new features/APIs? | **PASS** — validation only, static function
signature change |
| 6. Can apply to local tree? | **PASS** — code present, clean apply
expected |

### Step 9.3: Exception Categories
**Record:** None (not device ID, quirk, DT, build, or docs). Qualifies
as a memory-safety / OOB fix on its own merits.

### Step 9.4: Decision Rationale

For **Linux 6.18.y** specifically: the vulnerable
`coreboot_table_populate()` loop exists in this checkout, the fix is
self-contained and low-risk, and it addresses a genuine out-of-bounds
read when parsing firmware-provided table entries. While the trigger
(corrupt coreboot table) is uncommon and the driver is platform-
specific, the fix matches stable-tree practice already established in
this same tree for firmware OOB issues, and failure modes include boot-
time kernel faults and unbounded allocation from attacker-influenced
firmware fields. The conservative stable choice here is to include the
hardening.

---

## Verification

- **[Phase 1]** Parsed commit message from user query: subsystem, tags,
  bug description recorded
- **[Phase 2]** Read `drivers/firmware/google/coreboot_table.c`:
  confirmed vulnerable loop at lines 104–147, no `ptr_end` checks
- **[Phase 2]** Diff analysis: two bounds checks + `len` parameter pass-
  through verified against local file
- **[Phase 3]** `git describe HEAD` → `v6.18.43`; Makefile → 6.18.43
- **[Phase 3]** `git blame` on `coreboot_table_populate()`: squashed
  history (unreliable origin)
- **[Phase 3]** `git log --follow` on file: vulnerable code at
  `ac3fd01e4c1ef` (Linux 6.18-rc7)
- **[Phase 3]** `git log --oneline -20 --
  drivers/firmware/google/coreboot_table.c`: limited history due to
  stable tree squash
- **[Phase 3]** No `Fixes:` tag; no prerequisite commits found
- **[Phase 4]** `b4 dig -c` failed — commit not in local repo
- **[Phase 4]** `WebFetch` lore URL → bot wall; `curl` raw lore → 403.
  **Lore content UNVERIFIED**
- **[Phase 5]** `grep coreboot_table_populate`: only caller is
  `coreboot_table_probe()`
- **[Phase 5]** Read Kconfig: `GOOGLE_COREBOOT_TABLE` depends on
  `HAS_IOMEM && (ACPI || OF)`
- **[Phase 5]** `arch/arm64/configs/defconfig`:
  `CONFIG_GOOGLE_FIRMWARE=y`, `CONFIG_GOOGLE_COREBOOT_TABLE=m`
- **[Phase 5]** Precedent: `cf5708c9d78c9`, `11daac2817dca` firmware OOB
  fixes in this tree
- **[Phase 6]** Buggy code confirmed present; fix not present (`grep
  ptr_end` → no match in coreboot_table.c)
- **[Phase 6]** Local file structure matches patch base — clean apply
  expected
- **[Phase 8]** Failure mode: OOB read / boot oops / kzalloc abuse —
  severity HIGH on affected platforms

**YES**

 drivers/firmware/google/coreboot_table.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c
index 882db32e51be9..f212b84ee2f93 100644
--- a/drivers/firmware/google/coreboot_table.c
+++ b/drivers/firmware/google/coreboot_table.c
@@ -101,16 +101,20 @@ void coreboot_driver_unregister(struct coreboot_driver *driver)
 }
 EXPORT_SYMBOL(coreboot_driver_unregister);
 
-static int coreboot_table_populate(struct device *dev, void *ptr)
+static int coreboot_table_populate(struct device *dev, void *ptr, resource_size_t len)
 {
 	int i, ret;
 	void *ptr_entry;
 	struct coreboot_device *device;
 	struct coreboot_table_entry *entry;
 	struct coreboot_table_header *header = ptr;
+	void *ptr_end;
 
+	ptr_end = ptr + len;
 	ptr_entry = ptr + header->header_bytes;
 	for (i = 0; i < header->table_entries; i++) {
+		if (ptr_entry + sizeof(*entry) > ptr_end)
+			return -EINVAL;
 		entry = ptr_entry;
 
 		if (entry->size < sizeof(*entry)) {
@@ -118,6 +122,9 @@ static int coreboot_table_populate(struct device *dev, void *ptr)
 			return -EINVAL;
 		}
 
+		if (ptr_entry + entry->size > ptr_end)
+			return -EINVAL;
+
 		device = kzalloc(sizeof(device->dev) + entry->size, GFP_KERNEL);
 		if (!device)
 			return -ENOMEM;
@@ -183,7 +190,7 @@ static int coreboot_table_probe(struct platform_device *pdev)
 	if (!ptr)
 		return -ENOMEM;
 
-	ret = coreboot_table_populate(dev, ptr);
+	ret = coreboot_table_populate(dev, ptr, len);
 
 	memunmap(ptr);
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-08-31 13:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20260831133314.4125787-1-sashal@kernel.org>
2026-08-31 13:28 ` [PATCH AUTOSEL 6.18-6.12] platform/chrome: Resolve kb_wake_angle visibility race Sasha Levin
2026-08-31 13:28 ` [PATCH AUTOSEL 6.18] media: platform: cros-ec: Add Kulnex and Moxoe to the match table Sasha Levin
2026-08-31 13:31 ` [PATCH AUTOSEL 6.18-5.15] firmware: google: Add bounds checks in coreboot_table_populate() Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox