All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alejandro Colomar <alx+linux-hardening@kernel.org>
To: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: Alejandro Colomar <alx@kernel.org>,
	linux-hardening@vger.kernel.org,
	 Krzysztof Kozlowski <krzk@kernel.org>,
	"Maciej W. Rozycki" <macro@orcam.me.uk>,
	 Geert Uytterhoeven <geert@linux-m68k.org>,
	Andreas Schwab <schwab@linux-m68k.org>,
	 Andy Shevchenko <andy@kernel.org>,
	Bartosz Golaszewski <brgl@kernel.org>,
	 Daniel Scally <djrscally@gmail.com>,
	Danilo Krummrich <dakr@kernel.org>,
	 Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	 Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Joe Perches <joe@perches.com>, Johan Hovold <johan@kernel.org>,
	 Kees Cook <kees@kernel.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	 Len Brown <lenb@kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	 Linus Walleij <linusw@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	 "Rafael J. Wysocki" <rafael@kernel.org>,
	Rob Herring <robh@kernel.org>,
	 Sakari Ailus <sakari.ailus@linux.intel.com>,
	Saravana Kannan <saravanak@kernel.org>,
	 Steven Rostedt <rostedt@goodmis.org>,
	Tom Zanussi <zanussi@kernel.org>,
	linux-acpi@vger.kernel.org,  driver-core@lists.linux.dev,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	 linux-gpio@vger.kernel.org
Subject: Re: [PATCH v5 7/7] string: Implement strstarts() with strprefix()
Date: Fri, 13 Nov 2026 22:13:01 +0100	[thread overview]
Message-ID: <avd794VWdjncD9YI@devuan> (raw)
In-Reply-To: <avd4XpBivw86pBYh@devuan>

[-- Attachment #1: Type: text/plain, Size: 8747 bytes --]

> Date: 2026-11-13 21:57:24+0100
> From: Alejandro Colomar <alx+linux-hardening@kernel.org>
>
[...]
> > > -  strstarts():
> > > 	It could be improved by returning a boolean-like pointer,
> > > 	instead of a bool, but:
> > > 
> > > 	-  We may need to fix some callers, since some of them might
> > > 	   need an explicit conversion with !!.  It'd be risky to change
> > > 	   the implementation without first verifying that.
> > 
> > How many cases do we have that needs special attention? Can you run spatch to
> > grep those?
> 
> I *think* the only ones I expect this would be necessary are functions
> that return a boolean-like int.
> 
> 	// returns 1:true 0:false -1:error=
> 	int
> 	foo(...)
> 	{
> 		...
> 		return !!strprefix(...);
> 	}

I've searched for cases of this, and also for cases of assignment to
a variable that might be of type int (I expect this to be less
frequent).  I haven't used spatch(1) so far, but just grep(1):

	$ grep -rn -e '= .*strstarts(' -e 'return .*strstarts('
	drivers/mtd/spi-nor/issi.c:141:	return name && strstarts(name, "pm25lv");
	drivers/platform/x86/dell/dell-lis3lv02d.c:109:	return strstarts(adap->name, "SMBus I801 adapter");
	arch/arm/kernel/module.c:25:	return strstarts(name, ".init") ||
	arch/arm/kernel/module.c:32:	return strstarts(name, ".exit") ||
	arch/powerpc/perf/imc-pmu.c:1026:	return strstarts(event->pmu->name, "thread_imc");
	tools/perf/util/map.c:21:	return strstarts(filename, "/data/app-lib/") ||
	tools/perf/util/annotate-arch/annotate-x86.c:144:	if (arch->family >= 0x15 && (strstarts(ins1, "test") ||
	tools/perf/util/annotate-arch/annotate-x86.c:150:	if (arch->family >= 0x19 && (strstarts(ins1, "add") ||
	tools/perf/util/annotate-arch/annotate-x86.c:200:		arch->ins_is_fused = strstarts(cpuid, "AuthenticAMD") ?
	tools/perf/util/symbol.c:854:	if (e_machine == EM_S390 && strstarts(name, "psw_idle")) {
	tools/perf/util/env.c:733:		return strstarts(perf_arch, "ppc64") ? EM_PPC64 : EM_PPC;
	tools/perf/util/env.c:1049:		is_amd = env->cpuid && strstarts(env->cpuid, "AuthenticAMD") ? 1 : -1;
	tools/perf/util/env.c:1072:		is_intel = env->cpuid && strstarts(env->cpuid, "GenuineIntel") ? 1 : -1;
	tools/perf/util/symbol.h:55:	return strstarts(str, KLP_SYM_PREFIX);
	tools/perf/builtin-trace.c:2272:			if (*after == '=' && (strstarts(after + 1, "0x") ||
	tools/perf/perf.c:143:	return (strstarts(var, header) && !strcmp(var + strlen(header), c->cmd));
	tools/perf/tests/symbols.c:155:	if (dso != text_dso && strstarts(dso__short_name(dso), dso__short_name(text_dso)))
	tools/testing/selftests/bpf/prog_tests/sockmap_redir.c:321:	if (type == SK_SKB_INGRESS && strstarts(out, "v_"))
	tools/objtool/klp-sympos.c:372:	return strstarts(sym->sec->name, ".init");
	tools/objtool/klp-checksum.c:66:	return strstarts(sym->sec->name, ".rodata.cst") &&
	tools/objtool/klp-diff.c:204:		export->mod_ns = strstarts(namespace, "module:");
	tools/objtool/klp-diff.c:339:	return strstarts(sym->name, ".L");
	tools/objtool/klp-diff.c:380:	return strstarts(sec->name, ".discard.");
	tools/objtool/klp-diff.c:422:	return strstarts(sym->name, "__initcall__") ||
	kernel/module/main.c:1866:	return strstarts(name, ".init");
	kernel/module/main.c:1871:	return strstarts(name, ".exit");

From all these, only one case was using int.  Here's a patch for making
it more robust:

	diff --git i/tools/perf/util/map.c w/tools/perf/util/map.c
	index 41cdddc987ee..944f10d32796 100644
	--- i/tools/perf/util/map.c
	+++ w/tools/perf/util/map.c
	@@ -16,7 +16,7 @@
	 #include "thread.h"
	 #include "vdso.h"
	 
	-static inline int is_android_lib(const char *filename)
	+static inline bool is_android_lib(const char *filename)
	 {
		return strstarts(filename, "/data/app-lib/") ||
		       strstarts(filename, "/system/lib/");

It's technically not necessary, since the '||' operator converts to
bool, but just in case someone removes one of those calls, using bool
will prevent a bug.

All the other cases were either using 'bool', or didn't need a change
for other reasons.

So, I can include this diff as a preparation patch in this set, and then
make strstarts() be
	#define strstarts(s, prefix)  strprefix(s, prefix)

And then have a global search-and-replace for it.


Cheers,
Alex

> 
> > 
> > > 	   To avoid that risk, I prefer adding a new API, and
> > > 	   deprecating strstarts() for new code.  Over time, I could
> > > 	   slowly migrate users from strstarts() to strprefix().
> > 
> > I believe this is unneeded step which may last for a few releases without even
> > guarantee that it will be finished. In such a case I would like to see a branch
> > with full conversion done before you start sending per-subsystem pieces out.
> 
> Okay; I can do that.
> 
> > > 	-  The name isn't ideal, since "starts" doesn't specify whether
> > > 	   it looks for a string that starts with a given prefix, or if
> > > 	   it looks for a string that starts with any of the given
> > > 	   characters.
> > > 
> > > 	   That is, by the name, I wouldn't be able to know whether
> > > 	   strstarts implements
> > > 
> > > 		bool strstarts(const char *s, const char *xxx)
> > > 		{
> > > 			return strspn(s, xxx);
> > > 		}
> > > 	   or
> > > 		bool strstarts(const char *s, const char *xxx)
> > > 		{
> > > 			return strprefix(s, xxx);
> > > 		}
> > 
> > I didn't get this. We should not really need an implementation details of
> > the API beneath. Documentation what should be read before use. Do we have
> > documentation for strstarts()? Is it clear? Maybe that what should be addressed
> > first?
> > 
> > > -  strends():
> > > 	Same as with strstarts() but from the end.
> > > 
> > > -  str_has_prefix():
> > > 	It was an attempt at strprefix(), but with a problematic
> > > 	approach.  It's frozen because of trace code.
> > > 
> > > -  strprefix()/strsuffix():
> > > 	I'd add them to slowly replace strstarts()/strends().
> > 
> > See above about "slowly"...
> > 
> > > > > I prefer replacing strstarts()/strends() with strprefix()/strsuffix().
> > > > > 
> > > > > But if you prefer changing strstarts() to return a pointer, I'm also
> > > > > okay-ish with it.  It's not a perfect name, but I can live with it.
> > > > > 
> > > > > > However, after looking at the uses in the kernel, I prefer
> > > > > > to see the strprefix() be not implemented at all, just optimization against
> > > > > > strstarts()/strends() if required can be performed.
> > > > > 
> > > > > I don't understand this last sentence.
> > > > 
> > > > It's basically repeats the idea of having only one pair out of two.
> > > 
> > > Ok.
> > > 
> > > > With this series will be
> > > > 
> > > > str_has_previx()
> > > > strstarts()
> > > > strends()
> > > > strprefix()
> > > > // potentially strsuffix()
> > > 
> > > Yes.  I'd like to replace strstarts()/strends() with
> > > strprefix()/strsuffix(), but prefer to do that slowly, to avoid
> > > introducing bugs due to missing explicit conversions to bool.
> > > 
> > > Should I add notes that the strstarts()/strends() APIs are deprecated?
> > 
> > Isn't Steven against that? I already forgot his points.
> 
> As far as I understood, he was against deprecating str_has_prefix(), but
> we didn't yet talk about strstarts().
> 
> > Keeping them
> > just as aliases to strprefix()/strsuffix() perhaps the good start
> > (see below).
> 
> Ok.
> 
> > > > To me seems too many for the similar task. I understand that trace user is
> > > > special one, but does it use strstarts()/strends()?
> > > 
> > > I didn't find any uses:
> > > 
> > > 	$ git ls-files | grep kernel/trace/ | xargs grep strstarts
> > > 	$ git ls-files | grep kernel/trace/ | xargs grep strends
> > > 
> > > > Despite on naming I think we just good to have only str_has*() and one of
> > > > strprefix()/strsuffix(), strstarts()/strends().
> > > 
> > > In the long term, I agree.  But I think the transition should be
> > > careful.  What do you think?
> > 
> > Yes, it should take a few phases, first one perhaps to align strstarts() to not
> > rely on the returned value to be boolean.
> 
> Ok.
> 
> > In parallel with that, your current series can also be considered. Then
> > similar, if even required, to be done against strends().
> 
> Agree.
> 
> > And one more phase
> > is to replace strstarts()/strends() with strprefix()/strsuffix() all over
> > the kernel.
> 
> Ok.
> 
> Thanks!
> 
> 
> Have a lovely night!
> Alex
> 
> > 
> > -- 
> > With Best Regards,
> > Andy Shevchenko
> > 
> > 
> > 
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2026-11-13 21:13 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13 13:10 [PATCH v5 0/7] Add strprefix() and fix a bug with it Alejandro Colomar
2026-11-13 13:10 ` [PATCH v5 1/7] string: Add strprefix(), and deprecate str_has_prefix() Alejandro Colomar
2026-11-13 14:33   ` Andy Shevchenko
2026-11-13 14:34     ` Andy Shevchenko
2026-11-13 14:40       ` Alejandro Colomar
2026-11-13 14:47         ` Andy Shevchenko
2026-11-13 13:10 ` [PATCH v5 2/7] string: Warn if the prefix is the empty string Alejandro Colomar
2026-11-13 13:26   ` sashiko-bot
2026-11-13 13:48     ` Alejandro Colomar
2026-11-13 14:25       ` Andy Shevchenko
2026-11-13 14:32         ` Alejandro Colomar
2026-11-13 13:10 ` [PATCH v5 3/7] device property: Fix fwnode_name_eq() for empty node names Alejandro Colomar
2026-11-13 13:10 ` [PATCH v5 4/7] stddef: Add const_cast() Alejandro Colomar
2026-11-13 13:11 ` [PATCH v5 5/7] string: Add [C]QChar_of() and QVoid_of() Alejandro Colomar
2026-11-13 13:11 ` [PATCH v5 6/7] string: Make strprefix() const-qualifier-generic Alejandro Colomar
2026-11-13 13:11 ` [PATCH v5 7/7] string: Implement strstarts() with strprefix() Alejandro Colomar
2026-11-13 13:20   ` sashiko-bot
2026-11-13 13:36     ` Alejandro Colomar
2026-11-13 14:44   ` Andy Shevchenko
2026-11-13 14:59     ` Alejandro Colomar
2026-11-13 15:07       ` Andy Shevchenko
2026-11-13 15:39         ` Alejandro Colomar
2026-11-13 16:05           ` Andy Shevchenko
2026-11-13 20:57             ` Alejandro Colomar
2026-11-13 21:13               ` Alejandro Colomar [this message]
2026-11-13 21:17                 ` Alejandro Colomar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=avd794VWdjncD9YI@devuan \
    --to=alx+linux-hardening@kernel.org \
    --cc=alx@kernel.org \
    --cc=andriy.shevchenko@intel.com \
    --cc=andy@kernel.org \
    --cc=brgl@kernel.org \
    --cc=dakr@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=djrscally@gmail.com \
    --cc=driver-core@lists.linux.dev \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=joe@perches.com \
    --cc=johan@kernel.org \
    --cc=kees@kernel.org \
    --cc=krzk@kernel.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=lenb@kernel.org \
    --cc=linusw@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=macro@orcam.me.uk \
    --cc=namhyung@kernel.org \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=saravanak@kernel.org \
    --cc=schwab@linux-m68k.org \
    --cc=torvalds@linux-foundation.org \
    --cc=zanussi@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.