[v4,05/19] vhost: fix error handling when mem table gets updated
Checks
Commit Message
When the memory table gets updated, the rings addresses need
to be translated again. If it fails, we need to exit cleanly
by unmapping memory regions.
Fixes: d5022533c20a ("vhost: retranslate vring addr when memory table changes")
Cc: stable@dpdk.org
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Ilya Maximets <i.maximets@samsung.com>
---
lib/librte_vhost/vhost_user.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Comments
On Mon, Oct 08, 2018 at 05:25:43PM +0200, Maxime Coquelin wrote:
> When the memory table gets updated, the rings addresses need
> to be translated again. If it fails, we need to exit cleanly
> by unmapping memory regions.
>
> Fixes: d5022533c20a ("vhost: retranslate vring addr when memory table changes")
> Cc: stable@dpdk.org
>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> Acked-by: Ilya Maximets <i.maximets@samsung.com>
> ---
> lib/librte_vhost/vhost_user.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
> index 71a0e7dd7..3f01926e2 100644
> --- a/lib/librte_vhost/vhost_user.c
> +++ b/lib/librte_vhost/vhost_user.c
> @@ -964,7 +964,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg)
>
> dev = translate_ring_addresses(dev, i);
> if (!dev)
> - return VH_RESULT_ERR;
> + goto err_mmap;
When dev is NULL, we can't just goto err_mmap directly,
otherwise we will dereference the NULL pointer.
>
> *pdev = dev;
> }
> --
> 2.17.1
>
On 10/09/2018 01:35 PM, Tiwei Bie wrote:
> On Mon, Oct 08, 2018 at 05:25:43PM +0200, Maxime Coquelin wrote:
>> When the memory table gets updated, the rings addresses need
>> to be translated again. If it fails, we need to exit cleanly
>> by unmapping memory regions.
>>
>> Fixes: d5022533c20a ("vhost: retranslate vring addr when memory table changes")
>> Cc: stable@dpdk.org
>>
>> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>> Acked-by: Ilya Maximets <i.maximets@samsung.com>
>> ---
>> lib/librte_vhost/vhost_user.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
>> index 71a0e7dd7..3f01926e2 100644
>> --- a/lib/librte_vhost/vhost_user.c
>> +++ b/lib/librte_vhost/vhost_user.c
>> @@ -964,7 +964,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg)
>>
>> dev = translate_ring_addresses(dev, i);
>> if (!dev)
>> - return VH_RESULT_ERR;
>> + goto err_mmap;
>
> When dev is NULL, we can't just goto err_mmap directly,
> otherwise we will dereference the NULL pointer.
Indeed, thanks for catching it.
I think we should restore dev to *pdev value.
>>
>> *pdev = dev;
>> }
>> --
>> 2.17.1
>>
@@ -964,7 +964,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg)
dev = translate_ring_addresses(dev, i);
if (!dev)
- return VH_RESULT_ERR;
+ goto err_mmap;
*pdev = dev;
}