summaryrefslogtreecommitdiffstats
path: root/sys/dev/firewire/fwdev.c
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2004-05-23 18:43:44 +0000
committerdfr <dfr@FreeBSD.org>2004-05-23 18:43:44 +0000
commit0c8f1780d64808c3fb8349f76f7afc0a15b26738 (patch)
tree1974379cb9dcf0ca2ef51eb5d38724e7605a0f8a /sys/dev/firewire/fwdev.c
parent1bfae52f16a11a993a0ed44c40a2f881efad64eb (diff)
downloadFreeBSD-src-0c8f1780d64808c3fb8349f76f7afc0a15b26738.zip
FreeBSD-src-0c8f1780d64808c3fb8349f76f7afc0a15b26738.tar.gz
Don't try to copy out the result payload if there isn't one. This ioctl
interface really needs changing to split out the various async request types.
Diffstat (limited to 'sys/dev/firewire/fwdev.c')
-rw-r--r--sys/dev/firewire/fwdev.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/dev/firewire/fwdev.c b/sys/dev/firewire/fwdev.c
index 29c025b..7cf7dc9 100644
--- a/sys/dev/firewire/fwdev.c
+++ b/sys/dev/firewire/fwdev.c
@@ -594,13 +594,21 @@ fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
/* copy response */
tinfo = &sc->fc->tcode[xfer->recv.hdr.mode.hdr.tcode];
- if (asyreq->req.len >= xfer->recv.pay_len + tinfo->hdr_len)
- asyreq->req.len = xfer->recv.pay_len;
- else
- err = EINVAL;
+ if (xfer->recv.hdr.mode.hdr.tcode == FWTCODE_RRESB ||
+ xfer->recv.hdr.mode.hdr.tcode == FWTCODE_LRES) {
+ pay_len = xfer->recv.pay_len;
+ if (asyreq->req.len >= xfer->recv.pay_len + tinfo->hdr_len) {
+ asyreq->req.len = xfer->recv.pay_len +
+ tinfo->hdr_len;
+ } else {
+ err = EINVAL;
+ pay_len = 0;
+ }
+ } else {
+ pay_len = 0;
+ }
bcopy(&xfer->recv.hdr, fp, tinfo->hdr_len);
- bcopy(xfer->recv.payload, (char *)fp + tinfo->hdr_len,
- MAX(0, asyreq->req.len - tinfo->hdr_len));
+ bcopy(xfer->recv.payload, (char *)fp + tinfo->hdr_len, pay_len);
out:
fw_xfer_free_buf(xfer);
break;
OpenPOWER on IntegriCloud