Browse Source

[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>
tags/v1.20.1
Michael Brown 8 years ago
parent
commit
c9af896314
1 changed files with 10 additions and 3 deletions
  1. 10
    3
      src/drivers/infiniband/linda.c

+ 10
- 3
src/drivers/infiniband/linda.c View File

1271
 			/* Completing the eager buffer described in
1271
 			/* Completing the eager buffer described in
1272
 			 * this header entry.
1272
 			 * this header entry.
1273
 			 */
1273
 			 */
1274
-			iob_put ( iobuf, payload_len );
1275
-			rc = ( err ? -EIO : ( useegrbfr ? 0 : -ECANCELED ) );
1274
+			if ( payload_len <= iob_tailroom ( iobuf ) ) {
1275
+				iob_put ( iobuf, payload_len );
1276
+				rc = ( err ?
1277
+				       -EIO : ( useegrbfr ? 0 : -ECANCELED ) );
1278
+			} else {
1279
+				DBGC ( linda, "Linda %p bad payload len %zd\n",
1280
+				       linda, payload_len );
1281
+				rc = -EPROTO;
1282
+			}
1276
 			/* Redirect to target QP if necessary */
1283
 			/* Redirect to target QP if necessary */
1277
 			if ( qp != intended_qp ) {
1284
 			if ( qp != intended_qp ) {
1278
 				DBGC ( linda, "Linda %p redirecting QPN %ld "
1285
 				DBGC ( linda, "Linda %p redirecting QPN %ld "
1283
 				intended_qp->recv.fill++;
1290
 				intended_qp->recv.fill++;
1284
 			}
1291
 			}
1285
 			ib_complete_recv ( ibdev, intended_qp, &dest, &source,
1292
 			ib_complete_recv ( ibdev, intended_qp, &dest, &source,
1286
-					   iobuf, rc);
1293
+					   iobuf, rc );
1287
 		} else {
1294
 		} else {
1288
 			/* Completing on a skipped-over eager buffer */
1295
 			/* Completing on a skipped-over eager buffer */
1289
 			ib_complete_recv ( ibdev, qp, &dest, &source, iobuf,
1296
 			ib_complete_recv ( ibdev, qp, &dest, &source, iobuf,

Loading…
Cancel
Save