aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2010-03-31 10:26:46 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2010-04-10 10:51:13 -0400
commit385ab5bcd4be586dffdba550b310308d89eade71 (patch)
tree76b56fc42e4f11aeb4cfdcc6e98b16220927ca04 /drivers/firewire
parent4ba1d9c0c22947a9207029e7184733252e6135f1 (diff)
firewire: cdev: require quadlet-aligned headers for transmit packets
The definition of struct fw_cdev_iso_packet seems to imply that the header_length must be quadlet-aligned, and in fact, specifying an unaligned header has never really worked when using multiple packet structures, because the position of the next control word is computed by rounding the header_length _down_, so the last one to three bytes of the header would overlap the next control word. To avoid this problem, check that the header length is properly aligned. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/core-cdev.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index bbb8160e2c99..5eba9e0f876c 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -959,6 +959,8 @@ static int ioctl_queue_iso(struct client *client, union ioctl_arg *arg)
959 u.packet.header_length = GET_HEADER_LENGTH(control); 959 u.packet.header_length = GET_HEADER_LENGTH(control);
960 960
961 if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) { 961 if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) {
962 if (u.packet.header_length % 4 != 0)
963 return -EINVAL;
962 header_length = u.packet.header_length; 964 header_length = u.packet.header_length;
963 } else { 965 } else {
964 /* 966 /*