You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1101 lines
36 KiB
1101 lines
36 KiB
# --- SDE-COPYRIGHT-NOTE-BEGIN --- |
|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. |
|
# |
|
# Filename: package/.../glibc/glibc-2.16.0-0000-upstream-fixes.patch |
|
# Copyright (C) 2013 The OpenSDE Project |
|
# |
|
# More information can be found in the files COPYING and README. |
|
# |
|
# This patch file is dual-licensed. It is available under the license the |
|
# patched project is licensed under, as long as it is an OpenSource license |
|
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms |
|
# of the GNU General Public License as published by the Free Software |
|
# Foundation; either version 2 of the License, or (at your option) any later |
|
# version. |
|
# --- SDE-COPYRIGHT-NOTE-END --- |
|
|
|
From 33c9f2211ca7b23299e016ee246e2d2c6cc6e831 Mon Sep 17 00:00:00 2001 |
|
From: Mike Frysinger <vapier@gentoo.org> |
|
Date: Tue, 3 Jul 2012 15:22:05 -0400 |
|
Subject: [PATCH] sunrpc: fix rpc bootstrap builds |
|
|
|
If you build & install glibc w/rpc disabled, you no longer have headers in |
|
/usr/include/rpc/ (this is expected). But if you try to build glibc w/rpc |
|
enabled, this gets into a bad state due to the new rpc helpers that get |
|
cross-compiled: |
|
|
|
$ make |
|
... |
|
x86_64-pc-linux-gnu-gcc -m32 -D_RPC_THREAD_SAFE_ -D_GNU_SOURCE -DIS_IN_build \ |
|
-include $objdir/config.h rpc_clntout.c -o $objdir/sunrpc/cross-rpc_clntout.o \ |
|
-MMD -MP -MF $objdir/sunrpc/cross-rpc_clntout.o.dt -MT $objdir/sunrpc/cross-rpc_clntout.o -c |
|
rpc_clntout.c:34:23: fatal error: rpc/types.h: No such file or directory |
|
compilation terminated. |
|
make: *** [$objdir/sunrpc/cross-rpc_clntout.o] Error 1 |
|
|
|
Signed-off-by: Mike Frysinger <vapier@gentoo.org> |
|
|
|
(cherry picked from commit fb21f89b75d0152aa42efb6b620843799a4cd76b) |
|
--- |
|
sunrpc/rpc_clntout.c | 2 +- |
|
1 files changed, 1 insertions(+), 1 deletions(-) |
|
|
|
diff --git a/sunrpc/rpc_clntout.c b/sunrpc/rpc_clntout.c |
|
index ec040c7..ce4d2a4 100644 |
|
--- a/sunrpc/rpc_clntout.c |
|
+++ b/sunrpc/rpc_clntout.c |
|
@@ -31,7 +31,7 @@ |
|
*/ |
|
#include <stdio.h> |
|
#include <string.h> |
|
-#include <rpc/types.h> |
|
+#include "rpc/types.h" |
|
#include "rpc_parse.h" |
|
#include "rpc_util.h" |
|
#include "proto.h" |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From 76adf226534522267a38cf4b7d293706279d5cd2 Mon Sep 17 00:00:00 2001 |
|
From: Liubov Dmitrieva <liubov.dmitrieva@gmail.com> |
|
Date: Wed, 15 Aug 2012 21:06:55 +0200 |
|
Subject: [PATCH] Fix segmentation fault in strncasecmp for i686 |
|
|
|
2012-08-15 Liubov Dmitrieva <liubov.dmitrieva@gmail.com> |
|
|
|
[BZ #14195] |
|
* sysdeps/i386/i686/multiarch/strcmp-sssse3.S: Fix |
|
segmentation fault for a case of two empty input strings. |
|
* string/test-strncasecmp.c (check1): Renamed to... |
|
(bz12205): ...this. |
|
(bz14195): Add new testcase for two empty input strings and N > 0. |
|
(test_main): Call new testcase, adapt for renamed function. |
|
(cherry picked from commit b3f479a85a3e191befbe821d787d7f71c0f64e79) |
|
--- |
|
string/test-strncasecmp.c | 18 ++++++++++++++---- |
|
sysdeps/i386/i686/multiarch/strcmp-ssse3.S | 2 +- |
|
2 files changed, 15 insertions(+), 5 deletions(-) |
|
|
|
diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c |
|
index 6c17530..acfe668 100644 |
|
--- a/string/test-strncasecmp.c |
|
+++ b/string/test-strncasecmp.c |
|
@@ -1,5 +1,5 @@ |
|
/* Test and measure strncasecmp functions. |
|
- Copyright (C) 1999, 2002, 2003, 2005, 2010 Free Software Foundation, Inc. |
|
+ Copyright (C) 1999-2012 Free Software Foundation, Inc. |
|
This file is part of the GNU C Library. |
|
Written by Jakub Jelinek <jakub@redhat.com>, 1999. |
|
|
|
@@ -251,9 +251,9 @@ do_random_tests (void) |
|
} |
|
} |
|
|
|
- |
|
+/* Regression test for BZ #12205 */ |
|
static void |
|
-check1 (void) |
|
+bz12205 (void) |
|
{ |
|
static char cp [4096+16] __attribute__ ((aligned(4096))); |
|
static char gotrel[4096] __attribute__ ((aligned(4096))); |
|
@@ -270,6 +270,15 @@ check1 (void) |
|
check_result (impl, s1, s2, n, exp_result); |
|
} |
|
|
|
+/* Regression test for BZ #14195 */ |
|
+static void |
|
+bz14195 (void) |
|
+{ |
|
+ const char *empty_string = ""; |
|
+ FOR_EACH_IMPL (impl, 0) |
|
+ check_result (impl, empty_string, "", 5, 0); |
|
+} |
|
+ |
|
int |
|
test_main (void) |
|
{ |
|
@@ -277,7 +286,8 @@ test_main (void) |
|
|
|
test_init (); |
|
|
|
- check1 (); |
|
+ bz12205 (); |
|
+ bz14195 (); |
|
|
|
printf ("%23s", ""); |
|
FOR_EACH_IMPL (impl, 0) |
|
diff --git a/sysdeps/i386/i686/multiarch/strcmp-ssse3.S b/sysdeps/i386/i686/multiarch/strcmp-ssse3.S |
|
index 5e6321e..9735ad0 100644 |
|
--- a/sysdeps/i386/i686/multiarch/strcmp-ssse3.S |
|
+++ b/sysdeps/i386/i686/multiarch/strcmp-ssse3.S |
|
@@ -2445,7 +2445,7 @@ L(less16bytes_sncmp): |
|
# endif |
|
jne L(neq_sncmp) |
|
test %cl, %cl |
|
- je L(eq) |
|
+ je L(eq_sncmp) |
|
|
|
cmp $1, REM |
|
je L(eq_sncmp) |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From a01a14d518c2b32cdb0d21942b2d34da33692409 Mon Sep 17 00:00:00 2001 |
|
From: Joseph Myers <joseph@codesourcery.com> |
|
Date: Mon, 27 Aug 2012 15:59:24 +0000 |
|
Subject: [PATCH] Fix strtod integer/buffer overflow (bug 14459). |
|
|
|
(cherry picked from commit d6e70f4368533224e66d10b7f2126b899a3fd5e4) |
|
--- |
|
stdlib/Makefile | 3 +- |
|
stdlib/strtod_l.c | 142 ++++++++++++++++++++++++++++++++--------- |
|
stdlib/tst-strtod-overflow.c | 48 ++++++++++++++ |
|
3 files changed, 161 insertions(+), 32 deletions(-) |
|
create mode 100644 stdlib/tst-strtod-overflow.c |
|
|
|
diff --git a/stdlib/Makefile b/stdlib/Makefile |
|
index f7811c5..79c9acb 100644 |
|
--- a/stdlib/Makefile |
|
+++ b/stdlib/Makefile |
|
@@ -68,7 +68,8 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ |
|
tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \ |
|
tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \ |
|
tst-makecontext2 tst-strtod6 tst-unsetenv1 \ |
|
- tst-makecontext3 bug-getcontext bug-fmtmsg1 |
|
+ tst-makecontext3 bug-getcontext bug-fmtmsg1 \ |
|
+ tst-strtod-overflow |
|
|
|
include ../Makeconfig |
|
|
|
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c |
|
index 2166a08..a8a7ea8 100644 |
|
--- a/stdlib/strtod_l.c |
|
+++ b/stdlib/strtod_l.c |
|
@@ -60,6 +60,7 @@ extern unsigned long long int ____strtoull_l_internal (const char *, char **, |
|
#include <math.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
+#include <stdint.h> |
|
|
|
/* The gmp headers need some configuration frobs. */ |
|
#define HAVE_ALLOCA 1 |
|
@@ -72,7 +73,6 @@ extern unsigned long long int ____strtoull_l_internal (const char *, char **, |
|
#include "longlong.h" |
|
#include "fpioconst.h" |
|
|
|
-#define NDEBUG 1 |
|
#include <assert.h> |
|
|
|
|
|
@@ -174,19 +174,19 @@ extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1]; |
|
/* Return a floating point number of the needed type according to the given |
|
multi-precision number after possible rounding. */ |
|
static FLOAT |
|
-round_and_return (mp_limb_t *retval, int exponent, int negative, |
|
+round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, |
|
mp_limb_t round_limb, mp_size_t round_bit, int more_bits) |
|
{ |
|
if (exponent < MIN_EXP - 1) |
|
{ |
|
- mp_size_t shift = MIN_EXP - 1 - exponent; |
|
- |
|
- if (shift > MANT_DIG) |
|
+ if (exponent < MIN_EXP - 1 - MANT_DIG) |
|
{ |
|
__set_errno (ERANGE); |
|
return 0.0; |
|
} |
|
|
|
+ mp_size_t shift = MIN_EXP - 1 - exponent; |
|
+ |
|
more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0; |
|
if (shift == MANT_DIG) |
|
/* This is a special case to handle the very seldom case where |
|
@@ -233,6 +233,9 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, |
|
__set_errno (ERANGE); |
|
} |
|
|
|
+ if (exponent > MAX_EXP) |
|
+ goto overflow; |
|
+ |
|
if ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0 |
|
&& (more_bits || (retval[0] & 1) != 0 |
|
|| (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0)) |
|
@@ -258,6 +261,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, |
|
} |
|
|
|
if (exponent > MAX_EXP) |
|
+ overflow: |
|
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; |
|
|
|
return MPN2FLOAT (retval, exponent, negative); |
|
@@ -271,7 +275,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, |
|
factor for the resulting number (see code) multiply by it. */ |
|
static const STRING_TYPE * |
|
str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, |
|
- int *exponent |
|
+ intmax_t *exponent |
|
#ifndef USE_WIDE_CHAR |
|
, const char *decimal, size_t decimal_len, const char *thousands |
|
#endif |
|
@@ -301,6 +305,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, |
|
cy += __mpn_add_1 (n, n, *nsize, low); |
|
if (cy != 0) |
|
{ |
|
+ assert (*nsize < MPNSIZE); |
|
n[*nsize] = cy; |
|
++(*nsize); |
|
} |
|
@@ -335,7 +340,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, |
|
} |
|
while (--digcnt > 0); |
|
|
|
- if (*exponent > 0 && cnt + *exponent <= MAX_DIG_PER_LIMB) |
|
+ if (*exponent > 0 && *exponent <= MAX_DIG_PER_LIMB - cnt) |
|
{ |
|
low *= _tens_in_limb[*exponent]; |
|
start = _tens_in_limb[cnt + *exponent]; |
|
@@ -355,7 +360,10 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, |
|
cy = __mpn_mul_1 (n, n, *nsize, start); |
|
cy += __mpn_add_1 (n, n, *nsize, low); |
|
if (cy != 0) |
|
- n[(*nsize)++] = cy; |
|
+ { |
|
+ assert (*nsize < MPNSIZE); |
|
+ n[(*nsize)++] = cy; |
|
+ } |
|
} |
|
|
|
return str; |
|
@@ -413,7 +421,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
{ |
|
int negative; /* The sign of the number. */ |
|
MPN_VAR (num); /* MP representation of the number. */ |
|
- int exponent; /* Exponent of the number. */ |
|
+ intmax_t exponent; /* Exponent of the number. */ |
|
|
|
/* Numbers starting `0X' or `0x' have to be processed with base 16. */ |
|
int base = 10; |
|
@@ -435,7 +443,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
/* Points at the character following the integer and fractional digits. */ |
|
const STRING_TYPE *expp; |
|
/* Total number of digit and number of digits in integer part. */ |
|
- int dig_no, int_no, lead_zero; |
|
+ size_t dig_no, int_no, lead_zero; |
|
/* Contains the last character read. */ |
|
CHAR_TYPE c; |
|
|
|
@@ -767,7 +775,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
are all or any is really a fractional digit will be decided |
|
later. */ |
|
int_no = dig_no; |
|
- lead_zero = int_no == 0 ? -1 : 0; |
|
+ lead_zero = int_no == 0 ? (size_t) -1 : 0; |
|
|
|
/* Read the fractional digits. A special case are the 'american |
|
style' numbers like `16.' i.e. with decimal point but without |
|
@@ -789,12 +797,13 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
(base == 16 && ({ CHAR_TYPE lo = TOLOWER (c); |
|
lo >= L_('a') && lo <= L_('f'); }))) |
|
{ |
|
- if (c != L_('0') && lead_zero == -1) |
|
+ if (c != L_('0') && lead_zero == (size_t) -1) |
|
lead_zero = dig_no - int_no; |
|
++dig_no; |
|
c = *++cp; |
|
} |
|
} |
|
+ assert (dig_no <= (uintmax_t) INTMAX_MAX); |
|
|
|
/* Remember start of exponent (if any). */ |
|
expp = cp; |
|
@@ -817,24 +826,80 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
|
|
if (c >= L_('0') && c <= L_('9')) |
|
{ |
|
- int exp_limit; |
|
+ intmax_t exp_limit; |
|
|
|
/* Get the exponent limit. */ |
|
if (base == 16) |
|
- exp_limit = (exp_negative ? |
|
- -MIN_EXP + MANT_DIG + 4 * int_no : |
|
- MAX_EXP - 4 * int_no + 4 * lead_zero + 3); |
|
+ { |
|
+ if (exp_negative) |
|
+ { |
|
+ assert (int_no <= (uintmax_t) (INTMAX_MAX |
|
+ + MIN_EXP - MANT_DIG) / 4); |
|
+ exp_limit = -MIN_EXP + MANT_DIG + 4 * (intmax_t) int_no; |
|
+ } |
|
+ else |
|
+ { |
|
+ if (int_no) |
|
+ { |
|
+ assert (lead_zero == 0 |
|
+ && int_no <= (uintmax_t) INTMAX_MAX / 4); |
|
+ exp_limit = MAX_EXP - 4 * (intmax_t) int_no + 3; |
|
+ } |
|
+ else if (lead_zero == (size_t) -1) |
|
+ { |
|
+ /* The number is zero and this limit is |
|
+ arbitrary. */ |
|
+ exp_limit = MAX_EXP + 3; |
|
+ } |
|
+ else |
|
+ { |
|
+ assert (lead_zero |
|
+ <= (uintmax_t) (INTMAX_MAX - MAX_EXP - 3) / 4); |
|
+ exp_limit = (MAX_EXP |
|
+ + 4 * (intmax_t) lead_zero |
|
+ + 3); |
|
+ } |
|
+ } |
|
+ } |
|
else |
|
- exp_limit = (exp_negative ? |
|
- -MIN_10_EXP + MANT_DIG + int_no : |
|
- MAX_10_EXP - int_no + lead_zero + 1); |
|
+ { |
|
+ if (exp_negative) |
|
+ { |
|
+ assert (int_no |
|
+ <= (uintmax_t) (INTMAX_MAX + MIN_10_EXP - MANT_DIG)); |
|
+ exp_limit = -MIN_10_EXP + MANT_DIG + (intmax_t) int_no; |
|
+ } |
|
+ else |
|
+ { |
|
+ if (int_no) |
|
+ { |
|
+ assert (lead_zero == 0 |
|
+ && int_no <= (uintmax_t) INTMAX_MAX); |
|
+ exp_limit = MAX_10_EXP - (intmax_t) int_no + 1; |
|
+ } |
|
+ else if (lead_zero == (size_t) -1) |
|
+ { |
|
+ /* The number is zero and this limit is |
|
+ arbitrary. */ |
|
+ exp_limit = MAX_10_EXP + 1; |
|
+ } |
|
+ else |
|
+ { |
|
+ assert (lead_zero |
|
+ <= (uintmax_t) (INTMAX_MAX - MAX_10_EXP - 1)); |
|
+ exp_limit = MAX_10_EXP + (intmax_t) lead_zero + 1; |
|
+ } |
|
+ } |
|
+ } |
|
+ |
|
+ if (exp_limit < 0) |
|
+ exp_limit = 0; |
|
|
|
do |
|
{ |
|
- exponent *= 10; |
|
- exponent += c - L_('0'); |
|
- |
|
- if (__builtin_expect (exponent > exp_limit, 0)) |
|
+ if (__builtin_expect ((exponent > exp_limit / 10 |
|
+ || (exponent == exp_limit / 10 |
|
+ && c - L_('0') > exp_limit % 10)), 0)) |
|
/* The exponent is too large/small to represent a valid |
|
number. */ |
|
{ |
|
@@ -843,7 +908,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
/* We have to take care for special situation: a joker |
|
might have written "0.0e100000" which is in fact |
|
zero. */ |
|
- if (lead_zero == -1) |
|
+ if (lead_zero == (size_t) -1) |
|
result = negative ? -0.0 : 0.0; |
|
else |
|
{ |
|
@@ -862,6 +927,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
/* NOTREACHED */ |
|
} |
|
|
|
+ exponent *= 10; |
|
+ exponent += c - L_('0'); |
|
+ |
|
c = *++cp; |
|
} |
|
while (c >= L_('0') && c <= L_('9')); |
|
@@ -930,7 +998,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
} |
|
#endif |
|
startp += lead_zero + decimal_len; |
|
- exponent -= base == 16 ? 4 * lead_zero : lead_zero; |
|
+ assert (lead_zero <= (base == 16 |
|
+ ? (uintmax_t) INTMAX_MAX / 4 |
|
+ : (uintmax_t) INTMAX_MAX)); |
|
+ assert (lead_zero <= (base == 16 |
|
+ ? ((uintmax_t) exponent |
|
+ - (uintmax_t) INTMAX_MIN) / 4 |
|
+ : ((uintmax_t) exponent - (uintmax_t) INTMAX_MIN))); |
|
+ exponent -= base == 16 ? 4 * (intmax_t) lead_zero : (intmax_t) lead_zero; |
|
dig_no -= lead_zero; |
|
} |
|
|
|
@@ -972,7 +1047,10 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
} |
|
|
|
/* Adjust the exponent for the bits we are shifting in. */ |
|
- exponent += bits - 1 + (int_no - 1) * 4; |
|
+ assert (int_no <= (uintmax_t) (exponent < 0 |
|
+ ? (INTMAX_MAX - bits + 1) / 4 |
|
+ : (INTMAX_MAX - exponent - bits + 1) / 4)); |
|
+ exponent += bits - 1 + ((intmax_t) int_no - 1) * 4; |
|
|
|
while (--dig_no > 0 && idx >= 0) |
|
{ |
|
@@ -1024,13 +1102,15 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
really integer digits or belong to the fractional part; i.e. we normalize |
|
123e-2 to 1.23. */ |
|
{ |
|
- register int incr = (exponent < 0 ? MAX (-int_no, exponent) |
|
- : MIN (dig_no - int_no, exponent)); |
|
+ register intmax_t incr = (exponent < 0 |
|
+ ? MAX (-(intmax_t) int_no, exponent) |
|
+ : MIN ((intmax_t) dig_no - (intmax_t) int_no, |
|
+ exponent)); |
|
int_no += incr; |
|
exponent -= incr; |
|
} |
|
|
|
- if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0)) |
|
+ if (__builtin_expect (exponent > MAX_10_EXP + 1 - (intmax_t) int_no, 0)) |
|
{ |
|
__set_errno (ERANGE); |
|
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; |
|
@@ -1215,7 +1295,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
digits we should have enough bits for the result. The remaining |
|
decimal digits give us the information that more bits are following. |
|
This can be used while rounding. (Two added as a safety margin.) */ |
|
- if (dig_no - int_no > (MANT_DIG - bits + 2) / 3 + 2) |
|
+ if ((intmax_t) dig_no > (intmax_t) int_no + (MANT_DIG - bits + 2) / 3 + 2) |
|
{ |
|
dig_no = int_no + (MANT_DIG - bits + 2) / 3 + 2; |
|
more_bits = 1; |
|
@@ -1223,7 +1303,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) |
|
else |
|
more_bits = 0; |
|
|
|
- neg_exp = dig_no - int_no - exponent; |
|
+ neg_exp = (intmax_t) dig_no - (intmax_t) int_no - exponent; |
|
|
|
/* Construct the denominator. */ |
|
densize = 0; |
|
diff --git a/stdlib/tst-strtod-overflow.c b/stdlib/tst-strtod-overflow.c |
|
new file mode 100644 |
|
index 0000000..668d55b |
|
--- /dev/null |
|
+++ b/stdlib/tst-strtod-overflow.c |
|
@@ -0,0 +1,48 @@ |
|
+/* Test for integer/buffer overflow in strtod. |
|
+ Copyright (C) 2012 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/>. */ |
|
+ |
|
+#include <stdio.h> |
|
+#include <stdlib.h> |
|
+#include <string.h> |
|
+ |
|
+#define EXPONENT "e-2147483649" |
|
+#define SIZE 214748364 |
|
+ |
|
+static int |
|
+do_test (void) |
|
+{ |
|
+ char *p = malloc (1 + SIZE + sizeof (EXPONENT)); |
|
+ if (p == NULL) |
|
+ { |
|
+ puts ("malloc failed, cannot test for overflow"); |
|
+ return 0; |
|
+ } |
|
+ p[0] = '1'; |
|
+ memset (p + 1, '0', SIZE); |
|
+ memcpy (p + 1 + SIZE, EXPONENT, sizeof (EXPONENT)); |
|
+ double d = strtod (p, NULL); |
|
+ if (d != 0) |
|
+ { |
|
+ printf ("strtod returned wrong value: %a\n", d); |
|
+ return 1; |
|
+ } |
|
+ return 0; |
|
+} |
|
+ |
|
+#define TEST_FUNCTION do_test () |
|
+#include "../test-skeleton.c" |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From 39086d7f713d8e54f70362d662a161d783ccd5e6 Mon Sep 17 00:00:00 2001 |
|
From: H.J. Lu <hjl.tools@gmail.com> |
|
Date: Wed, 29 Aug 2012 06:45:37 -0700 |
|
Subject: [PATCH] Use LD_SO to set $ld_so_name/$ld_so_version |
|
|
|
cherry-pick d22e28b070d3d1572d39a463d711c6f223078552 |
|
--- |
|
Makefile | 2 +- |
|
scripts/test-installation.pl | 7 +++++++ |
|
2 files changed, 8 insertions(+), 1 deletions(-) |
|
|
|
diff --git a/Makefile b/Makefile |
|
index 89588c1..f993c91 100644 |
|
--- a/Makefile |
|
+++ b/Makefile |
|
@@ -111,7 +111,7 @@ install: |
|
ifneq (no,$(PERL)) |
|
ifeq (/usr,$(prefix)) |
|
ifeq (,$(install_root)) |
|
- CC="$(CC)" $(PERL) scripts/test-installation.pl $(common-objpfx) |
|
+ LD_SO=$(ld.so-version) CC="$(CC)" $(PERL) scripts/test-installation.pl $(common-objpfx) |
|
endif |
|
endif |
|
endif |
|
diff --git a/scripts/test-installation.pl b/scripts/test-installation.pl |
|
index 1b22086..0700770 100755 |
|
--- a/scripts/test-installation.pl |
|
+++ b/scripts/test-installation.pl |
|
@@ -25,6 +25,11 @@ if ($ENV{CC}) { |
|
} else { |
|
$CC= "gcc"; |
|
} |
|
+if ($ENV{LD_SO}) { |
|
+ $LD_SO = $ENV{LD_SO}; |
|
+} else { |
|
+ $LD_SO = ""; |
|
+} |
|
|
|
sub usage { |
|
print "Usage: test-installation [soversions.mk]\n"; |
|
@@ -112,6 +117,8 @@ while (<SOVERSIONS>) { |
|
$link_libs .= " -l$name"; |
|
$versions{$name} = $version; |
|
} |
|
+ } elsif ($LD_SO ne "") { |
|
+ ($ld_so_name, $ld_so_version) = split ('\.so\.', $LD_SO); |
|
} else { |
|
if (/^ld\.so/) { |
|
($ld_so_name, $ld_so_version)= /=(.*)\.so\.(.*)$/; |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From ec0f78d65ce08fb4158cc31624c4872c0df9b545 Mon Sep 17 00:00:00 2001 |
|
From: H.J. Lu <hjl.tools@gmail.com> |
|
Date: Mon, 24 Sep 2012 08:58:04 -0700 |
|
Subject: [PATCH] Properly handle fencepost with MALLOC_ALIGN_MASK |
|
|
|
Cherry-pick commit ced6f16ee919d12725840d43d007f1cfd67118df. |
|
--- |
|
malloc/arena.c | 10 +++++++--- |
|
1 files changed, 7 insertions(+), 3 deletions(-) |
|
|
|
diff --git a/malloc/arena.c b/malloc/arena.c |
|
index 33c4ff3..71a0dee 100644 |
|
--- a/malloc/arena.c |
|
+++ b/malloc/arena.c |
|
@@ -652,15 +652,19 @@ heap_trim(heap_info *heap, size_t pad) |
|
unsigned long pagesz = GLRO(dl_pagesize); |
|
mchunkptr top_chunk = top(ar_ptr), p, bck, fwd; |
|
heap_info *prev_heap; |
|
- long new_size, top_size, extra; |
|
+ long new_size, top_size, extra, prev_size, misalign; |
|
|
|
/* Can this heap go away completely? */ |
|
while(top_chunk == chunk_at_offset(heap, sizeof(*heap))) { |
|
prev_heap = heap->prev; |
|
- p = chunk_at_offset(prev_heap, prev_heap->size - (MINSIZE-2*SIZE_SZ)); |
|
+ prev_size = prev_heap->size - (MINSIZE-2*SIZE_SZ); |
|
+ p = chunk_at_offset(prev_heap, prev_size); |
|
+ /* fencepost must be properly aligned. */ |
|
+ misalign = ((long) p) & MALLOC_ALIGN_MASK; |
|
+ p = chunk_at_offset(prev_heap, prev_size - misalign); |
|
assert(p->size == (0|PREV_INUSE)); /* must be fencepost */ |
|
p = prev_chunk(p); |
|
- new_size = chunksize(p) + (MINSIZE-2*SIZE_SZ); |
|
+ new_size = chunksize(p) + (MINSIZE-2*SIZE_SZ) + misalign; |
|
assert(new_size>0 && new_size<(long)(2*MINSIZE)); |
|
if(!prev_inuse(p)) |
|
new_size += p->prev_size; |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From d22cf229673050abfdb3be5124bd58eb2fc2b965 Mon Sep 17 00:00:00 2001 |
|
From: Joseph Myers <joseph@codesourcery.com> |
|
Date: Tue, 25 Sep 2012 19:38:15 +0000 |
|
Subject: [PATCH] Use size_t instead of int for internal variables in glob (bug 14621). |
|
|
|
(cherry picked from commit b87c4b24d97321ef2f2da357f8fcf11f1f61e3dc) |
|
--- |
|
posix/glob.c | 10 +++++----- |
|
1 files changed, 5 insertions(+), 5 deletions(-) |
|
|
|
diff --git a/posix/glob.c b/posix/glob.c |
|
index 68ea205..87d4f1b 100644 |
|
--- a/posix/glob.c |
|
+++ b/posix/glob.c |
|
@@ -217,7 +217,7 @@ static int collated_compare (const void *, const void *) __THROW; |
|
static const char * |
|
next_brace_sub (const char *cp, int flags) |
|
{ |
|
- unsigned int depth = 0; |
|
+ size_t depth = 0; |
|
while (*cp != '\0') |
|
if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\') |
|
{ |
|
@@ -960,7 +960,7 @@ glob (pattern, flags, errfunc, pglob) |
|
&& S_ISDIR (st.st_mode)) |
|
: (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode))))) |
|
{ |
|
- int newcount = pglob->gl_pathc + pglob->gl_offs; |
|
+ size_t newcount = pglob->gl_pathc + pglob->gl_offs; |
|
char **new_gl_pathv; |
|
|
|
if (newcount > UINTPTR_MAX - (1 + 1) |
|
@@ -1059,7 +1059,7 @@ glob (pattern, flags, errfunc, pglob) |
|
appending the results to PGLOB. */ |
|
for (i = 0; i < dirs.gl_pathc; ++i) |
|
{ |
|
- int old_pathc; |
|
+ size_t old_pathc; |
|
|
|
#ifdef SHELL |
|
{ |
|
@@ -1114,7 +1114,7 @@ glob (pattern, flags, errfunc, pglob) |
|
/* No matches. */ |
|
if (flags & GLOB_NOCHECK) |
|
{ |
|
- int newcount = pglob->gl_pathc + pglob->gl_offs; |
|
+ size_t newcount = pglob->gl_pathc + pglob->gl_offs; |
|
char **new_gl_pathv; |
|
|
|
if (newcount > UINTPTR_MAX - 2 |
|
@@ -1158,7 +1158,7 @@ glob (pattern, flags, errfunc, pglob) |
|
} |
|
else |
|
{ |
|
- int old_pathc = pglob->gl_pathc; |
|
+ size_t old_pathc = pglob->gl_pathc; |
|
int orig_flags = flags; |
|
|
|
if (meta & 2) |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From 2a9afa3d1bd0aacf4df9106342d973e368e315d5 Mon Sep 17 00:00:00 2001 |
|
From: Jeff Law <law@redhat.com> |
|
Date: Fri, 28 Sep 2012 12:48:42 -0600 |
|
Subject: [PATCH] Don't parse %s format argument as multibyte string |
|
|
|
(cherry picked from commit 715a900c9085907fa749589bf738b192b1a2bda5) |
|
|
|
2012-09-28 Andreas Schwab <schwab@linux-m68k.org> |
|
|
|
[BZ #6530] |
|
* stdio-common/vfprintf.c (process_string_arg): Revert |
|
2000-07-22 change. |
|
|
|
2011-09-28 Jonathan Nieder <jrnieder@gmail.com> |
|
|
|
* stdio-common/Makefile (tst-sprintf-ENV): Set environment |
|
for testcase. |
|
* stdio-common/tst-sprintf.c: Include <locale.h> |
|
(main): Test sprintf's handling of incomplete multibyte |
|
characters. |
|
--- |
|
stdio-common/Makefile | 1 + |
|
stdio-common/tst-sprintf.c | 13 +++++++++++++ |
|
stdio-common/vfprintf.c | 39 +++------------------------------------ |
|
3 files changed, 17 insertions(+), 36 deletions(-) |
|
|
|
diff --git a/stdio-common/Makefile b/stdio-common/Makefile |
|
index a29924b..42e45dc 100644 |
|
--- a/stdio-common/Makefile |
|
+++ b/stdio-common/Makefile |
|
@@ -116,6 +116,7 @@ CFLAGS-scanf17.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \ |
|
|
|
# We know the test has a format string problem. |
|
CFLAGS-tst-sprintf.c = -Wno-format |
|
+tst-sprintf-ENV = LOCPATH=$(common-objpfx)localedata |
|
tst-sscanf-ENV = LOCPATH=$(common-objpfx)localedata |
|
tst-swprintf-ENV = LOCPATH=$(common-objpfx)localedata |
|
test-vfprintf-ENV = LOCPATH=$(common-objpfx)localedata |
|
diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c |
|
index c04fef1..c4e911f 100644 |
|
--- a/stdio-common/tst-sprintf.c |
|
+++ b/stdio-common/tst-sprintf.c |
|
@@ -1,5 +1,6 @@ |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
+#include <locale.h> |
|
#include <string.h> |
|
|
|
|
|
@@ -58,5 +59,17 @@ main (void) |
|
result = 1; |
|
} |
|
|
|
+ if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) |
|
+ { |
|
+ puts ("cannot set locale"); |
|
+ result = 1; |
|
+ } |
|
+ else if (sprintf (buf, "%.8s\n", "Foo: \277") != 7 |
|
+ || strcmp (buf, "Foo: \277\n") != 0) |
|
+ { |
|
+ printf ("sprintf (buf, \"%%.8s\\n\", \"Foo: \\277\") produced '%s' output\n", buf); |
|
+ result = 1; |
|
+ } |
|
+ |
|
return result; |
|
} |
|
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c |
|
index d569034..17d3f42 100644 |
|
--- a/stdio-common/vfprintf.c |
|
+++ b/stdio-common/vfprintf.c |
|
@@ -1168,42 +1168,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) |
|
else if (!is_long && spec != L_('S')) \ |
|
{ \ |
|
if (prec != -1) \ |
|
- { \ |
|
- /* Search for the end of the string, but don't search past \ |
|
- the length (in bytes) specified by the precision. Also \ |
|
- don't use incomplete characters. */ \ |
|
- if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX) == 1) \ |
|
- len = __strnlen (string, prec); \ |
|
- else \ |
|
- { \ |
|
- /* In case we have a multibyte character set the \ |
|
- situation is more complicated. We must not copy \ |
|
- bytes at the end which form an incomplete character. */\ |
|
- size_t ignore_size = (unsigned) prec > 1024 ? 1024 : prec;\ |
|
- wchar_t ignore[ignore_size]; \ |
|
- const char *str2 = string; \ |
|
- const char *strend = string + prec; \ |
|
- if (strend < string) \ |
|
- strend = (const char *) UINTPTR_MAX; \ |
|
- \ |
|
- mbstate_t ps; \ |
|
- memset (&ps, '\0', sizeof (ps)); \ |
|
- \ |
|
- while (str2 != NULL && str2 < strend) \ |
|
- if (__mbsnrtowcs (ignore, &str2, strend - str2, \ |
|
- ignore_size, &ps) == (size_t) -1) \ |
|
- { \ |
|
- /* Conversion function has set errno. */ \ |
|
- done = -1; \ |
|
- goto all_done; \ |
|
- } \ |
|
- \ |
|
- if (str2 == NULL) \ |
|
- len = strlen (string); \ |
|
- else \ |
|
- len = str2 - string - (ps.__count & 7); \ |
|
- } \ |
|
- } \ |
|
+ /* Search for the end of the string, but don't search past \ |
|
+ the length (in bytes) specified by the precision. */ \ |
|
+ len = __strnlen (string, prec); \ |
|
else \ |
|
len = strlen (string); \ |
|
} \ |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From 59fca14adeaebea87b8171e35ab41bb8e93008bf Mon Sep 17 00:00:00 2001 |
|
From: H.J. Lu <hjl.tools@gmail.com> |
|
Date: Tue, 2 Oct 2012 05:05:17 -0700 |
|
Subject: [PATCH] Define HAS_FMA with bit_FMA_Usable |
|
|
|
cherry-pick 0569936773c861c791f10bba5e2f4cac5fbb4e78 |
|
--- |
|
sysdeps/x86_64/multiarch/init-arch.c | 3 +++ |
|
sysdeps/x86_64/multiarch/init-arch.h | 9 +++++++-- |
|
2 files changed, 10 insertions(+), 2 deletions(-) |
|
|
|
diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c |
|
index fb44dcf..fed5ab8 100644 |
|
--- a/sysdeps/x86_64/multiarch/init-arch.c |
|
+++ b/sysdeps/x86_64/multiarch/init-arch.c |
|
@@ -156,6 +156,9 @@ __init_cpu_features (void) |
|
/* Determine if AVX is usable. */ |
|
if (CPUID_AVX) |
|
__cpu_features.feature[index_AVX_Usable] |= bit_AVX_Usable; |
|
+ /* Determine if FMA is usable. */ |
|
+ if (CPUID_FMA) |
|
+ __cpu_features.feature[index_FMA_Usable] |= bit_FMA_Usable; |
|
/* Determine if FMA4 is usable. */ |
|
if (CPUID_FMA4) |
|
__cpu_features.feature[index_FMA4_Usable] |= bit_FMA4_Usable; |
|
diff --git a/sysdeps/x86_64/multiarch/init-arch.h b/sysdeps/x86_64/multiarch/init-arch.h |
|
index 45e2651..f33f1c8 100644 |
|
--- a/sysdeps/x86_64/multiarch/init-arch.h |
|
+++ b/sysdeps/x86_64/multiarch/init-arch.h |
|
@@ -22,7 +22,8 @@ |
|
#define bit_Fast_Unaligned_Load (1 << 4) |
|
#define bit_Prefer_PMINUB_for_stringop (1 << 5) |
|
#define bit_AVX_Usable (1 << 6) |
|
-#define bit_FMA4_Usable (1 << 7) |
|
+#define bit_FMA_Usable (1 << 7) |
|
+#define bit_FMA4_Usable (1 << 8) |
|
|
|
/* CPUID Feature flags. */ |
|
#define bit_SSE2 (1 << 26) |
|
@@ -56,6 +57,7 @@ |
|
# define index_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE |
|
# define index_Prefer_PMINUB_for_stringop FEATURE_INDEX_1*FEATURE_SIZE |
|
# define index_AVX_Usable FEATURE_INDEX_1*FEATURE_SIZE |
|
+# define index_FMA_Usable FEATURE_INDEX_1*FEATURE_SIZE |
|
# define index_FMA4_Usable FEATURE_INDEX_1*FEATURE_SIZE |
|
|
|
#else /* __ASSEMBLER__ */ |
|
@@ -131,6 +133,8 @@ extern const struct cpu_features *__get_cpu_features (void) |
|
HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_OSXSAVE) |
|
# define CPUID_AVX \ |
|
HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_AVX) |
|
+# define CPUID_FMA \ |
|
+ HAS_CPUID_FLAG (COMMON_CPUID_INDEX_1, ecx, bit_FMA) |
|
# define CPUID_FMA4 \ |
|
HAS_CPUID_FLAG (COMMON_CPUID_INDEX_80000001, ecx, bit_FMA4) |
|
|
|
@@ -140,7 +144,6 @@ extern const struct cpu_features *__get_cpu_features (void) |
|
# define HAS_SSSE3 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSSE3) |
|
# define HAS_SSE4_1 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSE4_1) |
|
# define HAS_SSE4_2 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_SSE4_2) |
|
-# define HAS_FMA HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, bit_FMA) |
|
|
|
# define index_Fast_Rep_String FEATURE_INDEX_1 |
|
# define index_Fast_Copy_Backward FEATURE_INDEX_1 |
|
@@ -148,6 +151,7 @@ extern const struct cpu_features *__get_cpu_features (void) |
|
# define index_Prefer_SSE_for_memop FEATURE_INDEX_1 |
|
# define index_Fast_Unaligned_Load FEATURE_INDEX_1 |
|
# define index_AVX_Usable FEATURE_INDEX_1 |
|
+# define index_FMA_Usable FEATURE_INDEX_1 |
|
# define index_FMA4_Usable FEATURE_INDEX_1 |
|
|
|
# define HAS_ARCH_FEATURE(name) \ |
|
@@ -159,6 +163,7 @@ extern const struct cpu_features *__get_cpu_features (void) |
|
# define HAS_PREFER_SSE_FOR_MEMOP HAS_ARCH_FEATURE (Prefer_SSE_for_memop) |
|
# define HAS_FAST_UNALIGNED_LOAD HAS_ARCH_FEATURE (Fast_Unaligned_Load) |
|
# define HAS_AVX HAS_ARCH_FEATURE (AVX_Usable) |
|
+# define HAS_FMA HAS_ARCH_FEATURE (FMA_Usable) |
|
# define HAS_FMA4 HAS_ARCH_FEATURE (FMA4_Usable) |
|
|
|
#endif /* __ASSEMBLER__ */ |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From fc81079f382590db35d158ae455cadadbbe0bde3 Mon Sep 17 00:00:00 2001 |
|
From: Andreas Schwab <schwab@linux-m68k.org> |
|
Date: Tue, 1 May 2012 17:10:10 +0200 |
|
Subject: [PATCH] Fix missing _mcount@GLIBC_2.0 on powerpc32 |
|
|
|
(cherry picked from commit 261f485936b283f4327fc1f2fc8fd1705d805c12) |
|
--- |
|
sysdeps/powerpc/powerpc32/Makefile | 3 ++- |
|
sysdeps/powerpc/powerpc32/compat-ppc-mcount.S | 11 +++++++++++ |
|
sysdeps/powerpc/powerpc32/ppc-mcount.S | 6 +++++- |
|
3 files changed, 18 insertions(+), 2 deletions(-) |
|
create mode 100644 sysdeps/powerpc/powerpc32/compat-ppc-mcount.S |
|
|
|
diff --git a/sysdeps/powerpc/powerpc32/Makefile b/sysdeps/powerpc/powerpc32/Makefile |
|
index aa2d0b9..64f7900 100644 |
|
--- a/sysdeps/powerpc/powerpc32/Makefile |
|
+++ b/sysdeps/powerpc/powerpc32/Makefile |
|
@@ -6,8 +6,9 @@ sysdep-LDFLAGS += -msoft-float |
|
endif |
|
|
|
ifeq ($(subdir),gmon) |
|
-sysdep_routines += ppc-mcount |
|
+sysdep_routines += ppc-mcount compat-ppc-mcount |
|
static-only-routines += ppc-mcount |
|
+shared-only-routines += compat-ppc-mcount |
|
endif |
|
|
|
ifeq ($(subdir),misc) |
|
diff --git a/sysdeps/powerpc/powerpc32/compat-ppc-mcount.S b/sysdeps/powerpc/powerpc32/compat-ppc-mcount.S |
|
new file mode 100644 |
|
index 0000000..2a9cb24 |
|
--- /dev/null |
|
+++ b/sysdeps/powerpc/powerpc32/compat-ppc-mcount.S |
|
@@ -0,0 +1,11 @@ |
|
+#include <shlib-compat.h> |
|
+ |
|
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_15) |
|
+ |
|
+ compat_text_section |
|
+# define _mcount __compat_mcount |
|
+# include "ppc-mcount.S" |
|
+# undef _mcount |
|
+ |
|
+compat_symbol (libc, __compat_mcount, _mcount, GLIBC_2_0) |
|
+#endif |
|
diff --git a/sysdeps/powerpc/powerpc32/ppc-mcount.S b/sysdeps/powerpc/powerpc32/ppc-mcount.S |
|
index 9a3c041..911638b 100644 |
|
--- a/sysdeps/powerpc/powerpc32/ppc-mcount.S |
|
+++ b/sysdeps/powerpc/powerpc32/ppc-mcount.S |
|
@@ -1,5 +1,5 @@ |
|
/* PowerPC-specific implementation of profiling support. |
|
- Copyright (C) 1997, 1999, 2005, 2006 Free Software Foundation, Inc. |
|
+ Copyright (C) 1997-2012 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 |
|
@@ -57,7 +57,11 @@ ENTRY(_mcount) |
|
stw r4, 44(r1) |
|
cfi_offset (lr, -4) |
|
stw r5, 8(r1) |
|
+#ifndef SHARED |
|
bl JUMPTARGET(__mcount_internal) |
|
+#else |
|
+ bl __mcount_internal@local |
|
+#endif |
|
/* Restore the registers... */ |
|
lwz r6, 8(r1) |
|
lwz r0, 44(r1) |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From d126b22311ff50e933ac24560a5bee116468d6b3 Mon Sep 17 00:00:00 2001 |
|
From: H.J. Lu <hjl.tools@gmail.com> |
|
Date: Wed, 14 Nov 2012 15:44:40 -0800 |
|
Subject: [PATCH] Skip audit if l_reloc_result is NULL |
|
|
|
Cherry-pick commit 2e64d2659d3edaebc792ac596a9863f1626e5c25 |
|
--- |
|
elf/Makefile | 6 +++++- |
|
elf/dl-runtime.c | 22 +++++++++++++++++++++- |
|
elf/tst-audit8.c | 1 + |
|
3 files changed, 27 insertions(+), 2 deletions(-) |
|
create mode 100644 elf/tst-audit8.c |
|
|
|
diff --git a/elf/Makefile b/elf/Makefile |
|
index 0c26ce5..a621a1c 100644 |
|
--- a/elf/Makefile |
|
+++ b/elf/Makefile |
|
@@ -138,7 +138,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ |
|
tst-dlmodcount tst-dlopenrpath tst-deep1 \ |
|
tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ |
|
unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ |
|
- tst-audit1 tst-audit2 \ |
|
+ 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 |
|
@@ -1024,6 +1024,10 @@ $(objpfx)tst-audit7: $(objpfx)tst-auditmod7a.so |
|
$(objpfx)tst-audit7.out: $(objpfx)tst-auditmod7b.so |
|
tst-audit7-ENV = LD_AUDIT=$(objpfx)tst-auditmod7b.so |
|
|
|
+$(objpfx)tst-audit8: $(common-objpfx)math/libm.so |
|
+$(objpfx)tst-audit8.out: $(objpfx)tst-auditmod1.so |
|
+tst-audit8-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so |
|
+ |
|
$(objpfx)tst-global1: $(libdl) |
|
$(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so |
|
|
|
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c |
|
index fdaa364..009d366 100644 |
|
--- a/elf/dl-runtime.c |
|
+++ b/elf/dl-runtime.c |
|
@@ -1,5 +1,5 @@ |
|
/* On-demand PLT fixup for shared objects. |
|
- Copyright (C) 1995-2009, 2010, 2011 Free Software Foundation, Inc. |
|
+ Copyright (C) 1995-2012 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 |
|
@@ -168,6 +168,26 @@ _dl_profile_fixup ( |
|
{ |
|
void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = INTUSE(_dl_mcount); |
|
|
|
+ if (l->l_reloc_result == NULL) |
|
+ { |
|
+ /* BZ #14843: ELF_DYNAMIC_RELOCATE is called before l_reloc_result |
|
+ is allocated. We will get here if ELF_DYNAMIC_RELOCATE calls a |
|
+ resolver function to resolve an IRELATIVE relocation and that |
|
+ resolver calls a function that is not yet resolved (lazy). For |
|
+ example, the resolver in x86-64 libm.so calls __get_cpu_features |
|
+ defined in libc.so. Skip audit and resolve the external function |
|
+ in this case. */ |
|
+ *framesizep = -1; |
|
+ return _dl_fixup ( |
|
+# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS |
|
+# ifndef ELF_MACHINE_RUNTIME_FIXUP_PARAMS |
|
+# error Please define ELF_MACHINE_RUNTIME_FIXUP_PARAMS. |
|
+# endif |
|
+ ELF_MACHINE_RUNTIME_FIXUP_PARAMS, |
|
+# endif |
|
+ l, reloc_arg); |
|
+ } |
|
+ |
|
/* This is the address in the array where we store the result of previous |
|
relocations. */ |
|
struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index]; |
|
diff --git a/elf/tst-audit8.c b/elf/tst-audit8.c |
|
new file mode 100644 |
|
index 0000000..63656b4 |
|
--- /dev/null |
|
+++ b/elf/tst-audit8.c |
|
@@ -0,0 +1 @@ |
|
+#include "../io/pwd.c" |
|
-- |
|
1.7.2.3 |
|
|
|
|
|
From 914950f767030cf62da1672b9a117b59f5c1da6f Mon Sep 17 00:00:00 2001 |
|
From: Thomas Schwinge <thomas@codesourcery.com> |
|
Date: Tue, 20 Nov 2012 19:29:23 +0100 |
|
Subject: [PATCH] sysdeps/sh/dl-machine.h: Define ELF_MACHINE_RUNTIME_FIXUP_PARAMS. |
|
|
|
Cherry-pick commit d072f3f7724d85ceaf230806660235f0cf2f9c3b |
|
--- |
|
sysdeps/sh/dl-machine.h | 4 ++-- |
|
1 files changed, 2 insertions(+), 2 deletions(-) |
|
|
|
diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h |
|
index 53656af..1bb5d15 100644 |
|
--- a/sysdeps/sh/dl-machine.h |
|
+++ b/sysdeps/sh/dl-machine.h |
|
@@ -1,6 +1,5 @@ |
|
/* Machine-dependent ELF dynamic relocation inline functions. SH version. |
|
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011 |
|
- Free Software Foundation, Inc. |
|
+ Copyright (C) 1999-2012 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 |
|
@@ -116,6 +115,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) |
|
} |
|
|
|
#define ELF_MACHINE_RUNTIME_FIXUP_ARGS int plt_type |
|
+#define ELF_MACHINE_RUNTIME_FIXUP_PARAMS plt_type |
|
|
|
/* Mask identifying addresses reserved for the user program, |
|
where the dynamic linker should not map anything. */ |
|
-- |
|
1.7.2.3 |
|
|
|
|