Do not create invalid pointers in C code of string functions.

Some of the x86 string functions create pointers based on input strings
that may be outside of the input strings.  When this happens in C code,
the compiler can potentially detect this, leading to warnings in
application code when those string functions are inlined.  Perform those
operations in the assembly code instead of the C code to fix this.
This commit is contained in:
Torvald Riegel 2015-07-03 20:35:26 +02:00
parent 01964dd663
commit 213a2be7b4
3 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2015-07-07 Torvald Riegel <triegel@redhat.com>
[BZ #18633]
* sysdeps/x86/bits/string.h (__memmove_g): Do not create invalid
pointer in C code.
(__strcat_c): Likewise.
(__strcat_g): Likewise.
2015-07-07 Cyril Hrubis <chrubis@suse.cz>
[BZ #18592]

2
NEWS
View File

@ -25,7 +25,7 @@ Version 2.22
18496, 18497, 18498, 18502, 18507, 18512, 18513, 18519, 18520, 18522,
18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540,
18542, 18544, 18545, 18546, 18547, 18549, 18553, 18558, 18569, 18583,
18585, 18586, 18592, 18593, 18594, 18602, 18612, 18613, 18619.
18585, 18586, 18592, 18593, 18594, 18602, 18612, 18613, 18619, 18633.
* Cache information can be queried via sysconf() function on s390 e.g. with
_SC_LEVEL1_ICACHE_SIZE as argument.

View File

@ -176,13 +176,15 @@ __memmove_g (void *__dest, const void *__src, size_t __n)
"m" ( *(struct { __extension__ char __x[__n]; } *)__src));
else
__asm__ __volatile__
("std\n\t"
("decl %1\n\t"
"decl %2\n\t"
"std\n\t"
"rep; movsb\n\t"
"cld"
: "=&c" (__d0), "=&S" (__d1), "=&D" (__d2),
"=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
: "0" (__n), "1" (__n - 1 + (const char *) __src),
"2" (__n - 1 + (char *) __tmp),
: "0" (__n), "1" (__n + (const char *) __src),
"2" (__n + (char *) __tmp),
"m" ( *(struct { __extension__ char __x[__n]; } *)__src));
return __dest;
}
@ -999,9 +1001,10 @@ __strcat_c (char *__dest, const char __src[], size_t __srclen)
: "cc");
--__tmp;
# else
register char *__tmp = __dest - 1;
register char *__tmp = __dest;
__asm__ __volatile__
("1:\n\t"
("decl %0\n\t"
"1:\n\t"
"incl %0\n\t"
"cmpb $0,(%0)\n\t"
"jne 1b\n"
@ -1020,10 +1023,11 @@ __STRING_INLINE char *__strcat_g (char *__dest, const char *__src);
__STRING_INLINE char *
__strcat_g (char *__dest, const char *__src)
{
register char *__tmp = __dest - 1;
register char *__tmp = __dest;
register char __dummy;
__asm__ __volatile__
("1:\n\t"
("decl %1\n\t"
"1:\n\t"
"incl %1\n\t"
"cmpb $0,(%1)\n\t"
"jne 1b\n"