소스 검색

[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 년 전
부모
커밋
c9af896314
1개의 변경된 파일10개의 추가작업 그리고 3개의 파일을 삭제
  1. 10
    3
      src/drivers/infiniband/linda.c

+ 10
- 3
src/drivers/infiniband/linda.c 파일 보기

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…
취소
저장