|
From: Jon M. <jm...@re...> - 2023-02-06 15:28:49
|
On 2023-02-05 23:11, Tung Quang Nguyen wrote:
>
>> -----Original Message-----
>> From: Jon Maloy <jm...@re...>
>> Sent: Saturday, February 4, 2023 1:02 AM
>> To: Tung Quang Nguyen <tun...@de...>; tip...@li...; ma...@do...;
>> yin...@wi...
>> Subject: Re: [tipc-discussion][PATCH v1 1/1] tipc: fix kernel warning when sending SYN message
>>
>>
>>
>> On 2023-01-31 23:03, Tung Nguyen wrote:
>>> When sending a SYN message, this kernel stack trace is observed:
>>>
>>> ...
>>> [ 13.396352] RIP: 0010:_copy_from_iter+0xb4/0x550
>>> ...
>>> [ 13.398494] Call Trace:
>>> [ 13.398630] <TASK>
>>> [ 13.398630] ? __alloc_skb+0xed/0x1a0
>>> [ 13.398630] tipc_msg_build+0x12c/0x670 [tipc]
>>> [ 13.398630] ? shmem_add_to_page_cache.isra.71+0x151/0x290
>>> [ 13.398630] __tipc_sendmsg+0x2d1/0x710 [tipc]
>>> [ 13.398630] ? tipc_connect+0x1d9/0x230 [tipc]
>>> [ 13.398630] ? __local_bh_enable_ip+0x37/0x80
>>> [ 13.398630] tipc_connect+0x1d9/0x230 [tipc]
>>> [ 13.398630] ? __sys_connect+0x9f/0xd0
>>> [ 13.398630] __sys_connect+0x9f/0xd0
>>> [ 13.398630] ? preempt_count_add+0x4d/0xa0
>>> [ 13.398630] ? fpregs_assert_state_consistent+0x22/0x50
>>> [ 13.398630] __x64_sys_connect+0x16/0x20
>>> [ 13.398630] do_syscall_64+0x42/0x90
>>> [ 13.398630] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>
>>> It is because commit a41dad905e5a ("iov_iter: saner checks for attempt to copy to/from iterator")
>>> has introduced sanity check for copying from/to iov iterator. Lacking
>>> of copy direction from the iterator viewpoint would lead to kernel
>>> stack trace like above.
>>>
>>> This commit fixes this issue by initializing the iov iterator with
>>> the correct copy direction.
>>>
>>> Signed-off-by: Tung Nguyen <tun...@de...>
>>> ---
>>> net/tipc/msg.c | 4 ++++
>>> 1 file changed, 4 insertions(+)
>>>
>>> diff --git a/net/tipc/msg.c b/net/tipc/msg.c
>>> index 5c9fd4791c4b..f40cd9032b62 100644
>>> --- a/net/tipc/msg.c
>>> +++ b/net/tipc/msg.c
>>> @@ -377,10 +377,14 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, int offset,
>>> int pktno = 1;
>>> char *pktpos;
>>> int pktsz;
>>> + struct iovec iov;
>>> int rc;
>>>
>>> msg_set_size(mhdr, msz);
>>>
>>> + if (!dsz)
>>> + iov_iter_init(&m->msg_iter, ITER_SOURCE, &iov, 0, 0);
>>> +
>>> /* No fragmentation needed? */
>>> if (likely(msz <= pktmax)) {
>>> skb = tipc_buf_acquire(msz, GFP_KERNEL);
>> I feel a little uncomfortable with adding an uninitialized struct iovec
>> here.
> It is OK not using iovec, just passing NULL to iov_iter_init: iov_iter_init(&m->msg_iter, ITER_SOURCE, NULL, 0, 0).
> My intention was to highlight the copy source and no-copy (count = 0) information.
>> Al Viro had a different proposal in his email from Dec 8th:
>>
>> On 2022-12-11 04:38, Al Viro wrote:
>>> On Thu, Dec 08, 2022 at 08:38:14PM +0100, Eric Dumazet wrote:
>>>
>>>> Exposes an old bug in tipc ?
>>>>
>>>> Seems a new check added by Al in :
>>>>
>>>> Author: Al Viro <vi...@ze...>
>>>> Date: Thu Sep 15 20:11:15 2022 -0400
>>>>
>>>> iov_iter: saner checks for attempt to copy to/from iterator
>>>>
>>>> instead of "don't do it to ITER_PIPE" check for ->data_source being
>>>> false on copying from iterator. Check for !->data_source for
>>>> copying to iterator, while we are at it.
>>>>
>>>> Signed-off-by: Al Viro <vi...@ze...>
>>> Lovely... zero-length sendmsg with uninitialized ->msg_data...
>>>
>>> I would probably argue that it's a bug in tipc_connect(),
>>> fixed by iov_iter_kvec(&m.msg_iter, ITER_SOURCE, NULL, 0, 0);
>>> in there. Depends - if that kind of uninitialized msg_iter used
>>> as zero length source or zero length destination is a frequent pattern,
>>> might as well make zero-byte copy_...iter() succeed quietly;
>>> I hope it isn't, but that's definitely something I'd missed
>>> when doing that series.
>>>
>>> I'll take a look tomorrow^Win the morning, after I get
>>> some sleep...
>>>
>> Did you consider that one?
> This function has the same effect as the one I used. But from the viewpoint of function
> tipc_msg_build(), we mainly want to copy data from user-space. Two exceptions are SYN and ACK- with no data. So, I think using iov_iter_init() makes more sense.
> I suggest that we go with what I did (plus passing NULL for iovec) and CC Al Viro to see if the guy has any objection.
> What do you think ?
Yes, that makes sense. Go ahead.
///jon
>> ///jon
|