[PATCH] log: Fix result of strstr to 'const char *'

Cédric Le Goater posted 1 patch 4 days ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20251209150346.650473-1-clg@redhat.com
There is a newer version of this series
util/log.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] log: Fix result of strstr to 'const char *'
Posted by Cédric Le Goater 4 days ago
Assigning the result of strstr() to a 'char *' is unsafe since
strstr() returns a pointer into the original string which is a
read-only 'const char *' string. Newer compilers now complain when the
result of strstr() is not a 'const char *' :

../util/log.c:208:24: error: initialization discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
  208 |         char *pidstr = strstr(filename, "%");
      |                        ^~~~~~

Fix that.

Signed-off-by: Cédric Le Goater <clg@redhat.com>
---
 util/log.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/util/log.c b/util/log.c
index 41f78ce86b2522b8b7072c8b76d8e18603142db6..c44d66b5ce78338cf1b2cd26b7503cb94d4570cb 100644
--- a/util/log.c
+++ b/util/log.c
@@ -203,7 +203,7 @@ static ValidFilenameTemplateResult
 valid_filename_template(const char *filename, bool per_thread, Error **errp)
 {
     if (filename) {
-        char *pidstr = strstr(filename, "%");
+        const char *pidstr = strstr(filename, "%");
 
         if (pidstr) {
             /* We only accept one %d, no other format strings */
-- 
2.52.0


Re: [PATCH] log: Fix result of strstr to 'const char *'
Posted by Laurent Vivier 4 days ago
On 12/9/25 16:03, Cédric Le Goater wrote:
> Assigning the result of strstr() to a 'char *' is unsafe since
> strstr() returns a pointer into the original string which is a
> read-only 'const char *' string. Newer compilers now complain when the
> result of strstr() is not a 'const char *' :
> 
> ../util/log.c:208:24: error: initialization discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
>   208 |         char *pidstr = strstr(filename, "%");
>       |                        ^~~~~~
> 
> Fix that.
> 
> Signed-off-by: Cédric Le Goater <clg@redhat.com>
> ---
>  util/log.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/util/log.c b/util/log.c
> index 41f78ce86b2522b8b7072c8b76d8e18603142db6..c44d66b5ce78338cf1b2cd26b7503cb94d4570cb 100644
> --- a/util/log.c
> +++ b/util/log.c
> @@ -203,7 +203,7 @@ static ValidFilenameTemplateResult
>  valid_filename_template(const char *filename, bool per_thread, Error **errp)
>  {
>      if (filename) {
> -        char *pidstr = strstr(filename, "%");
> +        const char *pidstr = strstr(filename, "%");
>  
>          if (pidstr) {
>              /* We only accept one %d, no other format strings */

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Re: [PATCH] log: Fix result of strstr to 'const char *'
Posted by Peter Maydell 4 days ago
On Tue, 9 Dec 2025 at 15:04, Cédric Le Goater <clg@redhat.com> wrote:
>
> Assigning the result of strstr() to a 'char *' is unsafe since
> strstr() returns a pointer into the original string which is a
> read-only 'const char *' string. Newer compilers

Which ones? Or does this depend on how the libc headers have
marked up the strstr() prototype?

> now complain when the
> result of strstr() is not a 'const char *' :
>
> ../util/log.c:208:24: error: initialization discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
>   208 |         char *pidstr = strstr(filename, "%");
>       |                        ^~~~~~
>
> Fix that.
>
> Signed-off-by: Cédric Le Goater <clg@redhat.com>
> ---
>  util/log.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/util/log.c b/util/log.c
> index 41f78ce86b2522b8b7072c8b76d8e18603142db6..c44d66b5ce78338cf1b2cd26b7503cb94d4570cb 100644
> --- a/util/log.c
> +++ b/util/log.c
> @@ -203,7 +203,7 @@ static ValidFilenameTemplateResult
>  valid_filename_template(const char *filename, bool per_thread, Error **errp)
>  {
>      if (filename) {
> -        char *pidstr = strstr(filename, "%");
> +        const char *pidstr = strstr(filename, "%");
>
>          if (pidstr) {
>              /* We only accept one %d, no other format strings */
> --

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM
Re: [PATCH] log: Fix result of strstr to 'const char *'
Posted by Daniel P. Berrangé 4 days ago
On Tue, Dec 09, 2025 at 03:07:04PM +0000, Peter Maydell wrote:
> On Tue, 9 Dec 2025 at 15:04, Cédric Le Goater <clg@redhat.com> wrote:
> >
> > Assigning the result of strstr() to a 'char *' is unsafe since
> > strstr() returns a pointer into the original string which is a
> > read-only 'const char *' string. Newer compilers
> 
> Which ones? Or does this depend on how the libc headers have
> marked up the strstr() prototype?

I don't believe it is compiler related, rather this is an
ehancement in glibc 2.42.9000 / git master

  https://sourceware.org/git/?p=glibc.git;a=commit;h=cd748a63ab1a7ae846175c532a3daab341c62690

AFAICT it should work with any gcc we have

Although the commit talks about C23, we get it regardless as we have
_GNU_SOURCE defined.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Re: [PATCH] log: Fix result of strstr to 'const char *'
Posted by Cédric Le Goater 4 days ago
On 12/9/25 16:21, Daniel P. Berrangé wrote:
> On Tue, Dec 09, 2025 at 03:07:04PM +0000, Peter Maydell wrote:
>> On Tue, 9 Dec 2025 at 15:04, Cédric Le Goater <clg@redhat.com> wrote:
>>>
>>> Assigning the result of strstr() to a 'char *' is unsafe since
>>> strstr() returns a pointer into the original string which is a
>>> read-only 'const char *' string. Newer compilers
>>
>> Which ones? Or does this depend on how the libc headers have
>> marked up the strstr() prototype?
> 
> I don't believe it is compiler related, rather this is an
> ehancement in glibc 2.42.9000 / git master
> 
>    https://sourceware.org/git/?p=glibc.git;a=commit;h=cd748a63ab1a7ae846175c532a3daab341c62690
> 
> AFAICT it should work with any gcc we have
> 
> Although the commit talks about C23, we get it regardless as we have
> _GNU_SOURCE defined.

yes. glibc 2.42.9000 has :


+# if __GLIBC_USE (ISOC23) && defined __glibc_const_generic && !defined _LIBC
+#  define strstr(HAYSTACK, NEEDLE)			\
+  __glibc_const_generic (HAYSTACK, const char *,	\
+			 strstr (HAYSTACK, NEEDLE))
+# endif


C.


Re: [PATCH] log: Fix result of strstr to 'const char *'
Posted by Cédric Le Goater 4 days ago
On 12/9/25 16:07, Peter Maydell wrote:
> On Tue, 9 Dec 2025 at 15:04, Cédric Le Goater <clg@redhat.com> wrote:
>>
>> Assigning the result of strstr() to a 'char *' is unsafe since
>> strstr() returns a pointer into the original string which is a
>> read-only 'const char *' string. Newer compilers
> 
> Which ones? Or does this depend on how the libc headers have
> marked up the strstr() prototype?

Right. This is a new issue and I am not sure why.

It's showing on :

  gcc version 15.2.1 20251111 (Red Hat 15.2.1-4) (GCC)
  glibc-devel-2.42.9000-14.fc44.x86_64

and <string.h> doesn't seem to have change. Both strstr() prototypes
are available.

Let me check.

C.


> 
>> now complain when the
>> result of strstr() is not a 'const char *' :
>>
>> ../util/log.c:208:24: error: initialization discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
>>    208 |         char *pidstr = strstr(filename, "%");
>>        |                        ^~~~~~
>>
>> Fix that.
>>
>> Signed-off-by: Cédric Le Goater <clg@redhat.com>
>> ---
>>   util/log.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/util/log.c b/util/log.c
>> index 41f78ce86b2522b8b7072c8b76d8e18603142db6..c44d66b5ce78338cf1b2cd26b7503cb94d4570cb 100644
>> --- a/util/log.c
>> +++ b/util/log.c
>> @@ -203,7 +203,7 @@ static ValidFilenameTemplateResult
>>   valid_filename_template(const char *filename, bool per_thread, Error **errp)
>>   {
>>       if (filename) {
>> -        char *pidstr = strstr(filename, "%");
>> +        const char *pidstr = strstr(filename, "%");
>>
>>           if (pidstr) {
>>               /* We only accept one %d, no other format strings */
>> --
> 
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> 
> thanks
> -- PMM
>