lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 20 Oct 2017 10:44:49 -0400
From:   Boris Ostrovsky <boris.ostrovsky@...cle.com>
To:     Stefano Stabellini <sstabellini@...nel.org>
Cc:     xen-devel@...ts.xen.org, linux-kernel@...r.kernel.org,
        jgross@...e.com, Stefano Stabellini <stefano@...reto.com>
Subject: Re: [PATCH v5 09/13] xen/pvcalls: implement sendmsg

On 10/19/2017 09:41 PM, Stefano Stabellini wrote:
> On Tue, 17 Oct 2017, Boris Ostrovsky wrote:
>>> +static int __write_ring(struct pvcalls_data_intf *intf,
>>> +			struct pvcalls_data *data,
>>> +			struct iov_iter *msg_iter,
>>> +			int len)
>>> +{
>>> +	RING_IDX cons, prod, size, masked_prod, masked_cons;
>>> +	RING_IDX array_size = XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER);
>>> +	int32_t error;
>>> +
>>> +	error = intf->out_error;
>>> +	if (error < 0)
>>> +		return error;
>>> +	cons = intf->out_cons;
>>> +	prod = intf->out_prod;
>>> +	/* read indexes before continuing */
>>> +	virt_mb();
>>> +
>>> +	size = pvcalls_queued(prod, cons, array_size);
>>> +	if (size >= array_size)
>>> +		return 0;
>>
>> I thought you were going to return an error here? If this can only be
>> due to someone messing up indexes is there a reason to continue trying
>> to write? What are the chances that the index will get corrected?
> Sorry, I forgot. I'll change it to return an error, maybe EFAULT.

I think EINVAL might be more appropriate. But either way you can tack on
my R-b to the patch.

-boris

>
>
>>> +	if (len > array_size - size)
>>> +		len = array_size - size;
>>> +
>>> +	masked_prod = pvcalls_mask(prod, array_size);
>>> +	masked_cons = pvcalls_mask(cons, array_size);
>>> +
>>> +	if (masked_prod < masked_cons) {
>>> +		copy_from_iter(data->out + masked_prod, len, msg_iter);
>>> +	} else {
>>> +		if (len > array_size - masked_prod) {
>>> +			copy_from_iter(data->out + masked_prod,
>>> +				       array_size - masked_prod, msg_iter);
>>> +			copy_from_iter(data->out,
>>> +				       len - (array_size - masked_prod),
>>> +				       msg_iter);
>>> +		} else {
>>> +			copy_from_iter(data->out + masked_prod, len, msg_iter);
>>> +		}
>>> +	}
>>> +	/* write to ring before updating pointer */
>>> +	virt_wmb();
>>> +	intf->out_prod += len;
>>> +
>>> +	return len;
>>> +}

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ