|
From: <sv...@va...> - 2005-08-05 07:46:35
|
Author: tom
Date: 2005-08-05 08:46:32 +0100 (Fri, 05 Aug 2005)
New Revision: 4330
Log:
If the pre-handler for the execve system call fails to state the file
being executed then propagate the error from the stat instead of just
return ENOACCES all the time. Fixes bug #110208.
Modified:
trunk/coregrind/m_debuginfo/symtab.c
trunk/coregrind/m_libcfile.c
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/include/pub_tool_libcfile.h
Modified: trunk/coregrind/m_debuginfo/symtab.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuginfo/symtab.c 2005-08-05 07:32:04 UTC (rev 432=
9)
+++ trunk/coregrind/m_debuginfo/symtab.c 2005-08-05 07:46:32 UTC (rev 433=
0)
@@ -1278,8 +1278,8 @@
line number info out of it. It will be munmapped immediately
thereafter; it is only aboard transiently. */
=20
- i =3D VG_(stat)(si->filename, &stat_buf);
- if (i !=3D 0) {
+ fd =3D VG_(stat)(si->filename, &stat_buf);
+ if (fd.isError) {
ML_(symerr)("Can't stat .so/.exe (to determine its size)?!");
return False;
}
Modified: trunk/coregrind/m_libcfile.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_libcfile.c 2005-08-05 07:32:04 UTC (rev 4329)
+++ trunk/coregrind/m_libcfile.c 2005-08-05 07:46:32 UTC (rev 4330)
@@ -119,10 +119,10 @@
return res.isError ? (-1) : 0;
}
=20
-Int VG_(stat) ( Char* file_name, struct vki_stat* buf )
+SysRes VG_(stat) ( Char* file_name, struct vki_stat* buf )
{
SysRes res =3D VG_(do_syscall2)(__NR_stat, (UWord)file_name, (UWord)b=
uf);
- return res.isError ? (-1) : 0;
+ return res;
}
=20
Int VG_(fstat) ( Int fd, struct vki_stat* buf )
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-generic.c 2005-08-05 07:32:04 UTC (=
rev 4329)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2005-08-05 07:46:32 UTC (=
rev 4330)
@@ -2306,11 +2306,11 @@
exec. */
{
struct vki_stat st;
- Int i =3D VG_(stat)((Char *)ARG1, &st);
+ SysRes r =3D VG_(stat)((Char *)ARG1, &st);
=20
- if (i =3D=3D -1) {
+ if (r.isError) {
/* stat failed */
- SET_STATUS_Failure( VKI_EACCES/*really, we should copy stat's r=
esult*/ );
+ SET_STATUS_from_SysRes( r );
return;
}
/* just look for regular file with any X bit set
Modified: trunk/include/pub_tool_libcfile.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/pub_tool_libcfile.h 2005-08-05 07:32:04 UTC (rev 4329)
+++ trunk/include/pub_tool_libcfile.h 2005-08-05 07:46:32 UTC (rev 4330)
@@ -42,7 +42,7 @@
extern Int VG_(pipe) ( Int fd[2] );
extern OffT VG_(lseek) ( Int fd, OffT offset, Int whence);
=20
-extern Int VG_(stat) ( Char* file_name, struct vki_stat* buf );
+extern SysRes VG_(stat) ( Char* file_name, struct vki_stat* buf );
extern Int VG_(fstat) ( Int fd, struct vki_stat* buf );
extern Int VG_(dup2) ( Int oldfd, Int newfd );
extern Int VG_(rename) ( Char* old_name, Char* new_name );
|