forked from rpms/glibc
Resync with upstream master
Dropped upstreamed patches and adjusted others to apply to latest upstream.
This commit is contained in:
parent
1cb6060f99
commit
3cd9b9ce3d
@ -4,9 +4,9 @@
|
||||
diff -Nrup a/csu/elf-init.c b/csu/elf-init.c
|
||||
--- a/csu/elf-init.c 2012-06-05 07:42:49.000000000 -0600
|
||||
+++ b/csu/elf-init.c 2012-06-07 12:15:21.570319597 -0600
|
||||
@@ -63,6 +63,23 @@ extern void (*__init_array_end []) (int,
|
||||
extern void (*__fini_array_start []) (void) attribute_hidden;
|
||||
extern void (*__fini_array_end []) (void) attribute_hidden;
|
||||
@@ -62,6 +62,23 @@ extern void _fini (void);
|
||||
programs, this module will come from libc_nonshared.a and differs from
|
||||
the libc.a module in that it doesn't call the preinit array. */
|
||||
|
||||
+#if defined HAVE_VISIBILITY_ATTRIBUTE \
|
||||
+ && (defined SHARED || defined LIBC_NONSHARED)
|
||||
@ -26,5 +26,5 @@ diff -Nrup a/csu/elf-init.c b/csu/elf-init.c
|
||||
+hidden_undef (__fini_array_start)
|
||||
+hidden_undef (__fini_array_end)
|
||||
|
||||
/* These function symbols are provided for the .init/.fini section entry
|
||||
points automagically by the linker. */
|
||||
void
|
||||
__libc_csu_init (int argc, char **argv, char **envp)
|
||||
|
@ -1,147 +0,0 @@
|
||||
From c1b97d6d896b1f22fdf5d28471ef7859ec840a57 Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Schwab <schwab@redhat.com>
|
||||
Date: Wed, 1 Sep 2010 17:26:15 +0200
|
||||
Subject: [PATCH] Fix handling of collating symbols in regexps
|
||||
|
||||
[BZ #11561]
|
||||
* posix/regcomp.c (parse_bracket_exp): When looking up collating
|
||||
elements compare against the byte sequence of it, not its name.
|
||||
|
||||
---
|
||||
ChangeLog | 4 +++
|
||||
posix/regcomp.c | 72 ++++++++++++++++++++----------------------------------
|
||||
2 files changed, 31 insertions(+), 45 deletions(-)
|
||||
|
||||
--- a/posix/regcomp.c
|
||||
+++ b/posix/regcomp.c
|
||||
@@ -2772,40 +2772,29 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
|
||||
/* Local function for parse_bracket_exp used in _LIBC environement.
|
||||
Seek the collating symbol entry correspondings to NAME.
|
||||
- Return the index of the symbol in the SYMB_TABLE. */
|
||||
+ Return the index of the symbol in the SYMB_TABLE,
|
||||
+ or -1 if not found. */
|
||||
|
||||
auto inline int32_t
|
||||
__attribute ((always_inline))
|
||||
- seek_collating_symbol_entry (name, name_len)
|
||||
- const unsigned char *name;
|
||||
- size_t name_len;
|
||||
+ seek_collating_symbol_entry (const unsigned char *name, size_t name_len)
|
||||
{
|
||||
- int32_t hash = elem_hash ((const char *) name, name_len);
|
||||
- int32_t elem = hash % table_size;
|
||||
- if (symb_table[2 * elem] != 0)
|
||||
- {
|
||||
- int32_t second = hash % (table_size - 2) + 1;
|
||||
-
|
||||
- do
|
||||
- {
|
||||
- /* First compare the hashing value. */
|
||||
- if (symb_table[2 * elem] == hash
|
||||
- /* Compare the length of the name. */
|
||||
- && name_len == extra[symb_table[2 * elem + 1]]
|
||||
- /* Compare the name. */
|
||||
- && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
|
||||
- name_len) == 0)
|
||||
- {
|
||||
- /* Yep, this is the entry. */
|
||||
- break;
|
||||
- }
|
||||
+ int32_t elem;
|
||||
|
||||
- /* Next entry. */
|
||||
- elem += second;
|
||||
- }
|
||||
- while (symb_table[2 * elem] != 0);
|
||||
- }
|
||||
- return elem;
|
||||
+ for (elem = 0; elem < table_size; elem++)
|
||||
+ if (symb_table[2 * elem] != 0)
|
||||
+ {
|
||||
+ int32_t idx = symb_table[2 * elem + 1];
|
||||
+ /* Skip the name of collating element name. */
|
||||
+ idx += 1 + extra[idx];
|
||||
+ if (/* Compare the length of the name. */
|
||||
+ name_len == extra[idx]
|
||||
+ /* Compare the name. */
|
||||
+ && memcmp (name, &extra[idx + 1], name_len) == 0)
|
||||
+ /* Yep, this is the entry. */
|
||||
+ return elem;
|
||||
+ }
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
/* Local function for parse_bracket_exp used in _LIBC environment.
|
||||
@@ -2814,8 +2803,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
|
||||
auto inline unsigned int
|
||||
__attribute ((always_inline))
|
||||
- lookup_collation_sequence_value (br_elem)
|
||||
- bracket_elem_t *br_elem;
|
||||
+ lookup_collation_sequence_value (bracket_elem_t *br_elem)
|
||||
{
|
||||
if (br_elem->type == SB_CHAR)
|
||||
{
|
||||
@@ -2843,7 +2831,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
int32_t elem, idx;
|
||||
elem = seek_collating_symbol_entry (br_elem->opr.name,
|
||||
sym_name_len);
|
||||
- if (symb_table[2 * elem] != 0)
|
||||
+ if (elem != -1)
|
||||
{
|
||||
/* We found the entry. */
|
||||
idx = symb_table[2 * elem + 1];
|
||||
@@ -2861,7 +2849,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
/* Return the collation sequence value. */
|
||||
return *(unsigned int *) (extra + idx);
|
||||
}
|
||||
- else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
|
||||
+ else if (sym_name_len == 1)
|
||||
{
|
||||
/* No valid character. Match it as a single byte
|
||||
character. */
|
||||
@@ -2883,11 +2871,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
|
||||
auto inline reg_errcode_t
|
||||
__attribute ((always_inline))
|
||||
- build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
|
||||
- re_charset_t *mbcset;
|
||||
- int *range_alloc;
|
||||
- bitset_t sbcset;
|
||||
- bracket_elem_t *start_elem, *end_elem;
|
||||
+ build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc,
|
||||
+ bracket_elem_t *start_elem, bracket_elem_t *end_elem)
|
||||
{
|
||||
unsigned int ch;
|
||||
uint32_t start_collseq;
|
||||
@@ -2966,25 +2951,22 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||
|
||||
auto inline reg_errcode_t
|
||||
__attribute ((always_inline))
|
||||
- build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
|
||||
- re_charset_t *mbcset;
|
||||
- int *coll_sym_alloc;
|
||||
- bitset_t sbcset;
|
||||
- const unsigned char *name;
|
||||
+ build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
|
||||
+ int *coll_sym_alloc, const unsigned char *name)
|
||||
{
|
||||
int32_t elem, idx;
|
||||
size_t name_len = strlen ((const char *) name);
|
||||
if (nrules != 0)
|
||||
{
|
||||
elem = seek_collating_symbol_entry (name, name_len);
|
||||
- if (symb_table[2 * elem] != 0)
|
||||
+ if (elem != -1)
|
||||
{
|
||||
/* We found the entry. */
|
||||
idx = symb_table[2 * elem + 1];
|
||||
/* Skip the name of collating element name. */
|
||||
idx += 1 + extra[idx];
|
||||
}
|
||||
- else if (symb_table[2 * elem] == 0 && name_len == 1)
|
||||
+ else if (name_len == 1)
|
||||
{
|
||||
/* No valid character, treat it as a normal
|
||||
character. */
|
@ -5,7 +5,7 @@ diff -Nrup a/stdio-common/Makefile b/stdio-common/Makefile
|
||||
bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
|
||||
scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \
|
||||
bug-vfprintf-nargs tst-long-dbl-fphex tst-fphex-wide tst-sprintf3 \
|
||||
- bug25 tst-printf-round
|
||||
- bug25 tst-printf-round bug26
|
||||
+ bug25 tst-printf-round bug23-2 bug23-3
|
||||
|
||||
test-srcs = tst-unbputc tst-printf
|
||||
@ -45165,9 +45165,9 @@ diff -Nrup a/stdio-common/bug23-3.c b/stdio-common/bug23-3.c
|
||||
+#include "../test-skeleton.c"
|
||||
+
|
||||
diff -Nrup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
|
||||
--- a/stdio-common/vfprintf.c 2012-09-14 14:31:29.000000000 -0600
|
||||
+++ b/stdio-common/vfprintf.c 2012-09-14 14:41:27.891840141 -0600
|
||||
@@ -243,6 +243,12 @@ vfprintf (FILE *s, const CHAR_T *format,
|
||||
--- a/stdio-common/vfprintf.c 2013-06-04 16:40:55.000000000 +0530
|
||||
+++ b/stdio-common/vfprintf.c 2013-06-04 21:17:10.648403112 +0530
|
||||
@@ -263,6 +263,12 @@ vfprintf (FILE *s, const CHAR_T *format,
|
||||
/* For the argument descriptions, which may be allocated on the heap. */
|
||||
void *args_malloced = NULL;
|
||||
|
||||
@ -45180,7 +45180,7 @@ diff -Nrup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
|
||||
/* This table maps a character into a number representing a
|
||||
class. In each step there is a destination label for each
|
||||
class. */
|
||||
@@ -1685,8 +1691,8 @@ do_positional:
|
||||
@@ -1672,8 +1678,8 @@ do_positional:
|
||||
size_t nspecs = 0;
|
||||
/* A more or less arbitrary start value. */
|
||||
size_t nspecs_size = 32 * sizeof (struct printf_spec);
|
||||
@ -45190,7 +45190,7 @@ diff -Nrup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
|
||||
/* The number of arguments the format string requests. This will
|
||||
determine the size of the array needed to store the argument
|
||||
attributes. */
|
||||
@@ -1727,10 +1733,25 @@ do_positional:
|
||||
@@ -1715,10 +1721,25 @@ do_positional:
|
||||
{
|
||||
/* Extend the array of format specifiers. */
|
||||
struct printf_spec *old = specs;
|
||||
@ -45218,12 +45218,12 @@ diff -Nrup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
|
||||
}
|
||||
|
||||
/* Parse the format specifier. */
|
||||
@@ -2045,6 +2066,8 @@ do_positional:
|
||||
@@ -2039,6 +2060,8 @@ do_positional:
|
||||
}
|
||||
|
||||
all_done:
|
||||
+ if (specs_malloced)
|
||||
+ free (specs);
|
||||
if (__glibc_unlikely (args_malloced != NULL))
|
||||
free (args_malloced);
|
||||
free (workstart);
|
||||
/* Unlock the stream. */
|
||||
if (__glibc_unlikely (workstart != NULL))
|
||||
|
@ -1,61 +0,0 @@
|
||||
diff -Nrup a/nis/yp_xdr.c b/nis/yp_xdr.c
|
||||
--- a/nis/yp_xdr.c 2012-12-24 22:02:13.000000000 -0500
|
||||
+++ b/nis/yp_xdr.c 2013-04-17 15:26:50.168999686 -0400
|
||||
@@ -32,6 +32,14 @@
|
||||
#include <rpcsvc/yp.h>
|
||||
#include <rpcsvc/ypclnt.h>
|
||||
|
||||
+/* The specification suggests 1024 as a maximum length of all fields,
|
||||
+ but current linux systems usually don't use any limits. So, to stay
|
||||
+ as much compatible as possible with recent linux systems we choose
|
||||
+ limits large enough to avoid problems. */
|
||||
+
|
||||
+#define XDRMAXNAME 1024
|
||||
+#define XDRMAXRECORD 16 * 1024 * 1024
|
||||
+
|
||||
bool_t
|
||||
xdr_ypstat (XDR *xdrs, ypstat *objp)
|
||||
{
|
||||
@@ -49,21 +57,21 @@ libnsl_hidden_def (xdr_ypxfrstat)
|
||||
bool_t
|
||||
xdr_domainname (XDR *xdrs, domainname *objp)
|
||||
{
|
||||
- return xdr_string (xdrs, objp, YPMAXDOMAIN);
|
||||
+ return xdr_string (xdrs, objp, XDRMAXNAME);
|
||||
}
|
||||
libnsl_hidden_def (xdr_domainname)
|
||||
|
||||
bool_t
|
||||
xdr_mapname (XDR *xdrs, mapname *objp)
|
||||
{
|
||||
- return xdr_string (xdrs, objp, YPMAXMAP);
|
||||
+ return xdr_string (xdrs, objp, XDRMAXNAME);
|
||||
}
|
||||
libnsl_hidden_def (xdr_mapname)
|
||||
|
||||
bool_t
|
||||
xdr_peername (XDR *xdrs, peername *objp)
|
||||
{
|
||||
- return xdr_string (xdrs, objp, YPMAXPEER);
|
||||
+ return xdr_string (xdrs, objp, XDRMAXNAME);
|
||||
}
|
||||
libnsl_hidden_def (xdr_peername)
|
||||
|
||||
@@ -71,7 +79,7 @@ bool_t
|
||||
xdr_keydat (XDR *xdrs, keydat *objp)
|
||||
{
|
||||
return xdr_bytes (xdrs, (char **) &objp->keydat_val,
|
||||
- (u_int *) &objp->keydat_len, YPMAXRECORD);
|
||||
+ (u_int *) &objp->keydat_len, XDRMAXRECORD);
|
||||
}
|
||||
libnsl_hidden_def (xdr_keydat)
|
||||
|
||||
@@ -79,7 +87,7 @@ bool_t
|
||||
xdr_valdat (XDR *xdrs, valdat *objp)
|
||||
{
|
||||
return xdr_bytes (xdrs, (char **) &objp->valdat_val,
|
||||
- (u_int *) &objp->valdat_len, YPMAXRECORD);
|
||||
+ (u_int *) &objp->valdat_len, XDRMAXRECORD);
|
||||
}
|
||||
libnsl_hidden_def (xdr_valdat)
|
||||
|
@ -1,95 +0,0 @@
|
||||
#
|
||||
# Red Hat BZ:
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=905184
|
||||
#
|
||||
# Sourcware BZ:
|
||||
# http://sourceware.org/bugzilla/show_bug.cgi?id=15006
|
||||
#
|
||||
# Upstream submission:
|
||||
# http://www.sourceware.org/ml/libc-alpha/2013-02/msg00120.html
|
||||
#
|
||||
# ChangeLog
|
||||
#
|
||||
# 2013-02-07 Carlos O'Donell <carlos@redhat.com>
|
||||
#
|
||||
# * sysdeps/generic/ldconfig.h: Define FLAG_ARM_LIBSF.
|
||||
# * elf/cache.c (print_entry): Add FLAG_ARM_LIBSF support.
|
||||
#
|
||||
# ports/ChangeLog.arm
|
||||
#
|
||||
# 2013-02-07 Carlos O'Donell <carlos@redhat.com>
|
||||
#
|
||||
# * sysdeps/unix/sysv/linux/arm/dl-cache.h
|
||||
# [__ARM_PCS_VFP] (_dl_cache_check_flags): Allow plain FLAG_ELF_LIBC6.
|
||||
# [!__ARM_PCS_VFP] (_dl_cache_check_flags): Likewise.
|
||||
# * sysdeps/unix/sysv/linux/arm/readelflib.c (process_elf_file):
|
||||
# Set FLAG_ARM_LIBSF for soft-float ABI otherwise just FLAG_ELF_LIBC6.
|
||||
#
|
||||
diff --git a/elf/cache.c b/elf/cache.c
|
||||
index 9901952..699550b 100644
|
||||
--- a/elf/cache.c
|
||||
+++ b/elf/cache.c
|
||||
@@ -100,6 +100,10 @@ print_entry (const char *lib, int flag, unsigned int osversion,
|
||||
case FLAG_AARCH64_LIB64:
|
||||
fputs (",AArch64", stdout);
|
||||
break;
|
||||
+ /* Uses the ARM soft-float ABI. */
|
||||
+ case FLAG_ARM_LIBSF:
|
||||
+ fputs (",soft-float", stdout);
|
||||
+ break;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
diff --git a/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
|
||||
index acc4f28..504feca 100644
|
||||
--- a/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
|
||||
+++ b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
|
||||
@@ -18,12 +18,17 @@
|
||||
|
||||
#include <ldconfig.h>
|
||||
|
||||
+/* In order to support the transition from unmarked objects
|
||||
+ to marked objects we must treat unmarked objects as
|
||||
+ compatible with either FLAG_ARM_LIBHF or FLAG_ARM_LIBSF. */
|
||||
#ifdef __ARM_PCS_VFP
|
||||
# define _dl_cache_check_flags(flags) \
|
||||
- ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6))
|
||||
+ ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6) \
|
||||
+ || (flags) == FLAG_ELF_LIBC6)
|
||||
#else
|
||||
# define _dl_cache_check_flags(flags) \
|
||||
- ((flags) == FLAG_ELF_LIBC6)
|
||||
+ ((flags) == (FLAG_ARM_LIBSF | FLAG_ELF_LIBC6) \
|
||||
+ || (flags) == FLAG_ELF_LIBC6)
|
||||
#endif
|
||||
|
||||
#include_next <dl-cache.h>
|
||||
diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
|
||||
index 81e5ccb..3efb613 100644
|
||||
--- a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
|
||||
+++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
|
||||
@@ -46,6 +46,12 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
|
||||
if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD)
|
||||
*flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
|
||||
else if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_SOFT)
|
||||
+ *flag = FLAG_ARM_LIBSF|FLAG_ELF_LIBC6;
|
||||
+ else
|
||||
+ /* We must assume the unmarked objects are compatible
|
||||
+ with all ABI variants. Such objects may have been
|
||||
+ generated in a transitional period when the ABI
|
||||
+ tags were not added to all objects. */
|
||||
*flag = FLAG_ELF_LIBC6;
|
||||
}
|
||||
}
|
||||
diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h
|
||||
index 57a9a46..91190aa 100644
|
||||
--- a/sysdeps/generic/ldconfig.h
|
||||
+++ b/sysdeps/generic/ldconfig.h
|
||||
@@ -36,6 +36,7 @@
|
||||
#define FLAG_X8664_LIBX32 0x0800
|
||||
#define FLAG_ARM_LIBHF 0x0900
|
||||
#define FLAG_AARCH64_LIB64 0x0a00
|
||||
+#define FLAG_ARM_LIBSF 0x0b00
|
||||
|
||||
/* Name of auxiliary cache. */
|
||||
#define _PATH_LDCONFIG_AUX_CACHE "/var/cache/ldconfig/aux-cache"
|
@ -1,147 +0,0 @@
|
||||
#
|
||||
# Backported from upstream.
|
||||
#
|
||||
# 2013-02-12 Andreas Schwab <schwab@suse.de>
|
||||
#
|
||||
# [BZ #15078]
|
||||
# * posix/regexec.c (extend_buffers): Add parameter min_len.
|
||||
# (check_matching): Pass minimum needed length.
|
||||
# (clean_state_log_if_needed): Likewise.
|
||||
# (get_subexp): Likewise.
|
||||
# * posix/Makefile (tests): Add bug-regex34.
|
||||
# (bug-regex34-ENV): Define.
|
||||
# * posix/bug-regex34.c: New file.
|
||||
#
|
||||
--- glibc-2.17-c758a686/posix/Makefile 2012-12-24 22:02:13.000000000 -0500
|
||||
+++ glibc-2.17-c758a686/posix/Makefile 2013-03-17 15:30:13.121068666 -0400
|
||||
@@ -86,7 +86,7 @@
|
||||
tst-rfc3484-3 \
|
||||
tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \
|
||||
bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \
|
||||
- bug-getopt5 tst-getopt_long1
|
||||
+ bug-getopt5 tst-getopt_long1 bug-regex34
|
||||
xtests := bug-ga2
|
||||
ifeq (yes,$(build-shared))
|
||||
test-srcs := globtest
|
||||
@@ -195,6 +195,7 @@
|
||||
bug-regex30-ENV = LOCPATH=$(common-objpfx)localedata
|
||||
bug-regex32-ENV = LOCPATH=$(common-objpfx)localedata
|
||||
bug-regex33-ENV = LOCPATH=$(common-objpfx)localedata
|
||||
+bug-regex34-ENV = LOCPATH=$(common-objpfx)localedata
|
||||
tst-rxspencer-ARGS = --utf8 rxspencer/tests
|
||||
tst-rxspencer-ENV = LOCPATH=$(common-objpfx)localedata
|
||||
tst-pcre-ARGS = PCRE.tests
|
||||
diff --git a/posix/bug-regex34.c b/posix/bug-regex34.c
|
||||
new file mode 100644
|
||||
index 0000000..bb3b613
|
||||
--- /dev/null
|
||||
+++ b/posix/bug-regex34.c
|
||||
@@ -0,0 +1,46 @@
|
||||
+/* Test re_search with multi-byte characters in UTF-8.
|
||||
+ Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#define _GNU_SOURCE 1
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <locale.h>
|
||||
+#include <regex.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ struct re_pattern_buffer r;
|
||||
+ /* ကျွန်ုပ်x */
|
||||
+ const char *s = "\xe1\x80\x80\xe1\x80\xbb\xe1\x80\xbd\xe1\x80\x94\xe1\x80\xba\xe1\x80\xaf\xe1\x80\x95\xe1\x80\xbax";
|
||||
+
|
||||
+ if (setlocale (LC_ALL, "en_US.UTF-8") == NULL)
|
||||
+ {
|
||||
+ puts ("setlocale failed");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ memset (&r, 0, sizeof (r));
|
||||
+
|
||||
+ re_compile_pattern ("[^x]x", 5, &r);
|
||||
+ /* This was triggering a buffer overflow. */
|
||||
+ re_search (&r, s, strlen (s), 0, strlen (s), 0);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define TEST_FUNCTION do_test ()
|
||||
+#include "../test-skeleton.c"
|
||||
diff --git a/posix/regexec.c b/posix/regexec.c
|
||||
index 7f2de85..5ca2bf6 100644
|
||||
--- a/posix/regexec.c
|
||||
+++ b/posix/regexec.c
|
||||
@@ -197,7 +197,7 @@ static int group_nodes_into_DFAstates (const re_dfa_t *dfa,
|
||||
static int check_node_accept (const re_match_context_t *mctx,
|
||||
const re_token_t *node, int idx)
|
||||
internal_function;
|
||||
-static reg_errcode_t extend_buffers (re_match_context_t *mctx)
|
||||
+static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len)
|
||||
internal_function;
|
||||
|
||||
/* Entry point for POSIX code. */
|
||||
@@ -1160,7 +1160,7 @@ check_matching (re_match_context_t *mctx, int fl_longest_match,
|
||||
|| (BE (next_char_idx >= mctx->input.valid_len, 0)
|
||||
&& mctx->input.valid_len < mctx->input.len))
|
||||
{
|
||||
- err = extend_buffers (mctx);
|
||||
+ err = extend_buffers (mctx, next_char_idx + 1);
|
||||
if (BE (err != REG_NOERROR, 0))
|
||||
{
|
||||
assert (err == REG_ESPACE);
|
||||
@@ -1738,7 +1738,7 @@ clean_state_log_if_needed (re_match_context_t *mctx, int next_state_log_idx)
|
||||
&& mctx->input.valid_len < mctx->input.len))
|
||||
{
|
||||
reg_errcode_t err;
|
||||
- err = extend_buffers (mctx);
|
||||
+ err = extend_buffers (mctx, next_state_log_idx + 1);
|
||||
if (BE (err != REG_NOERROR, 0))
|
||||
return err;
|
||||
}
|
||||
@@ -2792,7 +2792,7 @@ get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx)
|
||||
if (bkref_str_off >= mctx->input.len)
|
||||
break;
|
||||
|
||||
- err = extend_buffers (mctx);
|
||||
+ err = extend_buffers (mctx, bkref_str_off + 1);
|
||||
if (BE (err != REG_NOERROR, 0))
|
||||
return err;
|
||||
|
||||
@@ -4102,7 +4102,7 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
|
||||
|
||||
static reg_errcode_t
|
||||
internal_function __attribute_warn_unused_result__
|
||||
-extend_buffers (re_match_context_t *mctx)
|
||||
+extend_buffers (re_match_context_t *mctx, int min_len)
|
||||
{
|
||||
reg_errcode_t ret;
|
||||
re_string_t *pstr = &mctx->input;
|
||||
@@ -4111,8 +4111,10 @@ extend_buffers (re_match_context_t *mctx)
|
||||
if (BE (INT_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
|
||||
return REG_ESPACE;
|
||||
|
||||
- /* Double the lengthes of the buffers. */
|
||||
- ret = re_string_realloc_buffers (pstr, MIN (pstr->len, pstr->bufs_len * 2));
|
||||
+ /* Double the lengthes of the buffers, but allocate at least MIN_LEN. */
|
||||
+ ret = re_string_realloc_buffers (pstr,
|
||||
+ MAX (min_len,
|
||||
+ MIN (pstr->len, pstr->bufs_len * 2)));
|
||||
if (BE (ret != REG_NOERROR, 0))
|
||||
return ret;
|
||||
|
@ -24,9 +24,9 @@
|
||||
diff -urN glibc-2.17-c758a686/string/Makefile tmp/glibc-2.17-c758a686/string/Makefile
|
||||
--- glibc-2.17-c758a686/string/Makefile 2013-02-27 18:07:34.618968703 -0500
|
||||
+++ tmp/glibc-2.17-c758a686/string/Makefile 2013-02-27 18:08:16.075796160 -0500
|
||||
@@ -78,6 +78,14 @@
|
||||
CFLAGS-bug-strstr1.c = -fno-builtin
|
||||
CFLAGS-bug-strcasestr1.c = -fno-builtin
|
||||
@@ -72,6 +72,14 @@ CFLAGS-stratcliff.c = -fno-builtin
|
||||
CFLAGS-test-ffs.c = -fno-builtin
|
||||
CFLAGS-tst-inlcall.c = -fno-builtin
|
||||
|
||||
+# Disable any optimization which might result in function calls to the very
|
||||
+# same functions we are trying to compile, thus creating an infinite loop.
|
||||
@ -58,3 +58,4 @@ diff -urN glibc-2.17-c758a686/elf/Makefile tmp/glibc-2.17-c758a686/elf/Makefile
|
||||
+
|
||||
test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
|
||||
generated += $(addsuffix .so,$(strip $(modules-names)))
|
||||
|
||||
|
@ -1,55 +0,0 @@
|
||||
commit 7a86be6e5f18ba99b25d75c555ce56fe1fcea325
|
||||
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||
Date: Thu Mar 28 11:45:47 2013 +0530
|
||||
|
||||
Don't add input group during initgroups_dyn in hesiod
|
||||
|
||||
Fixes BZ #15304.
|
||||
|
||||
The *initgroups_dyn functions are called with a group argument. This
|
||||
group gid is usually skipped while populating the grouplist since the
|
||||
caller adds that group id in advance.
|
||||
|
||||
The hesiod initgroups_dyn implementation however adds the group gid to
|
||||
the list if it does not already exist. While it works fine for the
|
||||
usual initgroups, it breaks nscd since it calls initgroups_dyn with -1
|
||||
as the gid (to have all groups included).
|
||||
|
||||
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
|
||||
index c2ae166..b11952f 100644
|
||||
--- a/hesiod/nss_hesiod/hesiod-grp.c
|
||||
+++ b/hesiod/nss_hesiod/hesiod-grp.c
|
||||
@@ -191,33 +191,6 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL;
|
||||
}
|
||||
|
||||
- if (!internal_gid_in_list (groups, group, *start))
|
||||
- {
|
||||
- if (__builtin_expect (*start == *size, 0))
|
||||
- {
|
||||
- /* Need a bigger buffer. */
|
||||
- gid_t *newgroups;
|
||||
- long int newsize;
|
||||
-
|
||||
- if (limit > 0 && *size == limit)
|
||||
- /* We reached the maximum. */
|
||||
- goto done;
|
||||
-
|
||||
- if (limit <= 0)
|
||||
- newsize = 2 * *size;
|
||||
- else
|
||||
- newsize = MIN (limit, 2 * *size);
|
||||
-
|
||||
- newgroups = realloc (groups, newsize * sizeof (*groups));
|
||||
- if (newgroups == NULL)
|
||||
- goto done;
|
||||
- *groupsp = groups = newgroups;
|
||||
- *size = newsize;
|
||||
- }
|
||||
-
|
||||
- groups[(*start)++] = group;
|
||||
- }
|
||||
-
|
||||
save_errno = errno;
|
||||
|
||||
p = *list;
|
@ -1,80 +0,0 @@
|
||||
2013-05-03 Carlos O'Donell <carlos at redhat.com>
|
||||
|
||||
* intl/dcigettext.c (DCIGETTEXT): Skip translating if _nl_find_msg returns -1.
|
||||
(_nl_find_msg): Return -1 if recursive call returned -1. If newmem is null
|
||||
return -1.
|
||||
* intl/loadmsgcat.c (_nl_load_domain): If _nl_find_msg returns -1 abort
|
||||
loading the domain.
|
||||
|
||||
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
|
||||
index 110307b..f4aa215 100644
|
||||
--- a/intl/dcigettext.c
|
||||
+++ b/intl/dcigettext.c
|
||||
@@ -638,6 +638,11 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
|
||||
retval = _nl_find_msg (domain->successor[cnt], binding,
|
||||
msgid1, 1, &retlen);
|
||||
|
||||
+ /* Resource problems are not fatal, instead we return no
|
||||
+ translation. */
|
||||
+ if (__builtin_expect (retval == (char *) -1, 0))
|
||||
+ goto no_translation;
|
||||
+
|
||||
if (retval != NULL)
|
||||
{
|
||||
domain = domain->successor[cnt];
|
||||
@@ -941,6 +946,11 @@ _nl_find_msg (domain_file, domainbinding, msgid, convert, lengthp)
|
||||
nullentry =
|
||||
_nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
|
||||
|
||||
+ /* Resource problems are fatal. If we continue onwards we will
|
||||
+ only attempt to calloc a new conv_tab and fail later. */
|
||||
+ if (__builtin_expect (nullentry == (char *) -1, 0))
|
||||
+ return (char *) -1;
|
||||
+
|
||||
if (nullentry != NULL)
|
||||
{
|
||||
const char *charsetstr;
|
||||
@@ -1170,10 +1180,14 @@ _nl_find_msg (domain_file, domainbinding, msgid, convert, lengthp)
|
||||
freemem_size = INITIAL_BLOCK_SIZE;
|
||||
newmem = (transmem_block_t *) malloc (freemem_size);
|
||||
# ifdef _LIBC
|
||||
- /* Add the block to the list of blocks we have to free
|
||||
- at some point. */
|
||||
- newmem->next = transmem_list;
|
||||
- transmem_list = newmem;
|
||||
+ if (newmem != NULL)
|
||||
+ {
|
||||
+ /* Add the block to the list of blocks we have to free
|
||||
+ at some point. */
|
||||
+ newmem->next = transmem_list;
|
||||
+ transmem_list = newmem;
|
||||
+ }
|
||||
+ /* Fall through and return -1. */
|
||||
# endif
|
||||
}
|
||||
if (__builtin_expect (newmem == NULL, 0))
|
||||
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
|
||||
index e4b7b38..ac90ed1 100644
|
||||
--- a/intl/loadmsgcat.c
|
||||
+++ b/intl/loadmsgcat.c
|
||||
@@ -1237,7 +1237,7 @@ _nl_load_domain (domain_file, domainbinding)
|
||||
default:
|
||||
/* This is an invalid revision. */
|
||||
invalid:
|
||||
- /* This is an invalid .mo file. */
|
||||
+ /* This is an invalid .mo file or we ran out of resources. */
|
||||
free (domain->malloced);
|
||||
#ifdef HAVE_MMAP
|
||||
if (use_mmap)
|
||||
@@ -1257,6 +1257,11 @@ _nl_load_domain (domain_file, domainbinding)
|
||||
|
||||
/* Get the header entry and look for a plural specification. */
|
||||
nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
|
||||
+ if (__builtin_expect (nullentry == (char *) -1, 0))
|
||||
+ {
|
||||
+ __libc_rwlock_fini (domain->conversions_lock);
|
||||
+ goto invalid;
|
||||
+ }
|
||||
EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
|
||||
|
||||
out:
|
@ -1,560 +0,0 @@
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index c01ca9e..6f40414 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -145,7 +145,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-audit1 tst-audit2 tst-audit8 \
|
||||
tst-stackguard1 tst-addr1 tst-thrlock \
|
||||
tst-unique1 tst-unique2 tst-unique3 tst-unique4 \
|
||||
- tst-initorder tst-initorder2 tst-relsort1
|
||||
+ tst-initorder tst-initorder2 tst-relsort1 tst-null-argv
|
||||
# reldep9
|
||||
test-srcs = tst-pathopt
|
||||
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
|
||||
@@ -208,7 +208,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
tst-initorder2a tst-initorder2b tst-initorder2c \
|
||||
tst-initorder2d \
|
||||
tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \
|
||||
- tst-array5dep
|
||||
+ tst-array5dep tst-null-argv-lib
|
||||
ifeq (yesyes,$(have-fpie)$(build-shared))
|
||||
modules-names += tst-piemod1
|
||||
tests += tst-pie1
|
||||
@@ -494,7 +494,9 @@ $(objpfx)tst-initorderb2.so: $(objpfx)tst-initorderb1.so $(objpfx)tst-initordera
|
||||
$(objpfx)tst-initordera3.so: $(objpfx)tst-initorderb2.so $(objpfx)tst-initorderb1.so
|
||||
$(objpfx)tst-initordera4.so: $(objpfx)tst-initordera3.so
|
||||
$(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so $(objpfx)tst-initorderb2.so
|
||||
+$(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so
|
||||
|
||||
+tst-null-argv-ENV = LD_DEBUG=all LD_DEBUG_OUTPUT=$(objpfx)tst-null-argv.debug.out
|
||||
LDFLAGS-nodel2mod3.so = $(no-as-needed)
|
||||
LDFLAGS-reldepmod5.so = $(no-as-needed)
|
||||
LDFLAGS-reldep6mod1.so = $(no-as-needed)
|
||||
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
|
||||
index d63086d..11e3cd8 100644
|
||||
--- a/elf/dl-conflict.c
|
||||
+++ b/elf/dl-conflict.c
|
||||
@@ -33,8 +33,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
|
||||
{
|
||||
#if ! ELF_MACHINE_NO_RELA
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||
- _dl_debug_printf ("\nconflict processing: %s\n",
|
||||
- l->l_name[0] ? l->l_name : rtld_progname);
|
||||
+ _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name));
|
||||
|
||||
{
|
||||
/* Do the conflict relocation of the object and library GOT and other
|
||||
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
|
||||
index cd1c236..1c36f50 100644
|
||||
--- a/elf/dl-deps.c
|
||||
+++ b/elf/dl-deps.c
|
||||
@@ -310,8 +310,7 @@ _dl_map_object_deps (struct link_map *map,
|
||||
_dl_debug_printf ("load auxiliary object=%s"
|
||||
" requested by file=%s\n",
|
||||
name,
|
||||
- l->l_name[0]
|
||||
- ? l->l_name : rtld_progname);
|
||||
+ DSO_FILENAME (l->l_name));
|
||||
|
||||
/* We must be prepared that the addressed shared
|
||||
object is not available. */
|
||||
@@ -337,8 +336,7 @@ _dl_map_object_deps (struct link_map *map,
|
||||
_dl_debug_printf ("load filtered object=%s"
|
||||
" requested by file=%s\n",
|
||||
name,
|
||||
- l->l_name[0]
|
||||
- ? l->l_name : rtld_progname);
|
||||
+ DSO_FILENAME (l->l_name));
|
||||
|
||||
/* For filter objects the dependency must be available. */
|
||||
bool malloced;
|
||||
diff --git a/elf/dl-error.c b/elf/dl-error.c
|
||||
index 7987845..8257c17 100644
|
||||
--- a/elf/dl-error.c
|
||||
+++ b/elf/dl-error.c
|
||||
@@ -119,7 +119,7 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
|
||||
/* Lossage while resolving the program's own symbols is always fatal. */
|
||||
char buffer[1024];
|
||||
_dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
+ RTLD_PROGNAME,
|
||||
occation ?: N_("error while loading shared libraries"),
|
||||
objname, *objname ? ": " : "",
|
||||
errstring, errcode ? ": " : "",
|
||||
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
|
||||
index c5d1674..6b245f0 100644
|
||||
--- a/elf/dl-fini.c
|
||||
+++ b/elf/dl-fini.c
|
||||
@@ -237,7 +237,7 @@ _dl_fini (void)
|
||||
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||
& DL_DEBUG_IMPCALLS, 0))
|
||||
_dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
|
||||
- l->l_name[0] ? l->l_name : rtld_progname,
|
||||
+ DSO_FILENAME (l->l_name),
|
||||
ns);
|
||||
|
||||
/* First see whether an array is given. */
|
||||
diff --git a/elf/dl-init.c b/elf/dl-init.c
|
||||
index fe4d2a0..a657eb6 100644
|
||||
--- a/elf/dl-init.c
|
||||
+++ b/elf/dl-init.c
|
||||
@@ -54,7 +54,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
|
||||
/* Print a debug message if wanted. */
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||
_dl_debug_printf ("\ncalling init: %s\n\n",
|
||||
- l->l_name[0] ? l->l_name : rtld_progname);
|
||||
+ DSO_FILENAME (l->l_name));
|
||||
|
||||
/* Now run the local constructors. There are two forms of them:
|
||||
- the one named by DT_INIT
|
||||
@@ -110,8 +110,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
|
||||
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||
_dl_debug_printf ("\ncalling preinit: %s\n\n",
|
||||
- main_map->l_name[0]
|
||||
- ? main_map->l_name : rtld_progname);
|
||||
+ DSO_FILENAME (main_map->l_name));
|
||||
|
||||
addrs = (ElfW(Addr) *) (preinit_array->d_un.d_ptr + main_map->l_addr);
|
||||
for (cnt = 0; cnt < i; ++cnt)
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index dd182c9..757b6ec 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1651,7 +1651,7 @@ print_search_path (struct r_search_path_elem **list,
|
||||
|
||||
if (name != NULL)
|
||||
_dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
|
||||
- name[0] ? name : rtld_progname);
|
||||
+ DSO_FILENAME (name));
|
||||
else
|
||||
_dl_debug_printf_c ("\t\t(%s)\n", what);
|
||||
}
|
||||
@@ -2124,8 +2124,7 @@ _dl_map_object (struct link_map *loader, const char *name,
|
||||
_dl_debug_printf ((mode & __RTLD_CALLMAP) == 0
|
||||
? "\nfile=%s [%lu]; needed by %s [%lu]\n"
|
||||
: "\nfile=%s [%lu]; dynamically loaded by %s [%lu]\n",
|
||||
- name, nsid, loader->l_name[0]
|
||||
- ? loader->l_name : rtld_progname, loader->l_ns);
|
||||
+ name, nsid, DSO_FILENAME (loader->l_name), loader->l_ns);
|
||||
|
||||
#ifdef SHARED
|
||||
/* Give the auditing libraries a chance to change the name before we
|
||||
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
|
||||
index 68f8dac..39f463e 100644
|
||||
--- a/elf/dl-lookup.c
|
||||
+++ b/elf/dl-lookup.c
|
||||
@@ -112,8 +112,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
|
||||
/* Print some debugging info if wanted. */
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
|
||||
_dl_debug_printf ("symbol=%s; lookup in file=%s [%lu]\n",
|
||||
- undef_name,
|
||||
- map->l_name[0] ? map->l_name : rtld_progname,
|
||||
+ undef_name, DSO_FILENAME (map->l_name),
|
||||
map->l_ns);
|
||||
|
||||
/* If the hash table is empty there is nothing to do here. */
|
||||
@@ -667,10 +666,9 @@ add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||
_dl_debug_printf ("\
|
||||
\nfile=%s [%lu]; needed by %s [%lu] (relocation dependency)\n\n",
|
||||
- map->l_name[0] ? map->l_name : rtld_progname,
|
||||
+ DSO_FILENAME (map->l_name),
|
||||
map->l_ns,
|
||||
- undef_map->l_name[0]
|
||||
- ? undef_map->l_name : rtld_progname,
|
||||
+ DSO_FILENAME (undef_map->l_name),
|
||||
undef_map->l_ns);
|
||||
}
|
||||
else
|
||||
@@ -751,9 +749,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
|
||||
const char *reference_name = undef_map ? undef_map->l_name : NULL;
|
||||
|
||||
/* XXX We cannot translate the message. */
|
||||
- _dl_signal_cerror (0, (reference_name[0]
|
||||
- ? reference_name
|
||||
- : (rtld_progname ?: "<main program>")),
|
||||
+ _dl_signal_cerror (0, DSO_FILENAME (reference_name),
|
||||
N_("relocation error"),
|
||||
make_string ("symbol ", undef_name, ", version ",
|
||||
version->name,
|
||||
@@ -780,9 +776,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
|
||||
? version->name : "");
|
||||
|
||||
/* XXX We cannot translate the message. */
|
||||
- _dl_signal_cerror (0, (reference_name[0]
|
||||
- ? reference_name
|
||||
- : (rtld_progname ?: "<main program>")),
|
||||
+ _dl_signal_cerror (0, DSO_FILENAME (reference_name),
|
||||
N_("symbol lookup error"),
|
||||
make_string (undefined_msg, undef_name,
|
||||
versionstr, versionname));
|
||||
@@ -912,11 +906,9 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
||||
if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS)
|
||||
{
|
||||
_dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
|
||||
- (reference_name[0]
|
||||
- ? reference_name
|
||||
- : (rtld_progname ?: "<main program>")),
|
||||
+ DSO_FILENAME (reference_name),
|
||||
undef_map->l_ns,
|
||||
- value->m->l_name[0] ? value->m->l_name : rtld_progname,
|
||||
+ DSO_FILENAME (value->m->l_name),
|
||||
value->m->l_ns,
|
||||
protected ? "protected" : "normal", undef_name);
|
||||
if (version)
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index 92fae7f..0f054bf 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -733,7 +733,7 @@ void
|
||||
_dl_show_scope (struct link_map *l, int from)
|
||||
{
|
||||
_dl_debug_printf ("object=%s [%lu]\n",
|
||||
- *l->l_name ? l->l_name : rtld_progname, l->l_ns);
|
||||
+ DSO_FILENAME (l->l_name), l->l_ns);
|
||||
if (l->l_scope != NULL)
|
||||
for (int scope_cnt = from; l->l_scope[scope_cnt] != NULL; ++scope_cnt)
|
||||
{
|
||||
@@ -744,7 +744,7 @@ _dl_show_scope (struct link_map *l, int from)
|
||||
_dl_debug_printf_c (" %s",
|
||||
l->l_scope[scope_cnt]->r_list[cnt]->l_name);
|
||||
else
|
||||
- _dl_debug_printf_c (" %s", rtld_progname);
|
||||
+ _dl_debug_printf_c (" %s", RTLD_PROGNAME);
|
||||
|
||||
_dl_debug_printf_c ("\n");
|
||||
}
|
||||
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
|
||||
index 73d98f8..5c54310 100644
|
||||
--- a/elf/dl-reloc.c
|
||||
+++ b/elf/dl-reloc.c
|
||||
@@ -185,8 +185,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||
_dl_debug_printf ("\nrelocation processing: %s%s\n",
|
||||
- l->l_name[0] ? l->l_name : rtld_progname,
|
||||
- lazy ? " (lazy)" : "");
|
||||
+ DSO_FILENAME (l->l_name), lazy ? " (lazy)" : "");
|
||||
|
||||
/* DT_TEXTREL is now in level 2 and might phase out at some time.
|
||||
But we rewrite the DT_FLAGS entry to a DT_TEXTREL entry to make
|
||||
@@ -276,7 +275,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
errstring = N_("%s: no PLTREL found in object %s\n");
|
||||
fatal:
|
||||
_dl_fatal_printf (errstring,
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
+ RTLD_PROGNAME,
|
||||
l->l_name);
|
||||
}
|
||||
|
||||
diff --git a/elf/dl-version.c b/elf/dl-version.c
|
||||
index c02baa0..62be4ae 100644
|
||||
--- a/elf/dl-version.c
|
||||
+++ b/elf/dl-version.c
|
||||
@@ -85,7 +85,7 @@ match_symbol (const char *name, Lmid_t ns, ElfW(Word) hash, const char *string,
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS, 0))
|
||||
_dl_debug_printf ("\
|
||||
checking for version `%s' in file %s [%lu] required by file %s [%lu]\n",
|
||||
- string, map->l_name[0] ? map->l_name : rtld_progname,
|
||||
+ string, DSO_FILENAME (map->l_name),
|
||||
map->l_ns, name, ns);
|
||||
|
||||
if (__builtin_expect (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL, 0))
|
||||
@@ -162,7 +162,7 @@ no version information available (required by ", name, ")");
|
||||
name, ")");
|
||||
result = 1;
|
||||
call_cerror:
|
||||
- _dl_signal_cerror (0, map->l_name[0] ? map->l_name : rtld_progname,
|
||||
+ _dl_signal_cerror (0, DSO_FILENAME (map->l_name),
|
||||
N_("version lookup error"), errstring);
|
||||
return result;
|
||||
}
|
||||
@@ -210,7 +210,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
||||
&buf[sizeof (buf) - 1], 10, 0),
|
||||
" of Verneed record\n");
|
||||
call_error:
|
||||
- _dl_signal_error (errval, *map->l_name ? map->l_name : rtld_progname,
|
||||
+ _dl_signal_error (errval, DSO_FILENAME (map->l_name),
|
||||
NULL, errstring);
|
||||
}
|
||||
|
||||
@@ -234,8 +234,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
||||
while (1)
|
||||
{
|
||||
/* Match the symbol. */
|
||||
- result |= match_symbol ((*map->l_name
|
||||
- ? map->l_name : rtld_progname),
|
||||
+ result |= match_symbol (DSO_FILENAME (map->l_name),
|
||||
map->l_ns, aux->vna_hash,
|
||||
strtab + aux->vna_name,
|
||||
needed->l_real, verbose,
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 23238ad..91da88c 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1840,10 +1840,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
||||
if (_dl_name_match_p (GLRO(dl_trace_prelink), l))
|
||||
GLRO(dl_trace_prelink_map) = l;
|
||||
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
|
||||
- l->l_libname->name[0] ? l->l_libname->name
|
||||
- : rtld_progname ?: "<main program>",
|
||||
- l->l_name[0] ? l->l_name
|
||||
- : rtld_progname ?: "<main program>",
|
||||
+ DSO_FILENAME (l->l_libname->name),
|
||||
+ DSO_FILENAME (l->l_name),
|
||||
(int) sizeof l->l_map_start * 2,
|
||||
(size_t) l->l_map_start,
|
||||
(int) sizeof l->l_addr * 2,
|
||||
@@ -2000,8 +1998,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
||||
first = 0;
|
||||
}
|
||||
|
||||
- _dl_printf ("\t%s:\n",
|
||||
- map->l_name[0] ? map->l_name : rtld_progname);
|
||||
+ _dl_printf ("\t%s:\n", DSO_FILENAME (map->l_name));
|
||||
|
||||
while (1)
|
||||
{
|
||||
@@ -2324,7 +2321,7 @@ print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
|
||||
const char *errstring)
|
||||
{
|
||||
if (objname[0] == '\0')
|
||||
- objname = rtld_progname ?: "<main program>";
|
||||
+ objname = RTLD_PROGNAME;
|
||||
_dl_error_printf ("%s (%s)\n", errstring, objname);
|
||||
}
|
||||
|
||||
@@ -2334,7 +2331,7 @@ static void
|
||||
print_missing_version (int errcode __attribute__ ((unused)),
|
||||
const char *objname, const char *errstring)
|
||||
{
|
||||
- _dl_error_printf ("%s: %s: %s\n", rtld_progname ?: "<program name unknown>",
|
||||
+ _dl_error_printf ("%s: %s: %s\n", RTLD_PROGNAME,
|
||||
objname, errstring);
|
||||
}
|
||||
|
||||
diff --git a/elf/tst-null-argv-lib.c b/elf/tst-null-argv-lib.c
|
||||
new file mode 100644
|
||||
index 0000000..e754299
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-null-argv-lib.c
|
||||
@@ -0,0 +1,24 @@
|
||||
+/* Verify that program does not crash when LD_DEBUG is set and the program name
|
||||
+ is not available. This is the library.
|
||||
+ Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+void
|
||||
+foo (void)
|
||||
+{
|
||||
+ return;
|
||||
+}
|
||||
diff --git a/elf/tst-null-argv.c b/elf/tst-null-argv.c
|
||||
new file mode 100644
|
||||
index 0000000..dc242e4
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-null-argv.c
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* Verify that program does not crash when LD_DEBUG is set and the program name
|
||||
+ is not available.
|
||||
+ Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+extern void foo (void);
|
||||
+
|
||||
+int
|
||||
+do_test (int argc, char **argv)
|
||||
+{
|
||||
+ argv[0] = argv[1];
|
||||
+ argc--;
|
||||
+
|
||||
+ /* This should result in a symbol lookup, causing a volley of debug output
|
||||
+ when LD_DEBUG=symbols. */
|
||||
+ foo ();
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <test-skeleton.c>
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index c7a20ba..82ab578 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -127,6 +127,11 @@ typedef struct link_map *lookup_t;
|
||||
| ((PROT_WRITE | PROT_EXEC) << (PF_W | PF_X) * 4) \
|
||||
| ((PROT_READ | PROT_WRITE | PROT_EXEC) << ((PF_R | PF_W | PF_X) * 4)))
|
||||
|
||||
+/* The filename itself, or the main program name, if available. */
|
||||
+#define DSO_FILENAME(name) ((name)[0] ? (name) \
|
||||
+ : (rtld_progname ?: "<main program>"))
|
||||
+
|
||||
+#define RTLD_PROGNAME (rtld_progname ?: "<program name unknown>")
|
||||
|
||||
/* For the version handling we need an array with only names and their
|
||||
hash values. */
|
||||
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
|
||||
index 0b4c467..b6fc805 100644
|
||||
--- a/sysdeps/i386/dl-machine.h
|
||||
+++ b/sysdeps/i386/dl-machine.h
|
||||
@@ -464,8 +464,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
@@ -610,8 +609,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.c b/sysdeps/powerpc/powerpc32/dl-machine.c
|
||||
index bd42fdf..c75c173 100644
|
||||
--- a/sysdeps/powerpc/powerpc32/dl-machine.c
|
||||
+++ b/sysdeps/powerpc/powerpc32/dl-machine.c
|
||||
@@ -510,8 +510,7 @@ __process_machine_rela (struct link_map *map,
|
||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
|
||||
refsym->st_size));
|
||||
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
index 14ade21..059fdaf 100644
|
||||
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
@@ -734,8 +734,7 @@ elf_machine_rela (struct link_map *map,
|
||||
_dl_error_printf ("%s: Symbol `%s' has different size" \
|
||||
" in shared object," \
|
||||
" consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (char *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
|
||||
index 544f843..aa8f1a5 100644
|
||||
--- a/sysdeps/s390/s390-32/dl-machine.h
|
||||
+++ b/sysdeps/s390/s390-32/dl-machine.h
|
||||
@@ -383,8 +383,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
strtab = (const char *) D_PTR(map,l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
|
||||
index 0504eb6..32f7a2c 100644
|
||||
--- a/sysdeps/s390/s390-64/dl-machine.h
|
||||
+++ b/sysdeps/s390/s390-64/dl-machine.h
|
||||
@@ -361,8 +361,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
||||
strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h
|
||||
index 25cd52a..da7b9c1 100644
|
||||
--- a/sysdeps/sh/dl-machine.h
|
||||
+++ b/sysdeps/sh/dl-machine.h
|
||||
@@ -336,8 +336,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
|
||||
index 71e120f..30f9246 100644
|
||||
--- a/sysdeps/sparc/sparc32/dl-machine.h
|
||||
+++ b/sysdeps/sparc/sparc32/dl-machine.h
|
||||
@@ -411,8 +411,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
|
||||
index d6d20c7..3bce5d1 100644
|
||||
--- a/sysdeps/sparc/sparc64/dl-machine.h
|
||||
+++ b/sysdeps/sparc/sparc64/dl-machine.h
|
||||
@@ -436,8 +436,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
|
||||
index 4768c69..116fed1 100644
|
||||
--- a/sysdeps/x86_64/dl-machine.h
|
||||
+++ b/sysdeps/x86_64/dl-machine.h
|
||||
@@ -430,9 +430,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
# endif
|
||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
|
||||
- _dl_error_printf (fmt,
|
||||
- rtld_progname ?: "<program name unknown>",
|
||||
- strtab + refsym->st_name);
|
||||
+ _dl_error_printf (fmt, RTLD_PROGNAME, strtab + refsym->st_name);
|
||||
}
|
||||
break;
|
||||
# ifndef RESOLVE_CONFLICT_FIND_MAP
|
@ -1,41 +1,42 @@
|
||||
diff -rup c/sysdeps/ieee754/dbl-64/slowexp.c d/sysdeps/ieee754/dbl-64/slowexp.c
|
||||
--- c/sysdeps/ieee754/dbl-64/slowexp.c 2012-05-20 19:47:38.000000000 -0600
|
||||
+++ d/sysdeps/ieee754/dbl-64/slowexp.c 2012-05-21 10:02:51.693957300 -0600
|
||||
@@ -30,6 +30,8 @@
|
||||
#include "mpa.h"
|
||||
--- c/sysdeps/ieee754/dbl-64/slowexp.c 2013-06-04 16:40:55.000000000 +0530
|
||||
+++ d/sysdeps/ieee754/dbl-64/slowexp.c 2013-06-04 21:02:49.377439607 +0530
|
||||
@@ -29,6 +29,8 @@
|
||||
/**************************************************************************/
|
||||
#include <math_private.h>
|
||||
|
||||
+#include <stap-probe.h>
|
||||
+
|
||||
#ifndef SECTION
|
||||
# define SECTION
|
||||
#endif
|
||||
@@ -60,12 +62,21 @@ __slowexp(double x) {
|
||||
__sub(&mpy,&mpcor,&mpz,p);
|
||||
__mp_dbl(&mpw, &w, p);
|
||||
__mp_dbl(&mpz, &z, p);
|
||||
- if (w == z) return w;
|
||||
+ if (w == z) {
|
||||
#ifndef USE_LONG_DOUBLE_FOR_MP
|
||||
# include "mpa.h"
|
||||
void __mpexp (mp_no *x, mp_no *y, int p);
|
||||
@@ -60,13 +62,22 @@ __slowexp (double x)
|
||||
__mp_dbl (&mpw, &w, p);
|
||||
__mp_dbl (&mpz, &z, p);
|
||||
if (w == z)
|
||||
- return w;
|
||||
+ {
|
||||
+ /* Track how often we get to the slow exp code plus
|
||||
+ its input/output values. */
|
||||
+ LIBC_PROBE (slowexp_p6, 2, &x, &w);
|
||||
+ return w;
|
||||
+ }
|
||||
else { /* if calculating is not exactly */
|
||||
else
|
||||
{
|
||||
p = 32;
|
||||
__dbl_mp(x,&mpx,p);
|
||||
__mpexp(&mpx, &mpy, p);
|
||||
__mp_dbl(&mpy, &res, p);
|
||||
__dbl_mp (x, &mpx, p);
|
||||
__mpexp (&mpx, &mpy, p);
|
||||
__mp_dbl (&mpy, &res, p);
|
||||
+
|
||||
+ /* Track how often we get to the uber-slow exp code plus
|
||||
+ its input/output values. */
|
||||
+ LIBC_PROBE (slowexp_p32, 2, &x, &res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
#else
|
||||
diff -rup c/sysdeps/ieee754/dbl-64/slowpow.c d/sysdeps/ieee754/dbl-64/slowpow.c
|
||||
--- c/sysdeps/ieee754/dbl-64/slowpow.c 2012-05-20 19:47:38.000000000 -0600
|
||||
+++ d/sysdeps/ieee754/dbl-64/slowpow.c 2012-05-21 10:02:51.694957291 -0600
|
||||
--- c/sysdeps/ieee754/dbl-64/slowpow.c 2013-06-04 16:40:55.000000000 +0530
|
||||
+++ d/sysdeps/ieee754/dbl-64/slowpow.c 2013-06-04 21:05:21.776433149 +0530
|
||||
@@ -34,6 +34,8 @@
|
||||
#include "mpa.h"
|
||||
#include <math_private.h>
|
||||
@ -45,24 +46,24 @@ diff -rup c/sysdeps/ieee754/dbl-64/slowpow.c d/sysdeps/ieee754/dbl-64/slowpow.c
|
||||
#ifndef SECTION
|
||||
# define SECTION
|
||||
#endif
|
||||
@@ -65,7 +67,12 @@ __slowpow(double x, double y, double z)
|
||||
__mp_dbl(&mpr, &res, p);
|
||||
__sub(&mpp,&eps,&mpr1,p); /* pp -eps =r1 */
|
||||
__mp_dbl(&mpr1, &res1, p); /* converting into double precision */
|
||||
- if (res == res1) return res;
|
||||
+ if (res == res1) {
|
||||
@@ -97,7 +99,12 @@ __slowpow (double x, double y, double z)
|
||||
__sub (&mpp, &eps, &mpr1, p);
|
||||
__mp_dbl (&mpr1, &res1, p);
|
||||
if (res == res1)
|
||||
- return res;
|
||||
+ {
|
||||
+ /* Track how often we get to the slow pow code plus
|
||||
+ its input/output values. */
|
||||
+ LIBC_PROBE (slowpow_p6, 4, &x, &y, &z, &res);
|
||||
+ return res;
|
||||
+ }
|
||||
|
||||
p = 32; /* if we get here result wasn't calculated exactly, continue */
|
||||
__dbl_mp(x,&mpx,p); /* for more exact calculation */
|
||||
@@ -75,5 +82,10 @@ __slowpow(double x, double y, double z)
|
||||
__mul(&mpy,&mpz,&mpw,p); /* y*z =w */
|
||||
__mpexp(&mpw, &mpp, p); /* e^w=pp */
|
||||
__mp_dbl(&mpp, &res, p); /* converting into double precision */
|
||||
/* If we don't, then we repeat using a higher precision. 768 bits of
|
||||
precision ought to be enough for anybody. */
|
||||
@@ -109,5 +116,10 @@ __slowpow (double x, double y, double z)
|
||||
__mul (&mpy, &mpz, &mpw, p);
|
||||
__mpexp (&mpw, &mpp, p);
|
||||
__mp_dbl (&mpp, &res, p);
|
||||
+
|
||||
+ /* Track how often we get to the uber-slow pow code plus
|
||||
+ its input/output values. */
|
||||
|
29
glibc.spec
29
glibc.spec
@ -1,5 +1,5 @@
|
||||
%define glibcsrcdir glibc-2.17-c758a686
|
||||
%define glibcversion 2.17
|
||||
%define glibcsrcdir glibc-2.17-757-g96df079
|
||||
%define glibcversion 2.17.90
|
||||
### glibc.spec.in follows:
|
||||
%define run_glibc_tests 1
|
||||
%define auxarches athlon alphaev6
|
||||
@ -27,7 +27,7 @@
|
||||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: 9%{?dist}
|
||||
Release: 1%{?dist}
|
||||
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
||||
# Things that are linked directly into dynamically linked programs
|
||||
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
||||
@ -63,7 +63,6 @@ Source1: %{glibcsrcdir}-releng.tar.gz
|
||||
# change this.
|
||||
Patch0001: %{name}-fedora-nscd.patch
|
||||
|
||||
Patch0002: %{name}-fedora-regcomp-sw11561.patch
|
||||
Patch0003: %{name}-fedora-ldd.patch
|
||||
|
||||
Patch0004: %{name}-fedora-ppc-unwind.patch
|
||||
@ -108,17 +107,11 @@ Patch0034: %{name}-fedora-elf-init-hidden_undef.patch
|
||||
|
||||
# Needs to be sent upstream
|
||||
Patch0035: %{name}-rh911307.patch
|
||||
Patch0036: %{name}-rh892777.patch
|
||||
Patch0037: %{name}-rh952799.patch
|
||||
Patch0038: %{name}-rh959034.patch
|
||||
|
||||
#
|
||||
# Patches from upstream
|
||||
#
|
||||
# Upstream BZ 15078
|
||||
Patch2029: %{name}-rh905877.patch
|
||||
|
||||
Patch1030: %{name}-rh921760.patch
|
||||
|
||||
#
|
||||
# Patches submitted, but not yet approved upstream.
|
||||
@ -147,12 +140,6 @@ Patch2026: %{name}-rh841787.patch
|
||||
# Upstream BZ 14185
|
||||
Patch2027: %{name}-rh819430.patch
|
||||
|
||||
# Upstream BZ 15006
|
||||
Patch2028: %{name}-rh905184.patch
|
||||
|
||||
# Upstream BZ 15465
|
||||
Patch2039: %{name}-rh961238.patch
|
||||
|
||||
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
Obsoletes: glibc-profile < 2.4
|
||||
Obsoletes: nss_db
|
||||
@ -377,7 +364,6 @@ package or when debugging this package.
|
||||
%setup -q -n %{glibcsrcdir} -b1
|
||||
|
||||
%patch0001 -p1
|
||||
%patch0002 -p1
|
||||
%patch0003 -p1
|
||||
%patch0004 -p1
|
||||
%patch0005 -p1
|
||||
@ -410,14 +396,8 @@ package or when debugging this package.
|
||||
%patch0032 -p1
|
||||
%patch0033 -p1
|
||||
%patch0034 -p1
|
||||
%patch2028 -p1
|
||||
%patch0035 -p1
|
||||
%patch0036 -p1
|
||||
%patch0037 -p1
|
||||
%patch2029 -p1
|
||||
%patch1030 -p1
|
||||
%patch0038 -p1
|
||||
%patch2039 -p1
|
||||
|
||||
# On powerpc32, hp timing is only available in power4/power6
|
||||
# libs, not in base, so pre-power4 dynamic linker is incompatible
|
||||
@ -1217,6 +1197,9 @@ rm -f *.filelist*
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Tue Jun 4 2013 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.17.90-1
|
||||
- Resync with upstream master.
|
||||
|
||||
* Tue May 14 2013 Siddhesh Poyarekar <siddhesh@redhat.com> - 2.17-9
|
||||
- Avoid crashing in LD_DEBUG when program name is unavailable (#961238).
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user