diff options
author | Alexey Neyman <stilor@att.net> | 2018-05-15 23:41:28 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-15 23:41:28 (GMT) |
commit | d274ab06fe807b2a85223391de9aa484e9bbff08 (patch) | |
tree | 3de1fc2aadf622ce02226f254d908d39e25e3988 /packages/glibc/2.13 | |
parent | 844c83cac209ca7f99684dee14f1c3d64c6ee27e (diff) | |
parent | 37ac0e8474883ce9202ef4e08b7d9f9f66ea8a5d (diff) |
Merge pull request #967 from stilor/fix-building-older-glibc
Fix building older glibc
Diffstat (limited to 'packages/glibc/2.13')
-rw-r--r-- | packages/glibc/2.13/0044-strftime-multiple-stmts.patch | 73 | ||||
-rw-r--r-- | packages/glibc/2.13/0045-if_nametoindex-size-check.patch | 29 | ||||
-rw-r--r-- | packages/glibc/2.13/0046-utmp-nonstring.patch | 80 | ||||
-rw-r--r-- | packages/glibc/2.13/0047-getlogin_r-use-strnlen.patch | 47 | ||||
-rw-r--r-- | packages/glibc/2.13/0048-zic.c-use-memcpy.patch | 25 |
5 files changed, 254 insertions, 0 deletions
diff --git a/packages/glibc/2.13/0044-strftime-multiple-stmts.patch b/packages/glibc/2.13/0044-strftime-multiple-stmts.patch new file mode 100644 index 0000000..e544b33 --- /dev/null +++ b/packages/glibc/2.13/0044-strftime-multiple-stmts.patch @@ -0,0 +1,73 @@ +commit e4043b84c49e1cf9bcf1e8320233343ecc34f8eb +Author: Joseph Myers <joseph@codesourcery.com> +Date: Tue Jun 27 17:12:13 2017 +0000 + + Fix strftime build with GCC 8. + + Building with current GCC mainline fails with: + + strftime_l.c: In function '__strftime_internal': + strftime_l.c:719:4: error: macro expands to multiple statements [-Werror=multistatement-macros] + digits = d > width ? d : width; \ + ^ + strftime_l.c:1260:6: note: in expansion of macro 'DO_NUMBER' + DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); + ^~~~~~~~~ + strftime_l.c:1259:4: note: some parts of macro expansion are not guarded by this 'else' clause + else + ^~~~ + + In fact this particular instance is harmless; the code looks like: + + if (modifier == L_('O')) + goto bad_format; + else + DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); + + and because of the goto, it doesn't matter that part of the expansion + isn't under the "else" conditional. But it's also clearly bad style + to rely on that. This patch changes DO_NUMBER and DO_NUMBER_SPACEPAD + to use do { } while (0) to avoid such problems. + + Tested (full testsuite) for x86_64 (GCC 6), and with + build-many-glibcs.py with GCC mainline, in conjunction with my libgcc + patch <https://gcc.gnu.org/ml/gcc-patches/2017-06/msg02032.html>. + + * time/strftime_l.c (DO_NUMBER): Define using do { } while (0). + (DO_NUMBER_SPACEPAD): Likewise. + +--- + time/strftime_l.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +--- a/time/strftime_l.c ++++ b/time/strftime_l.c +@@ -742,12 +742,22 @@ + format_char = *f; + switch (format_char) + { +-#define DO_NUMBER(d, v) \ +- digits = d > width ? d : width; \ +- number_value = v; goto do_number +-#define DO_NUMBER_SPACEPAD(d, v) \ +- digits = d > width ? d : width; \ +- number_value = v; goto do_number_spacepad ++#define DO_NUMBER(d, v) \ ++ do \ ++ { \ ++ digits = d > width ? d : width; \ ++ number_value = v; \ ++ goto do_number; \ ++ } \ ++ while (0) ++#define DO_NUMBER_SPACEPAD(d, v) \ ++ do \ ++ { \ ++ digits = d > width ? d : width; \ ++ number_value = v; \ ++ goto do_number_spacepad; \ ++ } \ ++ while (0) + + case L_('%'): + if (modifier != 0) diff --git a/packages/glibc/2.13/0045-if_nametoindex-size-check.patch b/packages/glibc/2.13/0045-if_nametoindex-size-check.patch new file mode 100644 index 0000000..5803db5 --- /dev/null +++ b/packages/glibc/2.13/0045-if_nametoindex-size-check.patch @@ -0,0 +1,29 @@ +commit 2180fee114b778515b3f560e5ff1e795282e60b0 +Author: Steve Ellcey <sellcey@caviumnetworks.com> +Date: Wed Nov 15 08:58:48 2017 -0800 + + Check length of ifname before copying it into to ifreq structure. + + [BZ #22442] + * sysdeps/unix/sysv/linux/if_index.c (__if_nametoindex): + Check if ifname is too long. + +--- + sysdeps/unix/sysv/linux/if_index.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/sysdeps/unix/sysv/linux/if_index.c ++++ b/sysdeps/unix/sysv/linux/if_index.c +@@ -54,6 +54,12 @@ + if (fd < 0) + return 0; + ++ if (strlen (ifname) >= IFNAMSIZ) ++ { ++ __set_errno (ENODEV); ++ return 0; ++ } ++ + strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); + if (__ioctl (fd, SIOCGIFINDEX, &ifr) < 0) + { diff --git a/packages/glibc/2.13/0046-utmp-nonstring.patch b/packages/glibc/2.13/0046-utmp-nonstring.patch new file mode 100644 index 0000000..b789724 --- /dev/null +++ b/packages/glibc/2.13/0046-utmp-nonstring.patch @@ -0,0 +1,80 @@ +commit 7532837d7b03b3ca5b9a63d77a5bd81dd23f3d9c +Author: Martin Sebor <msebor@redhat.com> +Date: Wed Nov 15 17:39:59 2017 -0700 + + The -Wstringop-truncation option new in GCC 8 detects common misuses + of the strncat and strncpy function that may result in truncating + the copied string before the terminating NUL. To avoid false positive + warnings for correct code that intentionally creates sequences of + characters that aren't guaranteed to be NUL-terminated, arrays that + are intended to store such sequences should be decorated with a new + nonstring attribute. This change add this attribute to Glibc and + uses it to suppress such false positives. + + ChangeLog: + * misc/sys/cdefs.h (__attribute_nonstring__): New macro. + * sysdeps/gnu/bits/utmp.h (struct utmp): Use it. + * sysdeps/unix/sysv/linux/s390/bits/utmp.h (struct utmp): Same. + +--- + misc/sys/cdefs.h | 9 +++++++++ + sysdeps/gnu/bits/utmp.h | 9 ++++++--- + sysdeps/unix/sysv/linux/s390/bits/utmp.h | 9 ++++++--- + 3 files changed, 21 insertions(+), 6 deletions(-) + +--- a/misc/sys/cdefs.h ++++ b/misc/sys/cdefs.h +@@ -350,6 +350,15 @@ + # endif + #endif + ++#if __GNUC_PREREQ (8, 0) ++/* Describes a char array whose address can safely be passed as the first ++ argument to strncpy and strncat, as the char array is not necessarily ++ a NUL-terminated string. */ ++# define __attribute_nonstring__ __attribute__ ((__nonstring__)) ++#else ++# define __attribute_nonstring__ ++#endif ++ + #include <bits/wordsize.h> + + #if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH +--- a/sysdeps/gnu/bits/utmp.h ++++ b/sysdeps/gnu/bits/utmp.h +@@ -61,10 +61,13 @@ + { + short int ut_type; /* Type of login. */ + pid_t ut_pid; /* Process ID of login process. */ +- char ut_line[UT_LINESIZE]; /* Devicename. */ ++ char ut_line[UT_LINESIZE] ++ __attribute_nonstring__; /* Devicename. */ + char ut_id[4]; /* Inittab ID. */ +- char ut_user[UT_NAMESIZE]; /* Username. */ +- char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ ++ char ut_user[UT_NAMESIZE] ++ __attribute_nonstring__; /* Username. */ ++ char ut_host[UT_HOSTSIZE] ++ __attribute_nonstring__; /* Hostname for remote login. */ + struct exit_status ut_exit; /* Exit status of a process marked + as DEAD_PROCESS. */ + /* The ut_session and ut_tv fields must be the same size when compiled +--- a/sysdeps/unix/sysv/linux/s390/bits/utmp.h ++++ b/sysdeps/unix/sysv/linux/s390/bits/utmp.h +@@ -61,10 +61,13 @@ + { + short int ut_type; /* Type of login. */ + pid_t ut_pid; /* Process ID of login process. */ +- char ut_line[UT_LINESIZE]; /* Devicename. */ ++ char ut_line[UT_LINESIZE] ++ __attribute_nonstring__; /* Devicename. */ + char ut_id[4]; /* Inittab ID. */ +- char ut_user[UT_NAMESIZE]; /* Username. */ +- char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ ++ char ut_user[UT_NAMESIZE] ++ __attribute_nonstring__; /* Username. */ ++ char ut_host[UT_HOSTSIZE] ++ __attribute_nonstring__; /* Hostname for remote login. */ + struct exit_status ut_exit; /* Exit status of a process marked + as DEAD_PROCESS. */ + /* The ut_session and ut_tv fields must be the same size when compiled diff --git a/packages/glibc/2.13/0047-getlogin_r-use-strnlen.patch b/packages/glibc/2.13/0047-getlogin_r-use-strnlen.patch new file mode 100644 index 0000000..15a16bd --- /dev/null +++ b/packages/glibc/2.13/0047-getlogin_r-use-strnlen.patch @@ -0,0 +1,47 @@ +commit 4bae615022cb5a5da79ccda83cc6c9ba9f2d479c +Author: Joseph Myers <joseph@codesourcery.com> +Date: Wed Nov 22 18:44:23 2017 +0000 + + Avoid use of strlen in getlogin_r (bug 22447). + + Building glibc with current mainline GCC fails, among other reasons, + because of an error for use of strlen on the nonstring ut_user field. + This patch changes the problem code in getlogin_r to use __strnlen + instead. It also needs to set the trailing NUL byte of the result + explicitly, because of the case where ut_user does not have such a + trailing NUL byte (but the result should always have one). + + Tested for x86_64. Also tested that, in conjunction with + <https://sourceware.org/ml/libc-alpha/2017-11/msg00797.html>, it fixes + the build for arm with mainline GCC. + + [BZ #22447] + * sysdeps/unix/getlogin_r.c (__getlogin_r): Use __strnlen not + strlen to compute length of ut_user and set trailing NUL byte of + result explicitly. + +--- + sysdeps/unix/getlogin_r.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/sysdeps/unix/getlogin_r.c ++++ b/sysdeps/unix/getlogin_r.c +@@ -83,7 +83,7 @@ + + if (result == 0) + { +- size_t needed = strlen (ut->ut_user) + 1; ++ size_t needed = __strnlen (ut->ut_user, UT_NAMESIZE) + 1; + + if (needed > name_len) + { +@@ -92,7 +92,8 @@ + } + else + { +- memcpy (name, ut->ut_user, needed); ++ memcpy (name, ut->ut_user, needed - 1); ++ name[needed - 1] = 0; + result = 0; + } + } diff --git a/packages/glibc/2.13/0048-zic.c-use-memcpy.patch b/packages/glibc/2.13/0048-zic.c-use-memcpy.patch new file mode 100644 index 0000000..4c89446 --- /dev/null +++ b/packages/glibc/2.13/0048-zic.c-use-memcpy.patch @@ -0,0 +1,25 @@ +commit e69897bf202e18034cbef26f363bae64de70a196 +Author: Paul Eggert <eggert@cs.ucla.edu> +Date: Sun Nov 12 22:00:28 2017 -0800 + + timezone: pacify GCC -Wstringop-truncation + + Problem reported by Martin Sebor in: + https://sourceware.org/ml/libc-alpha/2017-11/msg00336.html + * timezone/zic.c (writezone): Use memcpy, not strncpy. + +--- + timezone/zic.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/timezone/zic.c ++++ b/timezone/zic.c +@@ -1648,7 +1648,7 @@ + #define DO(field) (void) fwrite((void *) tzh.field, \ + (size_t) sizeof tzh.field, (size_t) 1, fp) + tzh = tzh0; +- (void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic); ++ memcpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic); + tzh.tzh_version[0] = ZIC_VERSION; + convert(eitol(thistypecnt), tzh.tzh_ttisgmtcnt); + convert(eitol(thistypecnt), tzh.tzh_ttisstdcnt); |