From: Ahmad Byagowi <ahmadexp@gmail.com>
To: linux-leds@vger.kernel.org, devicetree@vger.kernel.org,
linux-i2c@vger.kernel.org, netdev@vger.kernel.org
Cc: Lee Jones <lee@kernel.org>, Pavel Machek <pavel@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Andi Shyti <andi.shyti@kernel.org>,
Peter Rosin <peda@lysator.liu.se>,
Nam Tran <trannamatk@gmail.com>,
Vadim Fedorenko <vadim.fedorenko@linux.dev>,
Richard Cochran <richardcochran@gmail.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
linux-hardening@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: [RFC net-next v2 4/6] ptp: ocp: Validate EEPROM board IDs
Date: Mon, 3 Aug 2026 13:50:09 -0700 [thread overview]
Message-ID: <20260803205011.1249-5-ahmadexp@gmail.com> (raw)
In-Reply-To: <20260803205011.1249-1-ahmadexp@gmail.com>
The EEPROM board ID is a fixed 13-byte field. It is stored without room
for a terminator and passed to devlink as a C string. An erased EEPROM
therefore exposes 0xff bytes and can make devlink read beyond the field
while formatting board.id.
Reserve a trailing byte, classify erased and malformed contents, and
publish board.id only when the field contains printable text with valid
padding. Continue reporting the serial number when the board ID is
absent.
Fixes: 0cfcdd1ebcfe1a9b262f6ad8419580720dc843c4 ("ptp: ocp: add nvmem interface for accessing eeprom")
Cc: stable@vger.kernel.org
Signed-off-by: Ahmad Byagowi <ahmadexp@gmail.com>
---
drivers/ptp/ptp_ocp.c | 69 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 66 insertions(+), 3 deletions(-)
diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
index 35e911f1a..cec936bd1 100644
--- a/drivers/ptp/ptp_ocp.c
+++ b/drivers/ptp/ptp_ocp.c
@@ -347,6 +347,13 @@ struct ptp_ocp_serial_port {
#define OCP_SIGNAL_NUM 4
#define OCP_FREQ_NUM 4
+enum ptp_ocp_board_id_state {
+ OCP_BOARD_ID_UNREAD,
+ OCP_BOARD_ID_VALID,
+ OCP_BOARD_ID_ERASED,
+ OCP_BOARD_ID_INVALID,
+};
+
enum {
PORT_GNSS,
PORT_GNSS2,
@@ -401,8 +408,9 @@ struct ptp_ocp {
bool fw_loader;
u8 fw_tag;
u16 fw_version;
- u8 board_id[OCP_BOARD_ID_LEN];
+ char board_id[OCP_BOARD_ID_LEN + 1];
u8 serial[OCP_SERIAL_LEN];
+ enum ptp_ocp_board_id_state board_id_state;
bool has_eeprom_data;
u32 pps_req_map;
int flash_start;
@@ -472,18 +480,23 @@ struct ptp_ocp_eeprom_map {
.len = sizeof_field(struct ptp_ocp, member), \
.bp_offset = offsetof(struct ptp_ocp, member)
+#define EEPROM_ENTRY_LEN(addr, member, entry_len) \
+ .off = addr, \
+ .len = entry_len, \
+ .bp_offset = offsetof(struct ptp_ocp, member)
+
#define BP_MAP_ENTRY_ADDR(bp, map) ({ \
(void *)((uintptr_t)(bp) + (map)->bp_offset); \
})
static struct ptp_ocp_eeprom_map fb_eeprom_map[] = {
- { EEPROM_ENTRY(0x43, board_id) },
+ { EEPROM_ENTRY_LEN(0x43, board_id, OCP_BOARD_ID_LEN) },
{ EEPROM_ENTRY(0x00, serial), .tag = "mac" },
{ }
};
static struct ptp_ocp_eeprom_map art_eeprom_map[] = {
- { EEPROM_ENTRY(0x200 + 0x43, board_id) },
+ { EEPROM_ENTRY_LEN(0x200 + 0x43, board_id, OCP_BOARD_ID_LEN) },
{ EEPROM_ENTRY(0x200 + 0x63, serial) },
{ }
};
@@ -1969,6 +1982,52 @@ ptp_ocp_nvmem_device_put(struct nvmem_device **nvmemp)
*nvmemp = NULL;
}
+static enum ptp_ocp_board_id_state
+ptp_ocp_classify_board_id(char *board_id)
+{
+ bool all_zero = true;
+ bool all_ones = true;
+ bool terminated = false;
+ unsigned int i;
+
+ board_id[OCP_BOARD_ID_LEN] = '\0';
+ for (i = 0; i < OCP_BOARD_ID_LEN; i++) {
+ u8 value = board_id[i];
+
+ all_zero &= value == 0;
+ all_ones &= value == 0xff;
+ }
+
+ if (all_zero || all_ones) {
+ board_id[0] = '\0';
+ return OCP_BOARD_ID_ERASED;
+ }
+
+ for (i = 0; i < OCP_BOARD_ID_LEN; i++) {
+ u8 value = board_id[i];
+
+ if (terminated) {
+ if (value)
+ goto invalid;
+ continue;
+ }
+
+ if (!value) {
+ terminated = true;
+ continue;
+ }
+ if (value < 0x20 || value > 0x7e)
+ goto invalid;
+ }
+
+ if (board_id[0])
+ return OCP_BOARD_ID_VALID;
+
+invalid:
+ board_id[0] = '\0';
+ return OCP_BOARD_ID_INVALID;
+}
+
static void
ptp_ocp_read_eeprom(struct ptp_ocp *bp)
{
@@ -2001,6 +2060,7 @@ ptp_ocp_read_eeprom(struct ptp_ocp *bp)
goto fail;
}
+ bp->board_id_state = ptp_ocp_classify_board_id(bp->board_id);
bp->has_eeprom_data = true;
out:
@@ -2177,6 +2237,9 @@ ptp_ocp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
if (err)
return err;
+ if (bp->board_id_state != OCP_BOARD_ID_VALID)
+ return 0;
+
err = devlink_info_version_fixed_put(req,
DEVLINK_INFO_VERSION_GENERIC_BOARD_ID,
bp->board_id);
--
2.50.1 (Apple Git-155)
next prev parent reply other threads:[~2026-08-03 20:50 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 20:50 [RFC net-next v2 0/6] ptp: ocp: Add R4006 and V9 I2C peripheral support Ahmad Byagowi
2026-08-03 20:50 ` [RFC net-next v2 1/6] dt-bindings: leds: Add IS32FL3207 controller Ahmad Byagowi
2026-08-03 20:50 ` [RFC net-next v2 2/6] leds: rgb: Add IS32FL3207 controller driver Ahmad Byagowi
2026-08-03 20:50 ` [RFC net-next v2 3/6] i2c: mux: Propagate software nodes to channel adapters Ahmad Byagowi
2026-08-03 20:50 ` Ahmad Byagowi [this message]
2026-08-04 13:55 ` [RFC net-next v2 4/6] ptp: ocp: Validate EEPROM board IDs Vadim Fedorenko
2026-08-04 21:07 ` Ahmad Byagowi
2026-08-03 20:50 ` [RFC net-next v2 5/6] ptp: ocp: Add R4006 I2C peripheral topology Ahmad Byagowi
2026-08-03 20:50 ` [RFC net-next v2 6/6] ptp: ocp: Add Time Card V9 " Ahmad Byagowi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260803205011.1249-5-ahmadexp@gmail.com \
--to=ahmadexp@gmail.com \
--cc=andi.shyti@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=gustavoars@kernel.org \
--cc=kees@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=lee@kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavel@kernel.org \
--cc=peda@lysator.liu.se \
--cc=richardcochran@gmail.com \
--cc=robh@kernel.org \
--cc=stable@vger.kernel.org \
--cc=trannamatk@gmail.com \
--cc=vadim.fedorenko@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox