Received: by 2002:ab2:60d1:0:b0:1f7:5705:b850 with SMTP id i17csp1455234lqm; Thu, 2 May 2024 15:59:08 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVuhmvh+fegkBOIYI1RFO4H5+EI7BTm7UDlcow/e/0+aFc4xnEgqGavIY+IwW37CfxNvFBKk8oIFhzjKSxxZT3FlIffpJM648F5z1w8KQ== X-Google-Smtp-Source: AGHT+IHFOm0bLG8qc4odHSPiVQLuWkWC8MaN97KyhYNI/iKFEbqXq/3U8QSzEcG+QtIdZVWtBNLm X-Received: by 2002:a17:902:cccc:b0:1dc:a605:5435 with SMTP id z12-20020a170902cccc00b001dca6055435mr1347811ple.31.1714690747704; Thu, 02 May 2024 15:59:07 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1714690747; cv=pass; d=google.com; s=arc-20160816; b=eVgGhaWa+RAqa6VVOzpANWCN29DpvxWWtI5Ps0mVM+Ip0hjAaHbV3ugnpSHbusv0bV KEG66ABLgC2mM0bCvmYfihCHijJYlVrA/u3GrmWsL+a4eTEuehtz0oGEeE6gS9kLryPL pyFOPoW00s89/rJoRS4VvhI4y8z5C51YG+kYmVTqen1zpeajBFJ5oqsWPv07W2H69ZU2 UP3mMT7gHnhkjvgL2oXl39C4lgt4hQFtEQj7IE8zmpmhP/ihK3mwAKoHXbykDoKCAP9m 8CgU/jkhrHZv/Z9tmbRhNixFQLqVRLP35DKTXEjw3Qz1RYG7oFcKJo9s4X0nckavnviX bbbQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature:dkim-filter; bh=2AET+xUdNmbcmeb9M+8cahTXAm+h2fHVKotlqfP/yns=; fh=o+pbAogIUwSJBgXgUrDCTnVswp++83wV5LehNgLTf0s=; b=isNZZn4Lkf2Rh82tO5wo6m9K4q/4DNK79RPDs2DC9DPZc91KJGwzpg293H1IdjqG1N UaqsqzpICIlIRmsStTuPJYK5qBy4RvifD0AX9/4VW8Ryy/7LyE2sVudJcI1xLOF0eSRM fkBO3nu/x5Qrk3KVaJmzIV0qrh9deTIuNDcobLbZO9pOHgn18qqV4hR8wyf15MGodS6s kU0hcuoRhzqTE/eB/JYtBcdAg0d17KyiSARMRQvW30pZRYRT+wXdtjcdKTVkiTR4i7gC 3TUro8UnUTHV0yFr/aFWf7Za7Z7eNhEo4zMHSg7I7qRfvyXrMqy2q+DqdksBTWnRUGqb WfQQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=ikwLYOCy; arc=pass (i=1 spf=pass spfdomain=linux.microsoft.com dkim=pass dkdomain=linux.microsoft.com dmarc=pass fromdomain=linux.microsoft.com); spf=pass (google.com: domain of linux-kernel+bounces-167028-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-167028-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id lv14-20020a1709032a8e00b001eab9212ad6si1837471plb.195.2024.05.02.15.59.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 May 2024 15:59:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-167028-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=ikwLYOCy; arc=pass (i=1 spf=pass spfdomain=linux.microsoft.com dkim=pass dkdomain=linux.microsoft.com dmarc=pass fromdomain=linux.microsoft.com); spf=pass (google.com: domain of linux-kernel+bounces-167028-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-167028-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 548F928120E for ; Thu, 2 May 2024 22:59:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 302FA1C2AD; Thu, 2 May 2024 22:59:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="ikwLYOCy" Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 132E08462; Thu, 2 May 2024 22:58:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714690739; cv=none; b=g5E0vMGTQiQkkxx3QIOUdSmWGUqLso0VnV83oooZm8ssrTc+8VzuWjqGl0C8iwuGFJqWRb6AKFKOUZjGtJ6UOZifzyEZWnEZ6nxiIyxYlAaNKsIckSsyZBOD8amN1bB9FSUomA07T4xOKawhH1JF1P4kq23vbVx12fEwfKWP3ZM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714690739; c=relaxed/simple; bh=msiYPhRQUtilTo+LztaXAxLX2WPR5Z/zWMXsElHb7sc=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=F9lZogMEkUmcBtTiRk5G6LP+huit9kMf/ev0Lm7HDQ2+caX/Awlp0a6BrIKGB8ip3+9WDp1DT9j6K3RZvIi2mHfMHSZZAXlo/iqOWassvYnxNBWjqYLY4TmvQ0AEQW/RknHBK1CIYcev6suAV8+ST6yFBBRE0GJmMjEe9WDn2/Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=ikwLYOCy; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Received: from DESKTOP-4OLSCEK. (c-76-135-27-212.hsd1.wa.comcast.net [76.135.27.212]) by linux.microsoft.com (Postfix) with ESMTPSA id 894C320B2C80; Thu, 2 May 2024 15:58:57 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 894C320B2C80 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1714690737; bh=2AET+xUdNmbcmeb9M+8cahTXAm+h2fHVKotlqfP/yns=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ikwLYOCyD9f9Tzajwbed8pjsLgmHenZuAkIBXLuNw325n+JT4VZUwZYdz/EP+s8TB +GrQuqdUgIpQnceUJZ2S1fyPj+WctugwVDnZ/i9H9Yfx43lT/WdTbJCAHHQBk1RzZt dcBS0rK7D9MvVo4saK3e9VBW8Ih2BZe0u+fCdLCk= Date: Thu, 2 May 2024 15:58:53 -0700 From: Beau Belgrave To: Steven Rostedt Cc: mhiramat@kernel.org, mathieu.desnoyers@efficios.com, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, dcook@linux.microsoft.com Subject: Re: [PATCH v2 1/2] tracing/user_events: Fix non-spaced field matching Message-ID: <20240502225853.GA412-beaub@linux.microsoft.com> References: <20240423162338.292-1-beaub@linux.microsoft.com> <20240423162338.292-2-beaub@linux.microsoft.com> <20240502171634.7e2ac794@gandalf.local.home> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240502171634.7e2ac794@gandalf.local.home> On Thu, May 02, 2024 at 05:16:34PM -0400, Steven Rostedt wrote: > On Tue, 23 Apr 2024 16:23:37 +0000 > Beau Belgrave wrote: > > > When the ABI was updated to prevent same name w/different args, it > > missed an important corner case when fields don't end with a space. > > Typically, space is used for fields to help separate them, like > > "u8 field1; u8 field2". If no spaces are used, like > > "u8 field1;u8 field2", then the parsing works for the first time. > > However, the match check fails on a subsequent register, leading to > > confusion. > > > > This is because the match check uses argv_split() and assumes that all > > fields will be split upon the space. When spaces are used, we get back > > { "u8", "field1;" }, without spaces we get back { "u8", "field1;u8" }. > > This causes a mismatch, and the user program gets back -EADDRINUSE. > > > > Add a method to detect this case before calling argv_split(). If found > > force a space after the field separator character ';'. This ensures all > > cases work properly for matching. > > > > With this fix, the following are all treated as matching: > > u8 field1;u8 field2 > > u8 field1; u8 field2 > > u8 field1;\tu8 field2 > > u8 field1;\nu8 field2 > > I'm curious, what happens if you have: "u8 field1; u8 field2;" ? > You'll get an extra whitespace during the copy, assuming it was really: "u8 field1;u8 field2" If it had spaces, this code wouldn't run. > Do you care? As you will then create "u8 field1; u8 field2; " > > but I'm guessing the extra whitespace at the end doesn't affect anything. > Right, you get an extra byte allocated, but the argv_split() with ignore it. The compare will work correctly (I've verified this just now to double check). IE these all match: "Test u8 a; u8 b; " "Test u8 a; u8 b;" "Test u8 a; u8 b" > > > > > Fixes: ba470eebc2f6 ("tracing/user_events: Prevent same name but different args event") > > Signed-off-by: Beau Belgrave > > --- > > kernel/trace/trace_events_user.c | 76 +++++++++++++++++++++++++++++++- > > 1 file changed, 75 insertions(+), 1 deletion(-) > > > > diff --git a/kernel/trace/trace_events_user.c b/kernel/trace/trace_events_user.c > > index 70d428c394b6..82b191f33a28 100644 > > --- a/kernel/trace/trace_events_user.c > > +++ b/kernel/trace/trace_events_user.c > > @@ -1989,6 +1989,80 @@ static int user_event_set_tp_name(struct user_event *user) > > return 0; > > } > > > > +/* > > + * Counts how many ';' without a trailing space are in the args. > > + */ > > +static int count_semis_no_space(char *args) > > +{ > > + int count = 0; > > + > > + while ((args = strchr(args, ';'))) { > > + args++; > > + > > + if (!isspace(*args)) > > + count++; > > This will count that "..;" > > This is most likely not an issue, but since I didn't see this case > anywhere, I figured I bring it up just to confirm that it's not an issue. > It's not an issue on the matching/logic. However, you do get an extra byte alloc (which doesn't bother me in this edge case). Thanks, -Beau > -- Steve > > > > + } > > + > > + return count; > > +} > > + > > +/* > > + * Copies the arguments while ensuring all ';' have a trailing space. > > + */ > > +static char *insert_space_after_semis(char *args, int count) > > +{ > > + char *fixed, *pos; > > + int len; > > + > > + len = strlen(args) + count; > > + fixed = kmalloc(len + 1, GFP_KERNEL); > > + > > + if (!fixed) > > + return NULL; > > + > > + pos = fixed; > > + > > + /* Insert a space after ';' if there is no trailing space. */ > > + while (*args) { > > + *pos = *args++; > > + > > + if (*pos++ == ';' && !isspace(*args)) > > + *pos++ = ' '; > > + } > > + > > + *pos = '\0'; > > + > > + return fixed; > > +} > > +