|
From: <sv...@va...> - 2005-12-18 03:22:56
|
Author: sewardj
Date: 2005-12-18 03:22:50 +0000 (Sun, 18 Dec 2005)
New Revision: 5368
Log:
Increase buffer size, so that long debugger command lines don't crash
V. Also add buffer overrun checks.
Modified:
trunk/coregrind/m_debugger.c
Modified: trunk/coregrind/m_debugger.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_debugger.c 2005-12-18 02:48:40 UTC (rev 5367)
+++ trunk/coregrind/m_debugger.c 2005-12-18 03:22:50 UTC (rev 5368)
@@ -146,9 +146,10 @@
continue, quit the debugger. */
void VG_(start_debugger) ( ThreadId tid )
{
- Int pid;
+# define N_BUF 4096
+ Int pid;
=20
- if ((pid =3D VG_(fork)()) =3D=3D 0) {
+ if ((pid =3D VG_(fork)()) =3D=3D 0) {
VG_(ptrace)(VKI_PTRACE_TRACEME, 0, NULL, NULL);
VG_(kill)(VG_(getpid)(), VKI_SIGSTOP);
=20
@@ -163,8 +164,8 @@
VG_(ptrace)(VKI_PTRACE_DETACH, pid, NULL, 0) =3D=3D 0)
{
Char pidbuf[15];
- Char file[30];
- Char buf[100];
+ Char file[50];
+ Char buf[N_BUF];
Char *bufptr;
Char *cmdptr;
=20
@@ -175,6 +176,10 @@
cmdptr =3D VG_(clo_db_command);
=20
while (*cmdptr) {
+ /* each iteration can advance bufptr by at most the length
+ of file[], so the following assertion is generously
+ over-paranoid. */
+ vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/);
switch (*cmdptr) {
case '%':
switch (*++cmdptr) {
@@ -183,20 +188,21 @@
bufptr +=3D VG_(strlen)(file);
cmdptr++;
break;
- case 'p':
- VG_(memcpy)(bufptr, pidbuf, VG_(strlen)(pidbuf));
- bufptr +=3D VG_(strlen)(pidbuf);
- cmdptr++;
- break;
- default:
- *bufptr++ =3D *cmdptr++;
- break;
+ case 'p':
+ VG_(memcpy)(bufptr, pidbuf, VG_(strlen)(pidbuf))=
;
+ bufptr +=3D VG_(strlen)(pidbuf);
+ cmdptr++;
+ break;
+ default:
+ *bufptr++ =3D *cmdptr++;
+ break;
}
break;
default:
*bufptr++ =3D *cmdptr++;
break;
}
+ vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/);
}
=20
*bufptr++ =3D '\0';
@@ -216,6 +222,7 @@
VG_(kill)(pid, VKI_SIGKILL);
VG_(waitpid)(pid, &status, 0);
}
+# undef N_BUF
}
=20
=20
|