summaryrefslogtreecommitdiffstats
path: root/src/drivers/infiniband
diff options
context:
space:
mode:
authorMichael Brown2016-03-30 08:27:09 +0200
committerMichael Brown2016-03-30 08:27:09 +0200
commitc9af896314e33885fc91e86f531bea7e7dd1f9f3 (patch)
treefe0f335b7f20cfd3d8f2e130658a3a50f3961a0a /src/drivers/infiniband
parent[netdevice] Return ENOENT for an unknown bus type (diff)
downloadipxe-c9af896314e33885fc91e86f531bea7e7dd1f9f3.tar.gz
ipxe-c9af896314e33885fc91e86f531bea7e7dd1f9f3.tar.xz
ipxe-c9af896314e33885fc91e86f531bea7e7dd1f9f3.zip
[linda] Validate payload length
There is no way for the hardware to give us an invalid length in the LRH, since it must have parsed this length field in order to perform header splitting. However, this is difficult to prove conclusively. Add an unnecessary length check to explicitly reject any packets larger than the posted receive I/O buffer. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/infiniband')
-rw-r--r--src/drivers/infiniband/linda.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/drivers/infiniband/linda.c b/src/drivers/infiniband/linda.c
index 391fff42..77d50d11 100644
--- a/src/drivers/infiniband/linda.c
+++ b/src/drivers/infiniband/linda.c
@@ -1271,8 +1271,15 @@ static void linda_complete_recv ( struct ib_device *ibdev,
/* Completing the eager buffer described in
* this header entry.
*/
- iob_put ( iobuf, payload_len );
- rc = ( err ? -EIO : ( useegrbfr ? 0 : -ECANCELED ) );
+ if ( payload_len <= iob_tailroom ( iobuf ) ) {
+ iob_put ( iobuf, payload_len );
+ rc = ( err ?
+ -EIO : ( useegrbfr ? 0 : -ECANCELED ) );
+ } else {
+ DBGC ( linda, "Linda %p bad payload len %zd\n",
+ linda, payload_len );
+ rc = -EPROTO;
+ }
/* Redirect to target QP if necessary */
if ( qp != intended_qp ) {
DBGC ( linda, "Linda %p redirecting QPN %ld "
@@ -1283,7 +1290,7 @@ static void linda_complete_recv ( struct ib_device *ibdev,
intended_qp->recv.fill++;
}
ib_complete_recv ( ibdev, intended_qp, &dest, &source,
- iobuf, rc);
+ iobuf, rc );
} else {
/* Completing on a skipped-over eager buffer */
ib_complete_recv ( ibdev, qp, &dest, &source, iobuf,