public inbox for iwd@lists.linux.dev
 help / color / mirror / Atom feed
* Bug with iwd-3.11 - const char being modified
@ 2026-02-09 20:59 Rudi Heitbaum
  2026-02-10  9:34 ` Marcel Holtmann
  0 siblings, 1 reply; 2+ messages in thread
From: Rudi Heitbaum @ 2026-02-09 20:59 UTC (permalink / raw)
  To: iwd; +Cc: rudi


Bug report (as below) for current iwd (including 3.11) - const char being modified.

When compiling iwd with recent gcc and glibc-2.43 the --Wdiscarded-qualifiers
warning occurs because with ISO C23, the function strrrchr that return
pointers into their input arrays now have definitions as macros that
return a pointer to a const-qualified type when the input argument is
a pointer to a const-qualified type.

../client/known-networks.c: In function 'known_network_proxy_find_by_name':
../client/known-networks.c:296:29: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
  296 |                 char *dot = strrchr(name, '.');
      |                             ^~~~~~~

The fix would be to declare dot as const char as below, but this surfaces
the error that name (which is const) is being modified. See >>>> below -
this being an error.

Regards
Rudi

--- a/client/known-networks.c
+++ b/client/known-networks.c
@@ -293,13 +293,13 @@
 		network_args.type = NULL;
 
 	if (network_args.type) {
-		char *dot = strrchr(name, '.');
+		const char *dot = strrchr(name, '.');
 
 		if (!dot)
 			/* This shouldn't ever be the case */
 			return NULL;
 
 >>>>		*dot = '\0';
 	}
 
 	network_args.name = name;

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Bug with iwd-3.11 - const char being modified
  2026-02-09 20:59 Bug with iwd-3.11 - const char being modified Rudi Heitbaum
@ 2026-02-10  9:34 ` Marcel Holtmann
  0 siblings, 0 replies; 2+ messages in thread
From: Marcel Holtmann @ 2026-02-10  9:34 UTC (permalink / raw)
  To: Rudi Heitbaum; +Cc: iwd

Hi Rudi,

> Bug report (as below) for current iwd (including 3.11) - const char being modified.
> 
> When compiling iwd with recent gcc and glibc-2.43 the --Wdiscarded-qualifiers
> warning occurs because with ISO C23, the function strrrchr that return
> pointers into their input arrays now have definitions as macros that
> return a pointer to a const-qualified type when the input argument is
> a pointer to a const-qualified type.
> 
> ../client/known-networks.c: In function 'known_network_proxy_find_by_name':
> ../client/known-networks.c:296:29: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
>  296 |                 char *dot = strrchr(name, '.');
>      |                             ^~~~~~~
> 
> The fix would be to declare dot as const char as below, but this surfaces
> the error that name (which is const) is being modified. See >>>> below -
> this being an error.
> 
> Regards
> Rudi
> 
> --- a/client/known-networks.c
> +++ b/client/known-networks.c
> @@ -293,13 +293,13 @@
> network_args.type = NULL;
> 
> if (network_args.type) {
> - char *dot = strrchr(name, '.');
> + const char *dot = strrchr(name, '.');
> 
> if (!dot)
> /* This shouldn't ever be the case */
> return NULL;
> 
>>>>> *dot = '\0';
> }
> 
> network_args.name = name;

and this highlights a real issue.

I think the current code is trying to hard. This is untested, but it should be fixed along these lines.

diff --git a/client/known-networks.c b/client/known-networks.c
index 8634aca23e3b..0b24a863a8ef 100644
--- a/client/known-networks.c
+++ b/client/known-networks.c
@@ -243,15 +243,24 @@ static struct proxy_interface_type known_network_interface_type = {
 static bool known_network_match(const void *a, const void *b)
 {
  const struct known_network *network = a;
- const struct network_args *args = b;
-
- if (strcmp(network->name, args->name))
- return false;
-
- if (args->type && strcmp(network->type, args->type))
- return false;
+ const char *name = b;
+ size_t name_len = strlen(name);
+
+ if (l_str_has_suffix(name, ".psk")) {
+ if (strcmp(network->type , "psk"))
+ return false;
+ name_len -= 4;
+ } else if (l_str_has_suffix(name, ".8021x")) {
+ if (strcmp(network->type , "8021x"))
+ return false;
+ name_len -= 6;
+ } else if (l_str_has_suffix(name, ".open")) {
+ if (strcmp(network->type , "open"))
+ return false;
+ name_len -= 5;
+ }
  - return true;
+ return !strncmp(network->name, name, name_len);
 }
   static void check_errors_method_callback(struct l_dbus_message *message,
@@ -276,37 +285,14 @@ static enum cmd_status cmd_list(const char *entity, char **args, int argc)
 static const struct proxy_interface *known_network_proxy_find_by_name(
  const char *name)
 {
- struct network_args network_args;
  struct l_queue *match;
  const struct proxy_interface *proxy;
    if (!name)
  return NULL;
  - if (l_str_has_suffix(name, ".psk"))
- network_args.type = "psk";
- else if (l_str_has_suffix(name, ".8021x"))
- network_args.type = "8021x";
- else if (l_str_has_suffix(name, ".open"))
- network_args.type = "open";
- else
- network_args.type = NULL;
-
- if (network_args.type) {
- char *dot = strrchr(name, '.');
-
- if (!dot)
- /* This shouldn't ever be the case */
- return NULL;
-
- *dot = '\0';
- }
-
- network_args.name = name;
-
  match = proxy_interface_find_all(known_network_interface_type.interface,
- known_network_match,
- &network_args);
+ known_network_match, name);
    if (!match) {
  display("No network with specified parameters was found\n");

And if you want to keep the network_args thing (which seems useless in view), then this could be a fix.

diff --git a/client/known-networks.c b/client/known-networks.c
index 8634aca23e3b..f906378602b1 100644
--- a/client/known-networks.c
+++ b/client/known-networks.c
@@ -279,35 +279,35 @@ static const struct proxy_interface *known_network_proxy_find_by_name(
  struct network_args network_args;
  struct l_queue *match;
  const struct proxy_interface *proxy;
+ size_t name_len;
+ char *args_name;
    if (!name)
  return NULL;
  - if (l_str_has_suffix(name, ".psk"))
+ name_len = strlen(name);
+
+ if (l_str_has_suffix(name, ".psk")) {
  network_args.type = "psk";
- else if (l_str_has_suffix(name, ".8021x"))
+ name_len -= 4;
+ } else if (l_str_has_suffix(name, ".8021x")) {
  network_args.type = "8021x";
- else if (l_str_has_suffix(name, ".open"))
+ name_len -= 6;
+ } else if (l_str_has_suffix(name, ".open")) {
  network_args.type = "open";
- else
+ name_len -= 5;
+ } else
  network_args.type = NULL;
  - if (network_args.type) {
- char *dot = strrchr(name, '.');
-
- if (!dot)
- /* This shouldn't ever be the case */
- return NULL;
-
- *dot = '\0';
- }
-
- network_args.name = name;
+ args_name = l_strndup(name, name_len);
+ network_args.name = args_name;
    match = proxy_interface_find_all(known_network_interface_type.interface,
  known_network_match,
  &network_args);
  + l_free(args_name);
+
  if (!match) {
  display("No network with specified parameters was found\n");
  return NULL;

Regards

Marcel




^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-02-10  9:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-09 20:59 Bug with iwd-3.11 - const char being modified Rudi Heitbaum
2026-02-10  9:34 ` Marcel Holtmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox