[Bug 810739] Re: strcpy output incorrect if src and dst overlap
Rico Zoss
810739 at bugs.launchpad.net
Fri May 4 20:07:50 UTC 2012
I can confirm this Problem using a old version of gcc for cross
compiling.:
ppc_8xx-gcc (GCC) 4.2.2
Copyright (C) 2007 Free Software Foundation, Inc.
The problem is the parsing of the include paths:
Output of strace:
15791 stat64("/opt/eldk_4.2/ppsr/libusr/lib/gcc/powerpc-linux//includude/c++/4./c++/4.2.2/powerpc-linux", 0xffc9eb00) = -1 ENOENT (No such file or directory)
15791 stat64("/opt/eldk_4.2/ppsr/libusr/lib/gcc/powerpc-linux//includude/c++/4./c++/4.2.2/backward", 0xffc9eb00) = -1 ENOENT (No such file or directory)
As you can see the path was mixed up and therefore the include files
could not be found.
Output of ltrace:
15801 strchr("/opt/eldk_4.2/usr/../ppc_8xx/usr"..., '/') = "/opt/eldk_4.2/usr/../ppc_8xx/usr"...
15801 strchr("opt/eldk_4.2/usr/../ppc_8xx/usr/"..., '/') = "/eldk_4.2/usr/../ppc_8xx/usr/lib"...
15801 strchr("eldk_4.2/usr/../ppc_8xx/usr/lib/"..., '/') = "/usr/../ppc_8xx/usr/lib/gcc/powe"...
15801 strchr("usr/../ppc_8xx/usr/lib/gcc/power"..., '/') = "/../ppc_8xx/usr/lib/gcc/powerpc-"...
15801 strcpy(0x092d87cd, "/ppc_8xx/usr/lib/gcc/powerpc-lin"...) = 0x092d87cd
15801 strchr("/ppsr/libusr/lib/gcc/powerpc-lin"..., '/') = "/ppsr/libusr/lib/gcc/powerpc-lin"...
15801 strchr("ppsr/libusr/lib/gcc/powerpc-linu"..., '/') = "/libusr/lib/gcc/powerpc-linux/./"...
15801 strchr("libusr/lib/gcc/powerpc-linux/./."..., '/') = "/lib/gcc/powerpc-linux/./../../."...
15801 strchr("lib/gcc/powerpc-linux/./../../.."..., '/') = "/gcc/powerpc-linux/./../../../in"...
15801 strchr("gcc/powerpc-linux/./../../../inc"..., '/') = "/powerpc-linux/./../../../includ"...
15801 strchr("powerpc-linux/./../../../include"..., '/') = "/./../../../include/c++/4./c++/4"...
15801 strcpy(0x092d87ef, "/../../../include/c++/4./c++/4.2"...) = 0x092d87ef
15801 strchr("../../includude/c++/4./c++/4.2.2"..., '/') = "/../includude/c++/4./c++/4.2.2/p"...
15801 strcpy(0x092d87f0, "/includude/c++/4./c++/4.2.2/powe"...) = 0x092d87f0
15801 strchr("/includude/c++/4./c++/4.2.2/powe"..., '/') = "/includude/c++/4./c++/4.2.2/powe"...
15801 strchr("includude/c++/4./c++/4.2.2/power"..., '/') = "/c++/4./c++/4.2.2/powerpc-linux"
15801 strchr("c++/4./c++/4.2.2/powerpc-linux", '/') = "/4./c++/4.2.2/powerpc-linux"
15801 strchr("4./c++/4.2.2/powerpc-linux", '/') = "/c++/4.2.2/powerpc-linux"
15801 strchr("c++/4.2.2/powerpc-linux", '/') = "/4.2.2/powerpc-linux"
15801 strchr("4.2.2/powerpc-linux", '/') = "/powerpc-linux"
15801 strchr("powerpc-linux", '/') = NULL
Its obvious that the function strcpy is the source of the problem. The
solution in the comment above solve the problem.
Until today we use natty to compile for ppc. This bug is now popped up
while migrating to precise. That means that this bug does not contain
libc6 (2.13-0ubuntu13.1).
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to eglibc in Ubuntu.
https://bugs.launchpad.net/bugs/810739
Title:
strcpy output incorrect if src and dst overlap
Status in “eglibc” package in Ubuntu:
Confirmed
Bug description:
A commercial application (Cadence) that runs with an older libc gives
incorrect results with the current libc. I've tracked down the
problem to strcpy. If I make my own strcopy, following the template of
https://bugzilla.redhat.com/show_bug.cgi?id=638477#c38, the tool gives
correct results. Here is mystrcpy.c:
$ cat mystrcpy.c
char *strcpy(char *dest, const char *src){
char *destcopy=dest;
while(*dest++ = *src++)
;
return destcopy;
}
I've traced through the application and see that it
is calling strcpy with overlapping source and destination,
and that the execution goes through __strcpy_ssse3,
which seems to cause the problem.
I made a small testcase to replicate the behavior.
Following http://forums.gentoo.org/viewtopic-t-840983-start-0.html,
here is my test case:
------------
$ cat strcopytest.c
char *strcpy(char *,char *);
int main(){
char buf[80];
strcpy(buf, "012345678\n");
strcpy(buf, buf+1);
puts(buf);
return 0;
}
$ gcc -O2 -c mystrcpy.c
$ ld -G mystrcpy.o -o mystrcpy.so
$ gcc strcopytest.c -o strcopytest
$ ./strcopytest
12345688
$ LD_PRELOAD=./mystrcpy.so ./strcopytest
12345678
----------------
I know that I can make my testcase work with #include "string.h",
but the I cannot recompile the commercial application, so that's not
a workable solution.
ProblemType: Bug
DistroRelease: Ubuntu 11.04
Package: libc6 2.13-0ubuntu13
ProcVersionSignature: Ubuntu 2.6.39-3.10-generic 2.6.39
Uname: Linux 2.6.39-3-generic x86_64
Architecture: amd64
Date: Thu Jul 14 13:43:36 2011
InstallationMedia: Ubuntu 10.04 "Lucid Lynx" - Beta amd64 (20100317.1)
ProcEnviron:
LANGUAGE=en_US:en
PATH=(custom, user)
LANG=en_US.UTF-8
SHELL=/bin/bash
SourcePackage: eglibc
UpgradeStatus: Upgraded to natty on 2011-04-29 (76 days ago)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/810739/+subscriptions
More information about the foundations-bugs
mailing list