Skip to content

Commit c9e4555

Browse files
sagimaimonkuba-moo
authored andcommitted
ptp: ocp: Limit signal/freq counts in summary output functions
The debugfs summary output could access uninitialized elements in the freq_in[] and signal_out[] arrays, causing NULL pointer dereferences and triggering a kernel Oops (page_fault_oops). This patch adds u8 fields (nr_freq_in, nr_signal_out) to track the number of initialized elements, with a maximum of 4 per array. The summary output functions are updated to respect these limits, preventing out-of-bounds access and ensuring safe array handling. Widen the label variables because the change confuses GCC about max length of the strings. Fixes: ef61f55 ("ptp: ocp: add Adva timecard support") Signed-off-by: Sagi Maimon <[email protected]> Reviewed-by: Simon Horman <[email protected]> Reviewed-by: Vadim Fedorenko <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent c39b1bb commit c9e4555

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

drivers/ptp/ptp_ocp.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ struct ptp_ocp_serial_port {
315315
#define OCP_BOARD_ID_LEN 13
316316
#define OCP_SERIAL_LEN 6
317317
#define OCP_SMA_NUM 4
318+
#define OCP_SIGNAL_NUM 4
319+
#define OCP_FREQ_NUM 4
318320

319321
enum {
320322
PORT_GNSS,
@@ -342,8 +344,8 @@ struct ptp_ocp {
342344
struct dcf_master_reg __iomem *dcf_out;
343345
struct dcf_slave_reg __iomem *dcf_in;
344346
struct tod_reg __iomem *nmea_out;
345-
struct frequency_reg __iomem *freq_in[4];
346-
struct ptp_ocp_ext_src *signal_out[4];
347+
struct frequency_reg __iomem *freq_in[OCP_FREQ_NUM];
348+
struct ptp_ocp_ext_src *signal_out[OCP_SIGNAL_NUM];
347349
struct ptp_ocp_ext_src *pps;
348350
struct ptp_ocp_ext_src *ts0;
349351
struct ptp_ocp_ext_src *ts1;
@@ -378,10 +380,12 @@ struct ptp_ocp {
378380
u32 utc_tai_offset;
379381
u32 ts_window_adjust;
380382
u64 fw_cap;
381-
struct ptp_ocp_signal signal[4];
383+
struct ptp_ocp_signal signal[OCP_SIGNAL_NUM];
382384
struct ptp_ocp_sma_connector sma[OCP_SMA_NUM];
383385
const struct ocp_sma_op *sma_op;
384386
struct dpll_device *dpll;
387+
int signals_nr;
388+
int freq_in_nr;
385389
};
386390

387391
#define OCP_REQ_TIMESTAMP BIT(0)
@@ -2697,6 +2701,8 @@ ptp_ocp_fb_board_init(struct ptp_ocp *bp, struct ocp_resource *r)
26972701
bp->eeprom_map = fb_eeprom_map;
26982702
bp->fw_version = ioread32(&bp->image->version);
26992703
bp->sma_op = &ocp_fb_sma_op;
2704+
bp->signals_nr = 4;
2705+
bp->freq_in_nr = 4;
27002706

27012707
ptp_ocp_fb_set_version(bp);
27022708

@@ -2862,6 +2868,8 @@ ptp_ocp_art_board_init(struct ptp_ocp *bp, struct ocp_resource *r)
28622868
bp->fw_version = ioread32(&bp->reg->version);
28632869
bp->fw_tag = 2;
28642870
bp->sma_op = &ocp_art_sma_op;
2871+
bp->signals_nr = 4;
2872+
bp->freq_in_nr = 4;
28652873

28662874
/* Enable MAC serial port during initialisation */
28672875
iowrite32(1, &bp->board_config->mro50_serial_activate);
@@ -2888,6 +2896,8 @@ ptp_ocp_adva_board_init(struct ptp_ocp *bp, struct ocp_resource *r)
28882896
bp->flash_start = 0xA00000;
28892897
bp->eeprom_map = fb_eeprom_map;
28902898
bp->sma_op = &ocp_adva_sma_op;
2899+
bp->signals_nr = 2;
2900+
bp->freq_in_nr = 2;
28912901

28922902
version = ioread32(&bp->image->version);
28932903
/* if lower 16 bits are empty, this is the fw loader. */
@@ -4008,7 +4018,7 @@ _signal_summary_show(struct seq_file *s, struct ptp_ocp *bp, int nr)
40084018
{
40094019
struct signal_reg __iomem *reg = bp->signal_out[nr]->mem;
40104020
struct ptp_ocp_signal *signal = &bp->signal[nr];
4011-
char label[8];
4021+
char label[16];
40124022
bool on;
40134023
u32 val;
40144024

@@ -4031,7 +4041,7 @@ static void
40314041
_frequency_summary_show(struct seq_file *s, int nr,
40324042
struct frequency_reg __iomem *reg)
40334043
{
4034-
char label[8];
4044+
char label[16];
40354045
bool on;
40364046
u32 val;
40374047

@@ -4175,11 +4185,11 @@ ptp_ocp_summary_show(struct seq_file *s, void *data)
41754185
}
41764186

41774187
if (bp->fw_cap & OCP_CAP_SIGNAL)
4178-
for (i = 0; i < 4; i++)
4188+
for (i = 0; i < bp->signals_nr; i++)
41794189
_signal_summary_show(s, bp, i);
41804190

41814191
if (bp->fw_cap & OCP_CAP_FREQ)
4182-
for (i = 0; i < 4; i++)
4192+
for (i = 0; i < bp->freq_in_nr; i++)
41834193
_frequency_summary_show(s, i, bp->freq_in[i]);
41844194

41854195
if (bp->irig_out) {

0 commit comments

Comments
 (0)