Kernel KVM virtualization development
 help / color / mirror / Atom feed
* [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix
@ 2026-05-04 13:43 Amit Machhiwal
  2026-05-08  5:20 ` Gautam Menghani
  2026-05-11 12:17 ` Vaibhav Jain
  0 siblings, 2 replies; 4+ messages in thread
From: Amit Machhiwal @ 2026-05-04 13:43 UTC (permalink / raw)
  To: Harsh Prateek Bora, qemu-ppc
  Cc: Vaibhav Jain, Amit Machhiwal, Chinmay Rath, Glenn Miles,
	Paolo Bonzini, Nicholas Piggin, qemu-devel, kvm

GCC 16 tightens diagnostics around const correctness and now correctly
rejects attempts to modify strings referenced through const-qualified
pointers. In kvm_ppc_register_host_cpu_type(), ppc_cpu_aliases[i].model
is defined as const char *, but the code was using strstr() on it and
then modifying the returned pointer in-place to strip
POWERPC_CPU_TYPE_SUFFIX.

This results in a write through a pointer derived from const data,
triggering a build failure with GCC 16:

  error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
        suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
               ^

Fix this by duplicating the model string into a mutable buffer using
g_strdup(), storing it in the alias table, and then performing the
suffix truncation on the mutable copy.

This preserves the existing behavior while avoiding modification of
const data and ensures compatibility with newer compilers.

No functional change intended.

Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
---
 target/ppc/kvm.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 25c28ad089c6..e71e5c0117da 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2654,10 +2654,12 @@ static int kvm_ppc_register_host_cpu_type(void)
     dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
         if (g_ascii_strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
+            char *model;
             char *suffix;
 
-            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
-            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
+            model = g_strdup(object_class_get_name(oc));
+            ppc_cpu_aliases[i].model = model;
+            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
             if (suffix) {
                 *suffix = 0;
             }

base-commit: ac0cc20ad2fe0b8df2e5d9458e90a095ac711ab1
-- 
2.50.1 (Apple Git-155)


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

* Re: [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix
  2026-05-04 13:43 [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix Amit Machhiwal
@ 2026-05-08  5:20 ` Gautam Menghani
  2026-05-08  5:57   ` Amit Machhiwal
  2026-05-11 12:17 ` Vaibhav Jain
  1 sibling, 1 reply; 4+ messages in thread
From: Gautam Menghani @ 2026-05-08  5:20 UTC (permalink / raw)
  To: Amit Machhiwal
  Cc: Harsh Prateek Bora, qemu-ppc, Vaibhav Jain, Chinmay Rath,
	Glenn Miles, Paolo Bonzini, Nicholas Piggin, qemu-devel, kvm

On Mon, May 04, 2026 at 07:13:44PM +0530, Amit Machhiwal wrote:
> GCC 16 tightens diagnostics around const correctness and now correctly
> rejects attempts to modify strings referenced through const-qualified
> pointers. In kvm_ppc_register_host_cpu_type(), ppc_cpu_aliases[i].model
> is defined as const char *, but the code was using strstr() on it and
> then modifying the returned pointer in-place to strip
> POWERPC_CPU_TYPE_SUFFIX.
> 
> This results in a write through a pointer derived from const data,
> triggering a build failure with GCC 16:
> 
>   error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
>         suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
>                ^
> 
> Fix this by duplicating the model string into a mutable buffer using
> g_strdup(), storing it in the alias table, and then performing the
> suffix truncation on the mutable copy.
> 
> This preserves the existing behavior while avoiding modification of
> const data and ensures compatibility with newer compilers.
> 
> No functional change intended.
> 
> Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
> ---
>  target/ppc/kvm.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 25c28ad089c6..e71e5c0117da 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -2654,10 +2654,12 @@ static int kvm_ppc_register_host_cpu_type(void)
>      dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
>      for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
>          if (g_ascii_strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
> +            char *model;
>              char *suffix;
>  
> -            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
> -            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
> +            model = g_strdup(object_class_get_name(oc));
> +            ppc_cpu_aliases[i].model = model;
> +            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
>              if (suffix) {
>                  *suffix = 0;
>              }
> 

A const char * variable is ideally supposed to point to an immutable
string. But even with this fix, the string that
"ppc_cpu_aliases[i].model" points to is being changed after assignment.

Would the below diff (untested) be a better fix?

diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 41bd03ec2a..a84e4b4636 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2654,13 +2654,14 @@ static int kvm_ppc_register_host_cpu_type(void)
     dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
         if (strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
-            char *suffix;
+            char *suffix, *model;
 
-            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
-            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
+            model = g_strdup(object_class_get_name(oc));
+            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
             if (suffix) {
                 *suffix = 0;
             }
+            ppc_cpu_aliases[i].model = model;
             break;
         }
     }

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

* Re: [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix
  2026-05-08  5:20 ` Gautam Menghani
@ 2026-05-08  5:57   ` Amit Machhiwal
  0 siblings, 0 replies; 4+ messages in thread
From: Amit Machhiwal @ 2026-05-08  5:57 UTC (permalink / raw)
  To: Gautam Menghani
  Cc: Amit Machhiwal, Harsh Prateek Bora, qemu-ppc, Vaibhav Jain,
	Chinmay Rath, Glenn Miles, Paolo Bonzini, Nicholas Piggin,
	qemu-devel, kvm

Hi Gautam,

Thanks for taking a look. Please find my response inline below:

On 2026/05/08 10:50 AM, Gautam Menghani wrote:
> On Mon, May 04, 2026 at 07:13:44PM +0530, Amit Machhiwal wrote:
> > GCC 16 tightens diagnostics around const correctness and now correctly
> > rejects attempts to modify strings referenced through const-qualified
> > pointers. In kvm_ppc_register_host_cpu_type(), ppc_cpu_aliases[i].model
> > is defined as const char *, but the code was using strstr() on it and
> > then modifying the returned pointer in-place to strip
> > POWERPC_CPU_TYPE_SUFFIX.
> > 
> > This results in a write through a pointer derived from const data,
> > triggering a build failure with GCC 16:
> > 
> >   error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
> >         suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
> >                ^
> > 
> > Fix this by duplicating the model string into a mutable buffer using
> > g_strdup(), storing it in the alias table, and then performing the
> > suffix truncation on the mutable copy.
> > 
> > This preserves the existing behavior while avoiding modification of
> > const data and ensures compatibility with newer compilers.
> > 
> > No functional change intended.
> > 
> > Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
> > ---
> >  target/ppc/kvm.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> > index 25c28ad089c6..e71e5c0117da 100644
> > --- a/target/ppc/kvm.c
> > +++ b/target/ppc/kvm.c
> > @@ -2654,10 +2654,12 @@ static int kvm_ppc_register_host_cpu_type(void)
> >      dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
> >      for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
> >          if (g_ascii_strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
> > +            char *model;
> >              char *suffix;
> >  
> > -            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
> > -            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
> > +            model = g_strdup(object_class_get_name(oc));
> > +            ppc_cpu_aliases[i].model = model;
> > +            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
> >              if (suffix) {
> >                  *suffix = 0;
> >              }
> > 
> 
> A const char * variable is ideally supposed to point to an immutable
> string. But even with this fix, the string that
> "ppc_cpu_aliases[i].model" points to is being changed after assignment.

Thanks, I get your point. The write in my version is to the mutable buffer
returned by g_strdup(), so it is not strictly a const write. I had originally
trimmed the duplicated buffer before assigning it to ppc_cpu_aliases[i].model,
but later reordered it to stay closer to the existing flow. Still, I agree with
the suggested cleaner ordering. I will update it in the next revision.

Thanks,
Amit

> Would the below diff (untested) be a better fix?
> 
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 41bd03ec2a..a84e4b4636 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -2654,13 +2654,14 @@ static int kvm_ppc_register_host_cpu_type(void)
>      dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
>      for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
>          if (strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
> -            char *suffix;
> +            char *suffix, *model;
>  
> -            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
> -            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
> +            model = g_strdup(object_class_get_name(oc));
> +            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
>              if (suffix) {
>                  *suffix = 0;
>              }
> +            ppc_cpu_aliases[i].model = model;
>              break;
>          }
>      }

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

* Re: [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix
  2026-05-04 13:43 [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix Amit Machhiwal
  2026-05-08  5:20 ` Gautam Menghani
@ 2026-05-11 12:17 ` Vaibhav Jain
  1 sibling, 0 replies; 4+ messages in thread
From: Vaibhav Jain @ 2026-05-11 12:17 UTC (permalink / raw)
  To: Amit Machhiwal, Harsh Prateek Bora, qemu-ppc
  Cc: Amit Machhiwal, Chinmay Rath, Glenn Miles, Paolo Bonzini,
	Nicholas Piggin, qemu-devel, kvm

Hi Amit,

Thanks for reporting this an proposing a fix. My review comments below:


Amit Machhiwal <amachhiw@linux.ibm.com> writes:

> GCC 16 tightens diagnostics around const correctness and now correctly
> rejects attempts to modify strings referenced through const-qualified
> pointers. In kvm_ppc_register_host_cpu_type(), ppc_cpu_aliases[i].model
> is defined as const char *, but the code was using strstr() on it and
> then modifying the returned pointer in-place to strip
> POWERPC_CPU_TYPE_SUFFIX.
>
> This results in a write through a pointer derived from const data,
> triggering a build failure with GCC 16:
>
>   error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
>         suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
>                ^
>
This looks more like an aliasing issue for the pointer returned by
g_strdup and it being used between const and non-const contexts.


> Fix this by duplicating the model string into a mutable buffer using
> g_strdup(), storing it in the alias table, and then performing the
> suffix truncation on the mutable copy.
>
> This preserves the existing behavior while avoiding modification of
> const data and ensures compatibility with newer compilers.

I think the better approach would be to avoid modifying the value
returned by g_strdup before its assigned to 'ppc_cpu_alias[i].model'
struct member.

>
> No functional change intended.
>
> Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
> ---
>  target/ppc/kvm.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 25c28ad089c6..e71e5c0117da 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -2654,10 +2654,12 @@ static int kvm_ppc_register_host_cpu_type(void)
>      dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc));
>      for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
>          if (g_ascii_strcasecmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) {
> +            char *model;
>              char *suffix;
>  
> -            ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc));
> -            suffix = strstr(ppc_cpu_aliases[i].model, POWERPC_CPU_TYPE_SUFFIX);
> +            model = g_strdup(object_class_get_name(oc));
while we are at it lets also handle ENOMEM error and trickle it back to arch_kvm_init()

> +            ppc_cpu_aliases[i].model = model;
> +            suffix = strstr(model, POWERPC_CPU_TYPE_SUFFIX);
>              if (suffix) {
>                  *suffix = 0;
>              }
>
> base-commit: ac0cc20ad2fe0b8df2e5d9458e90a095ac711ab1
> -- 
> 2.50.1 (Apple Git-155)
>
>

I have done the above proposed changes in a separate patch which i will
post in some time.

-- 
Cheers
~ Vaibhav

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

end of thread, other threads:[~2026-05-11 12:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-04 13:43 [PATCH] target/ppc/kvm: Fix const violation when trimming CPU alias suffix Amit Machhiwal
2026-05-08  5:20 ` Gautam Menghani
2026-05-08  5:57   ` Amit Machhiwal
2026-05-11 12:17 ` Vaibhav Jain

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