diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2014-09-08 07:18:43 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-09-23 15:13:37 -0400 |
commit | 3011e5e592a2d31556cc3eff335a1ecccd473fa0 (patch) | |
tree | 7285f69453ed9f0822019e42afb3ef10fe39c8c8 /drivers/media/firewire/firedtv-avc.c | |
parent | f2e323ec96077642d397bb1c355def536d489d16 (diff) |
[media] firewire: firedtv-avc: potential buffer overflow
"program_info_length" is user controlled and can go up to 4095. The
operand[] array has 509 bytes so we need to add a limit here to prevent
buffer overflows.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/firewire/firedtv-avc.c')
-rw-r--r-- | drivers/media/firewire/firedtv-avc.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/media/firewire/firedtv-avc.c b/drivers/media/firewire/firedtv-avc.c index d1a1a1324ef8..ac17567f0822 100644 --- a/drivers/media/firewire/firedtv-avc.c +++ b/drivers/media/firewire/firedtv-avc.c | |||
@@ -1157,6 +1157,10 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) | |||
1157 | if (pmt_cmd_id != 1 && pmt_cmd_id != 4) | 1157 | if (pmt_cmd_id != 1 && pmt_cmd_id != 4) |
1158 | dev_err(fdtv->device, | 1158 | dev_err(fdtv->device, |
1159 | "invalid pmt_cmd_id %d\n", pmt_cmd_id); | 1159 | "invalid pmt_cmd_id %d\n", pmt_cmd_id); |
1160 | if (program_info_length > sizeof(c->operand) - write_pos) { | ||
1161 | ret = -EINVAL; | ||
1162 | goto out; | ||
1163 | } | ||
1160 | 1164 | ||
1161 | memcpy(&c->operand[write_pos], &msg[read_pos], | 1165 | memcpy(&c->operand[write_pos], &msg[read_pos], |
1162 | program_info_length); | 1166 | program_info_length); |
@@ -1180,6 +1184,11 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) | |||
1180 | dev_err(fdtv->device, "invalid pmt_cmd_id %d " | 1184 | dev_err(fdtv->device, "invalid pmt_cmd_id %d " |
1181 | "at stream level\n", pmt_cmd_id); | 1185 | "at stream level\n", pmt_cmd_id); |
1182 | 1186 | ||
1187 | if (es_info_length > sizeof(c->operand) - write_pos) { | ||
1188 | ret = -EINVAL; | ||
1189 | goto out; | ||
1190 | } | ||
1191 | |||
1183 | memcpy(&c->operand[write_pos], &msg[read_pos], | 1192 | memcpy(&c->operand[write_pos], &msg[read_pos], |
1184 | es_info_length); | 1193 | es_info_length); |
1185 | read_pos += es_info_length; | 1194 | read_pos += es_info_length; |