diff options
| author | Jan Kiszka <jan.kiszka@siemens.com> | 2017-01-03 08:50:01 +0100 |
|---|---|---|
| committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
| commit | 8d0059d74819cc57ed73835cad6a8f7b82744402 (patch) | |
| tree | b5c02c04438de7ca0b1e2c2700c420f1e766b9fd /drivers/net/ivshmem-net.c | |
| parent | 267d8295ef98ce8346b54b0a57664c71d82c52b6 (diff) | |
ivshmem-net: Switch to relative descriptor addresses
Make sure that we do not depend on identity-mapped shared memory
regions.
This also fixes an off-by-one in the range check of ivshm_net_desc_data.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
(cherry picked from commit 426eccbb2dba3b44b3e24e374ab46a0c5f32b65d)
Diffstat (limited to 'drivers/net/ivshmem-net.c')
| -rw-r--r-- | drivers/net/ivshmem-net.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/ivshmem-net.c b/drivers/net/ivshmem-net.c index 9f307ec4d677..0e770ca293a4 100644 --- a/drivers/net/ivshmem-net.c +++ b/drivers/net/ivshmem-net.c @@ -123,14 +123,14 @@ static void *ivshm_net_desc_data(struct ivshm_net *in, struct vring_desc *desc, u32 *len) { - u64 addr = READ_ONCE(desc->addr); + u64 offs = READ_ONCE(desc->addr); u32 dlen = READ_ONCE(desc->len); void *data; - if (addr < in->shmaddr || desc->addr > in->shmaddr + in->shmlen) + if (offs >= in->shmlen) return NULL; - data = in->shm + (addr - in->shmaddr); + data = in->shm + offs; if (data < q->data || data >= q->end) return NULL; @@ -317,7 +317,7 @@ static int ivshm_net_tx_frame(struct net_device *ndev, struct sk_buff *skb) buf = tx->data + head; skb_copy_and_csum_dev(skb, buf); - desc->addr = in->shmaddr + (buf - in->shm); + desc->addr = buf - in->shm; desc->len = skb->len; avail = tx->last_avail_idx++ & (vr->num - 1); |
