[Bug,libc/29141] _FORTIFY_SOURCE=3 fail for gcc 12/glibc 2.35

Message ID bug-29141-10460-4N8dEqLzno@http.sourceware.org/bugzilla/
State Dropped
Series [Bug,libc/29141] _FORTIFY_SOURCE=3 fail for gcc 12/glibc 2.35 |

Commit Message

fche at redhat dot com May 12, 2022, 10:23 a.m. UTC

Siddhesh Poyarekar <siddhesh at sourceware dot org> changed:

           What    |Removed                     |Added
            Version|unspecified                 |2.36
            Product|elfutils                    |glibc
           Assignee|unassigned at sourceware dot org   |siddhesh at sourceware dot org
   Last reconfirmed|                            |2022-05-12
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |ASSIGNED
                 CC|                            |drepper.fsp at gmail dot com
          Component|general                     |libc

--- Comment #3 from Siddhesh Poyarekar <siddhesh at sourceware dot org> ---
OK my __glibc_fortify macro isn't explicit enough; it must check if __osz is
constant while checking for -1 so that the condition collapses correctly.

The following single line change in glibc fixes it and I was able to build
elfutils to completion on my Fedora rawhide box.

However, could you tell me what system you're doing this build on?  The glibc
should need this fix for it to stumble on this issue.  I had backported it to
the 2.35 branch a while back, but I haven't tracked which distros synced up
with this.  Fedora seems to have got it only yesterday.

commit c8ee1c85c07b3c9eaef46355cb1095300855e8fa
Author: Joan Bruguera <joanbrugueram@gmail.com>
Date:   Mon Apr 11 19:49:56 2022 +0200

    misc: Fix rare fortify crash on wchar funcs. [BZ 29030]

                                                       (__s), (__osz)))       \


diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index f1faf8292c..1c2b044a0d 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -164,7 +164,7 @@ 
 /* Length is known to be safe at compile time if the __L * __S <= __OBJSZ
    condition can be folded to a constant and if it is true, or unknown (-1) */
 #define __glibc_safe_or_unknown_len(__l, __s, __osz) \
-  ((__osz) == (__SIZE_TYPE__) -1                                             \
+  ((__builtin_constant_p (__osz) && (__osz) == (__SIZE_TYPE__) -1)           \
    || (__glibc_unsigned_or_positive (__l)                                    \
        && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l),