Messages in this thread Patch in this message | | | Date | Tue, 10 Jul 2018 01:54:03 +0200 | From | Dominique Martinet <> | Subject | Re: [V9fs-developer] [PATCH] p9_check_errors() validate PDU length |
| |
(extra Cc: Al Viro, as it's kind of the continuation of the other thread)
Tomas Bortoli wrote on Tue, Jul 10, 2018: > p9_check_errors() does not validate the size of the PDU read > in p9_parse_header(). Any size can be passed, provoking out-of-bound reads.
cf. what I just said in other patch, I think this check needs to be moved up to p9_parse_header as p9_check_zc_error has the same problem.
Also, they really need to check against the actual read size, not just capacity. For virtio/rdma, something like this ought to fix pdu->size, then p9_parse_header can just never overwrite it (untested but it's useless on its own, I'll test the full patch with the parse header change)
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index 3d414acb7015..2649b2ebf961 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c @@ -320,6 +320,7 @@ recv_done(struct ib_cq *cq, struct ib_wc *wc) if (wc->status != IB_WC_SUCCESS) goto err_out; + c->rc->size = wc->byte_len; err = p9_parse_header(c->rc, NULL, NULL, &tag, 1); if (err) goto err_out; diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 05006cbb3361..fc6dc9ca86a4 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c @@ -159,8 +159,10 @@ static void req_done(struct virtqueue *vq) spin_unlock_irqrestore(&chan->lock, flags); /* Wakeup if anyone waiting for VirtIO ring space. */ wake_up(chan->vc_wq); - if (len) + if (len) { + req->rc->size = len; p9_client_cb(chan->client, req, REQ_STATUS_RCVD); + } } } -- Dominique Martinet | Asmadeus
| |