Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 Nov 2004 21:04:11 -0500
From:      Craig Rodrigues <rodrigc@crodrigues.org>
To:        Vladimir Grebenschikov <vova@fbsd.ru>
Cc:        "current@freebsd.org" <current@freebsd.org>
Subject:   Re: ptrace broken on latest CURRENT ?
Message-ID:  <20041128020411.GA1436@crodrigues.org>
In-Reply-To: <20041128003036.GA883@crodrigues.org>
References:  <1101492325.996.54.camel@localhost> <20041128003036.GA883@crodrigues.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Nov 27, 2004 at 07:30:36PM -0500, Craig Rodrigues wrote:
> --- sys_generic.c.orig	Sat Nov 27 19:14:39 2004
> +++ sys_generic.c	Sat Nov 27 19:17:09 2004
> @@ -503,7 +503,7 @@
>          if ((size > IOCPARM_MAX) ||
>              ((com & (IOC_VOID  | IOC_IN | IOC_OUT)) == 0) ||
>              ((com & IOC_VOID) && size > 0) ||
> -            ((com & (IOC_IN | IOC_OUT)) && size == 0)) {
> +            ((com & IOC_OUT) && size == 0)) {
>                  fdrop(fp, td);
>                  return (ENOTTY);
>          }


Hi,

If we leave the define of PIOCBIS as: 
# define       PIOCBIS _IOC(IOC_IN, 'p', 1, 0)

then the length of this ioctl is going to be 0 (from IOCPARM_LEN).
I'm not sure if that is a good thing.   This is what tripped
up the original ioctl() code in sys_generic.c.

If we don't change sys_generic.c, then the other approach
to this problem is to fix the ioctl() calls in the procfs.
Any comments on this?




Index: sys/fs/procfs/procfs_ioctl.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/procfs/procfs_ioctl.c,v
retrieving revision 1.10
diff -u -r1.10 procfs_ioctl.c
--- sys/fs/procfs/procfs_ioctl.c	7 Dec 2003 17:40:00 -0000	1.10
+++ sys/fs/procfs/procfs_ioctl.c	28 Nov 2004 01:58:38 -0000
@@ -46,8 +46,8 @@
 procfs_ioctl(PFS_IOCTL_ARGS)
 {
 	struct procfs_status *ps;
-	int error, flags, sig;
-
+	int error;
+	unsigned int flags, sig;
 	PROC_LOCK(p);
 	error = 0;
 	switch (cmd) {
Index: sys/sys/pioctl.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/pioctl.h,v
retrieving revision 1.12
diff -u -r1.12 pioctl.h
--- sys/sys/pioctl.h	4 Aug 2002 01:06:58 -0000	1.12
+++ sys/sys/pioctl.h	28 Nov 2004 01:58:40 -0000
@@ -49,12 +49,12 @@
 	unsigned long	val;	/* Any extra data */
 };
 
-# define	PIOCBIS	_IOC(IOC_IN, 'p', 1, 0)	/* Set event flag */
-# define	PIOCBIC	_IOC(IOC_IN, 'p', 2, 0)	/* Clear event flag */
-# define	PIOCSFL	_IOC(IOC_IN, 'p', 3, 0)	/* Set flags */
+# define	PIOCBIS	_IOW('p', 1, unsigned int)	/* Set event flag */
+# define	PIOCBIC	_IOW('p', 2, unsigned int)	/* Clear event flag */
+# define	PIOCSFL	_IOW('p', 3, unsigned int)	/* Set flags */
 			/* wait for proc to stop */
 # define	PIOCWAIT	_IOR('p', 4, struct procfs_status)
-# define	PIOCCONT	_IOC(IOC_IN, 'p', 5, 0)	/* Continue a process */
+# define	PIOCCONT	_IOW('p', 5, unsigned int)	/* Continue a process */
 			/* Get proc status */
 # define	PIOCSTATUS	_IOR('p', 6, struct procfs_status)
 # define	PIOCGFL	_IOR('p', 7, unsigned int)	/* Get flags */
Index: usr.bin/truss/extern.h
===================================================================
RCS file: /home/ncvs/src/usr.bin/truss/extern.h,v
retrieving revision 1.9
diff -u -r1.9 extern.h
--- usr.bin/truss/extern.h	17 Jul 2004 19:19:36 -0000	1.9
+++ usr.bin/truss/extern.h	28 Nov 2004 01:58:40 -0000
@@ -32,7 +32,7 @@
  */
 
 extern int setup_and_wait(char **);
-extern int start_tracing(int, int, int);
+extern int start_tracing(int, unsigned int, int);
 extern void restore_proc(int);
 extern const char *ioctlname(register_t val);
 extern char *strsig(int sig);
Index: usr.bin/truss/main.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/truss/main.c,v
retrieving revision 1.38
diff -u -r1.38 main.c
--- usr.bin/truss/main.c	17 Jul 2004 19:19:36 -0000	1.38
+++ usr.bin/truss/main.c	28 Nov 2004 01:58:42 -0000
@@ -322,7 +322,7 @@
 	break;
       }
     }
-    if (ioctl(Procfd, PIOCCONT, val) == -1) {
+    if (ioctl(Procfd, PIOCCONT, &val) == -1) {
       if (kill(trussinfo->pid, 0) == -1 && errno == ESRCH)
 	break;
       else
Index: usr.bin/truss/setup.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/truss/setup.c,v
retrieving revision 1.19
diff -u -r1.19 setup.c
--- usr.bin/truss/setup.c	7 Jan 2004 14:29:45 -0000	1.19
+++ usr.bin/truss/setup.c	28 Nov 2004 01:58:42 -0000
@@ -54,7 +54,7 @@
 #include "truss.h"
 #include "extern.h"
 
-static int evflags = 0;
+static unsigned int evflags = 0;
 
 /*
  * setup_and_wait() is called to start a process.  All it really does
@@ -69,19 +69,19 @@
   char buf[32];
   int fd;
   int pid;
-  int flags;
+  unsigned int flags;
 
   pid = fork();
   if (pid == -1) {
     err(1, "fork failed");
   }
   if (pid == 0) {	/* Child */
-    int mask = S_EXEC | S_EXIT;
+    unsigned int mask = S_EXEC | S_EXIT;
     fd = open("/proc/curproc/mem", O_WRONLY);
     if (fd == -1)
       err(2, "cannot open /proc/curproc/mem");
     fcntl(fd, F_SETFD, 1);
-    if (ioctl(fd, PIOCBIS, mask) == -1)
+    if (ioctl(fd, PIOCBIS, &mask) == -1)
       err(3, "PIOCBIS");
     flags = PF_LINGER;
     /*
@@ -89,11 +89,11 @@
      * process on last close; normally, this is the behaviour
      * we want.
      */
-    if (ioctl(fd, PIOCSFL, flags) == -1)
+    if (ioctl(fd, PIOCSFL, &flags) == -1)
       warn("cannot set PF_LINGER");
     execvp(command[0], command);
     mask = ~0;
-    ioctl(fd, PIOCBIC, ~0);
+    ioctl(fd, PIOCBIC, &mask);
     err(4, "execvp %s", command[0]);
   }
   /* Only in the parent here */
@@ -128,7 +128,7 @@
  */
 
 int
-start_tracing(int pid, int eventflags, int flags) {
+start_tracing(int pid, unsigned int eventflags, int flags) {
   int fd;
   char buf[32];
   struct procfs_status tmp;
@@ -151,7 +151,7 @@
   }
   evflags = tmp.events;
 
-  if (ioctl(fd, PIOCBIS, eventflags) == -1)
+  if (ioctl(fd, PIOCBIS, &eventflags) == -1)
     err(9, "cannot set procfs event bit mask");
 
   /*
@@ -160,7 +160,7 @@
    * needs to be woken up via procctl.
    */
 
-  if (ioctl(fd, PIOCSFL, flags) == -1)
+  if (ioctl(fd, PIOCSFL, &flags) == -1)
     warn("cannot clear PF_LINGER");
 
   return fd;
@@ -174,9 +174,9 @@
  */
 void
 restore_proc(int signo __unused) {
-
-  ioctl(Procfd, PIOCBIC, ~0);
+  unsigned int flags = ~0;
+  ioctl(Procfd, PIOCBIC, &flags);
   if (evflags)
-    ioctl(Procfd, PIOCBIS, evflags);
+    ioctl(Procfd, PIOCBIS, &evflags);
   exit(0);
 }



-- 
Craig Rodrigues        
http://crodrigues.org
rodrigc@crodrigues.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041128020411.GA1436>