Subject: Re: NetBSD/systrace error: EINVAL
To: Kristaps Johnson <kristaps@gradient-enterprises.com>
From: Seth Kurtzberg <seth@cql.com>
List: tech-misc
Date: 07/03/2006 18:24:59
I don't see a check of the return value of the open() call. Could it be -1 (invalid)?
On Mon, 3 Jul 2006 17:52:08 -0400 (EDT)
Kristaps Johnson <kristaps@gradient-enterprises.com> wrote:
>
> Hello all!
>
> I wonder if somebody can help me with a strange error I receive under
> systrace on NetBSD. I've included a sample programme below with
> error-checking stripped in non-applicable areas. The "sys/systrace.h"
> header file is current from CVS. Overall system NetBSD 3.0, GENERIC. I'm
> trying to port sysjail (sysjail.bsd.lv) to NetBSD and this is keeping me
> hard up. Suggestions?
>
> Note that this works fine with the OpenBSD systrace (3.9), which adds to
> the mystification.
>
> The "strange error" is EINVAL: Invalid argument.
>
> The below is run as "./a.out 5123", where 5123 is a process doing things (I
> have a script looping echo -n '.').
>
>
> #include <sys/ioctl.h>
> #include <sys/param.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #ifdef __NetBSD__
> # include <sys/systrace.h>
> #elif __OpenBSD__
> # include <dev/systrace.h>
> #endif
>
> #include <err.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <poll.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <unistd.h>
>
> int
> main(int argc, const char *argv[])
> {
> struct str_message msg;
> struct systrace_policy pol;
> struct pollfd pfd;
> int fd, ofd;
> pid_t cpid;
>
> cpid = atoi(argv[1]);
>
> ofd = open("/dev/systrace", O_RDWR | O_NONBLOCK, 0);
> #ifdef __OpenBSD__
> ioctl(ofd, STRIOCCLONE, &fd);
> close(ofd);
> #elif __NetBSD__
> fd = ofd;
> #endif
> fcntl(fd, F_SETFD, FD_CLOEXEC);
>
> memset(&pol, 0, sizeof(pol));
> pol.strp_op = SYSTR_POLICY_NEW;
> pol.strp_num = -1;
> pol.strp_maxents = 512;
>
> ioctl(fd, STRIOCPOLICY, &pol);
> ioctl(fd, STRIOCATTACH, &cpid);
>
> memset(&pfd, 0, sizeof(pfd));
> pfd.fd = fd;
> pfd.events = POLLIN;
>
> poll(&pfd, 1, -1);
>
> /* RETURNS AN ERROR:
> * read: /dev/systrace: Invalid argument */
> if (read(fd, &msg, sizeof(struct str_message))
> != sizeof(struct str_message)) {
> err(1, "read: /dev/systrace");
> }
>
> return(0);
> }
>
>