[dpdk-dev] [PATCH v3 2/7] vhost: make gpa to hpa failure an error

Maxime Coquelin maxime.coquelin at redhat.com
Tue Jul 3 07:51:33 CEST 2018



On 07/03/2018 06:45 AM, Tiwei Bie wrote:
> On Wed, Jun 27, 2018 at 04:49:54PM +0200, Maxime Coquelin wrote:
>> CVE-2018-1059 fix makes sure gpa contiguous memory is
>> also contiguous in hva space. Incidentally, it also makes
>> sure it is contiguous in hpa space.
>>
>> So we can simplify the code by making gpa contiguous memory
>> discontiguous in hpa space an error.
> 
> Does it mean that when guest virtio driver using
> gpa contiguous but hpa discontiguous memory, vhost
> won't be able to process the corresponding desc?
> And in this case, should vhost skip this desc?

No, I think that's a mistake from my side, I mixed hpa and hva,
and so thought that this case would never happen as we already
manage buffers discontiguous in hva space.

I'll revert to the old behaviour.

Thanks!
Maxime

> Best regards,
> Tiwei Bie
> 
>>
>> Signed-off-by: Maxime Coquelin <maxime.coquelin at redhat.com>
>> ---
>>   lib/librte_vhost/virtio_net.c | 14 +++++++-------
>>   1 file changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c
>> index 7e70a927f..ec4bcc400 100644
>> --- a/lib/librte_vhost/virtio_net.c
>> +++ b/lib/librte_vhost/virtio_net.c
>> @@ -884,13 +884,13 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq,
>>   
>>   		cpy_len = RTE_MIN(desc_chunck_len, mbuf_avail);
>>   
>> -		/*
>> -		 * A desc buf might across two host physical pages that are
>> -		 * not continuous. In such case (gpa_to_hpa returns 0), data
>> -		 * will be copied even though zero copy is enabled.
>> -		 */
>> -		if (unlikely(dev->dequeue_zero_copy && (hpa = gpa_to_hpa(dev,
>> -					desc_gaddr + desc_offset, cpy_len)))) {
>> +		if (unlikely(dev->dequeue_zero_copy)) {
>> +			hpa = gpa_to_hpa(dev,
>> +					desc_gaddr + desc_offset, cpy_len);
>> +			if (unlikely(!hpa)) {
>> +				error = -1;
>> +				goto out;
>> +			}
>>   			cur->data_len = cpy_len;
>>   			cur->data_off = 0;
>>   			cur->buf_addr = (void *)(uintptr_t)(desc_addr
>> -- 
>> 2.14.4
>>


More information about the dev mailing list