Skip to content

Commit 57b01d9

Browse files
masalkhigregkh
authored andcommitted
media: vidtv: fix pass-by-value structs causing MSAN warnings
commit 5f8e73b upstream. vidtv_ts_null_write_into() and vidtv_ts_pcr_write_into() take their argument structs by value, causing MSAN to report uninit-value warnings. While only vidtv_ts_null_write_into() has triggered a report so far, both functions share the same issue. Fix by passing both structs by const pointer instead, avoiding the stack copy of the struct along with its MSAN shadow and origin metadata. The functions do not modify the structs, which is enforced by the const qualifier. Fixes: f90cf60 ("media: vidtv: add a bridge driver") Cc: [email protected] Reported-by: [email protected] Closes: https://syzkaller.appspot.com/bug?extid=96f901260a0b2d29cd1a Tested-by: [email protected] Suggested-by: Yihan Ding <[email protected]> Signed-off-by: Abd-Alrhman Masalkhi <[email protected]> Signed-off-by: Hans Verkuil <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 41de342 commit 57b01d9

3 files changed

Lines changed: 28 additions & 28 deletions

File tree

drivers/media/test-drivers/vidtv/vidtv_mux.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ static u32 vidtv_mux_push_pcr(struct vidtv_mux *m)
233233
/* the 27Mhz clock will feed both parts of the PCR bitfield */
234234
args.pcr = m->timing.clk;
235235

236-
nbytes += vidtv_ts_pcr_write_into(args);
236+
nbytes += vidtv_ts_pcr_write_into(&args);
237237
m->mux_buf_offset += nbytes;
238238

239239
m->num_streamed_pcr++;
@@ -363,7 +363,7 @@ static u32 vidtv_mux_pad_with_nulls(struct vidtv_mux *m, u32 npkts)
363363
args.continuity_counter = &ctx->cc;
364364

365365
for (i = 0; i < npkts; ++i) {
366-
m->mux_buf_offset += vidtv_ts_null_write_into(args);
366+
m->mux_buf_offset += vidtv_ts_null_write_into(&args);
367367
args.dest_offset = m->mux_buf_offset;
368368
}
369369

drivers/media/test-drivers/vidtv/vidtv_ts.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,29 +48,29 @@ void vidtv_ts_inc_cc(u8 *continuity_counter)
4848
*continuity_counter = 0;
4949
}
5050

51-
u32 vidtv_ts_null_write_into(struct null_packet_write_args args)
51+
u32 vidtv_ts_null_write_into(const struct null_packet_write_args *args)
5252
{
5353
u32 nbytes = 0;
5454
struct vidtv_mpeg_ts ts_header = {};
5555

5656
ts_header.sync_byte = TS_SYNC_BYTE;
5757
ts_header.bitfield = cpu_to_be16(TS_NULL_PACKET_PID);
5858
ts_header.payload = 1;
59-
ts_header.continuity_counter = *args.continuity_counter;
59+
ts_header.continuity_counter = *args->continuity_counter;
6060

6161
/* copy TS header */
62-
nbytes += vidtv_memcpy(args.dest_buf,
63-
args.dest_offset + nbytes,
64-
args.buf_sz,
62+
nbytes += vidtv_memcpy(args->dest_buf,
63+
args->dest_offset + nbytes,
64+
args->buf_sz,
6565
&ts_header,
6666
sizeof(ts_header));
6767

68-
vidtv_ts_inc_cc(args.continuity_counter);
68+
vidtv_ts_inc_cc(args->continuity_counter);
6969

7070
/* fill the rest with empty data */
71-
nbytes += vidtv_memset(args.dest_buf,
72-
args.dest_offset + nbytes,
73-
args.buf_sz,
71+
nbytes += vidtv_memset(args->dest_buf,
72+
args->dest_offset + nbytes,
73+
args->buf_sz,
7474
TS_FILL_BYTE,
7575
TS_PACKET_LEN - nbytes);
7676

@@ -83,17 +83,17 @@ u32 vidtv_ts_null_write_into(struct null_packet_write_args args)
8383
return nbytes;
8484
}
8585

86-
u32 vidtv_ts_pcr_write_into(struct pcr_write_args args)
86+
u32 vidtv_ts_pcr_write_into(const struct pcr_write_args *args)
8787
{
8888
u32 nbytes = 0;
8989
struct vidtv_mpeg_ts ts_header = {};
9090
struct vidtv_mpeg_ts_adaption ts_adap = {};
9191

9292
ts_header.sync_byte = TS_SYNC_BYTE;
93-
ts_header.bitfield = cpu_to_be16(args.pid);
93+
ts_header.bitfield = cpu_to_be16(args->pid);
9494
ts_header.scrambling = 0;
9595
/* cc is not incremented, but it is needed. see 13818-1 clause 2.4.3.3 */
96-
ts_header.continuity_counter = *args.continuity_counter;
96+
ts_header.continuity_counter = *args->continuity_counter;
9797
ts_header.payload = 0;
9898
ts_header.adaptation_field = 1;
9999

@@ -102,27 +102,27 @@ u32 vidtv_ts_pcr_write_into(struct pcr_write_args args)
102102
ts_adap.PCR = 1;
103103

104104
/* copy TS header */
105-
nbytes += vidtv_memcpy(args.dest_buf,
106-
args.dest_offset + nbytes,
107-
args.buf_sz,
105+
nbytes += vidtv_memcpy(args->dest_buf,
106+
args->dest_offset + nbytes,
107+
args->buf_sz,
108108
&ts_header,
109109
sizeof(ts_header));
110110

111111
/* write the adap after the TS header */
112-
nbytes += vidtv_memcpy(args.dest_buf,
113-
args.dest_offset + nbytes,
114-
args.buf_sz,
112+
nbytes += vidtv_memcpy(args->dest_buf,
113+
args->dest_offset + nbytes,
114+
args->buf_sz,
115115
&ts_adap,
116116
sizeof(ts_adap));
117117

118118
/* write the PCR optional */
119-
nbytes += vidtv_ts_write_pcr_bits(args.dest_buf,
120-
args.dest_offset + nbytes,
121-
args.pcr);
119+
nbytes += vidtv_ts_write_pcr_bits(args->dest_buf,
120+
args->dest_offset + nbytes,
121+
args->pcr);
122122

123-
nbytes += vidtv_memset(args.dest_buf,
124-
args.dest_offset + nbytes,
125-
args.buf_sz,
123+
nbytes += vidtv_memset(args->dest_buf,
124+
args->dest_offset + nbytes,
125+
args->buf_sz,
126126
TS_FILL_BYTE,
127127
TS_PACKET_LEN - nbytes);
128128

drivers/media/test-drivers/vidtv/vidtv_ts.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void vidtv_ts_inc_cc(u8 *continuity_counter);
9090
*
9191
* Return: The number of bytes written into the buffer.
9292
*/
93-
u32 vidtv_ts_null_write_into(struct null_packet_write_args args);
93+
u32 vidtv_ts_null_write_into(const struct null_packet_write_args *args);
9494

9595
/**
9696
* vidtv_ts_pcr_write_into - Write a PCR packet into a buffer.
@@ -101,6 +101,6 @@ u32 vidtv_ts_null_write_into(struct null_packet_write_args args);
101101
*
102102
* Return: The number of bytes written into the buffer.
103103
*/
104-
u32 vidtv_ts_pcr_write_into(struct pcr_write_args args);
104+
u32 vidtv_ts_pcr_write_into(const struct pcr_write_args *args);
105105

106106
#endif //VIDTV_TS_H

0 commit comments

Comments
 (0)