Re: [PATCH 5/9] of: property: implement the .property_get_names() fwnode operation
From: Alejandro Colomar
Date: Tue Nov 10 2026 - 06:17:16 EST
> Date: 2026-11-10 12:10:57+0100
> From: Alejandro Colomar <alx+linux-hardening@xxxxxxxxxx>
>
> Hi Bart,
>
> > Date: 2026-11-10 10:00:42+0100
> > From: Bartosz Golaszewski <brgl@xxxxxxxxxx>
> >
> [...]
> > > > > > + names[i] = kstrdup(prop->name, GFP_KERNEL);
> > > > >
> > > > > Can property be statically defined somewhere? We might want to also optimize
> > > > > these duplications with const variant (here or elsewhere, for fwnode generic
> > > > > path, I believe).
> > > >
> > > > Please rephrase because I'm not quite following what you're saying.
> > >
> > > Can prop->name come from something that is declared as
> > >
> > > static const ... foo = {
> > > ... .name = "bar";
> > > };
> > >
> >
> > You can't know it for every instance of struct fwnode_handle, so the
> > answer is: no.
> >
> > PS: is there a way of using match_string() with non-const data?
>
> Given the definition here:
>
> $ grepc match_string .
> ./include/linux/string.h:int match_string(const char * const *array, size_t n, const char *string);
> ./lib/string_helpers.c:int match_string(const char * const *array, size_t n, const char *string)
> {
> int index;
> const char *item;
>
> for (index = 0; index < n; index++) {
> item = array[index];
> if (!item)
> break;
> if (!strcmp(item, string))
> return index;
> }
>
> return -EINVAL;
> }
>
> You should be able to call it with a cast. It's dangerous, but
> technically it works. I'm not encouraging it, though. :)
>
> char **strings;
>
> ...
>
> i = match_string((const char *const *) strings, n, "foo");
>
> This is a historic problem in C, which was solved in C++. I have
> a proposal paper for the C Committee for solving it as in C++:
> <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3987.htm>
>
> This paper will be discussed (and probably voted in) in the next meeting
> of the committee (which happens next week), so there's a chance that
> this will be solved for C2y, and thus the cast will no longer be
> necessary.
FWIW:
alx@devuan:~/tmp$ cat const.c
#include <stddef.h>
int
main(void)
{
const char *const *ccp = NULL;
char **p;
ccp = p;
}
alx@devuan:~/tmp$ gcc const.c
const.c: In function ‘main’:
const.c:9:13: error: assignment to ‘const char * const*’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
9 | ccp = p;
| ^
alx@devuan:~/tmp$ cat const.c | gcc -x c++ -
alx@devuan:~/tmp$
C2y, if my proposal is voted in, will behave like g++ above.
Cheers,
Alex
>
> The history of why this is not allowed in C but is in C++ is, as far as
> I've been told, the following:
>
> Back before C and C++ were standardized, C++ invented const, with rules
> slightly more allowing than what they are now. This was going to be
> standardized first in C89. But very close to the release of C89, they
> realized about the danger of converting a const char** to a char**
> implicitly. They were so close to the release, that they opted for the
> safest approach: disallow any non-trivial conversions.
>
> Later, while standardizing C++98, they realized we could allow a few
> more conversions safely, and so they did.
>
> C could have taken advantage of that, and pick C++ rules in C99 or C11,
> but for some reason, nobody proposed that. I'm proposing it now. :)
>
> We've already discussed this proposal informally within the committee
> for some a year and a half, and there seems to be consensus that we want
> it. We're only being careful about the specific language. But I think
> I finally got it, and it will go in next week.
>
>
> Have a lovely day!
> Alex
>
> >
> > Bart
> >
>
> --
> <https://www.alejandro-colomar.es>
--
<https://www.alejandro-colomar.es>
Attachment:
signature.asc
Description: PGP signature