>From my /var/log/messages:

Jun  1 22:10:25 idefix /bsd: dig(9111): sysctl 2: 1 13 16 0 -32064 32639
Jun  1 22:10:25 idefix /bsd: dig(9111): syscall 202 ""
Jun  1 22:10:57 idefix /bsd: dig(56469): sysctl 2: 1 13 0 0 -129840 32639
Jun  1 22:10:57 idefix /bsd: dig(56469): syscall 202 ""
Jun  1 22:14:03 idefix /bsd: dig(67838): sysctl 2: 1 13 999298946 0 6777188 0
Jun  1 22:14:04 idefix /bsd: dig(67838): syscall 202 ""
Jun  1 22:16:53 idefix /bsd: dig(10121): sysctl 2: 1 13 991450427 0 6777188 0
Jun  1 22:16:54 idefix /bsd: dig(10121): syscall 202 ""

We're printing 5 mibs while the miblen is only 2, hence we see garbage.

Wouldn't it be better to print only this:

Jun  2 22:53:16 idefix /bsd: a.out(37619): sysctl 2: 1 13
Jun  2 22:53:16 idefix /bsd: a.out(37619): syscall 202 ""

We could tweak it to stop after printing 5 mibs, of course. Printing the
miblen could also be omitted, since it is kind of redundant now.

Index: kern_pledge.c
===================================================================
RCS file: /var/cvs/src/sys/kern/kern_pledge.c,v
retrieving revision 1.210
diff -u -p -r1.210 kern_pledge.c
--- kern_pledge.c       30 May 2017 15:04:45 -0000      1.210
+++ kern_pledge.c       2 Jun 2017 20:42:21 -0000
@@ -891,6 +891,8 @@ pledge_sendfd(struct proc *p, struct fil
 int
 pledge_sysctl(struct proc *p, int miblen, int *mib, void *new)
 {
+       int     i;
+
        if ((p->p_p->ps_flags & PS_PLEDGE) == 0)
                return (0);
 
@@ -1053,9 +1055,11 @@ pledge_sysctl(struct proc *p, int miblen
            mib[0] == CTL_VM && mib[1] == VM_LOADAVG)
                return (0);
 
-       printf("%s(%d): sysctl %d: %d %d %d %d %d %d\n",
-           p->p_p->ps_comm, p->p_p->ps_pid, miblen, mib[0], mib[1],
-           mib[2], mib[3], mib[4], mib[5]);
+       printf("%s(%d): sysctl %d:", p->p_p->ps_comm, p->p_p->ps_pid, miblen);
+       for (i = 0; i < miblen; i++)
+               printf(" %d", mib[i]);
+       printf("\n");
+
        return pledge_fail(p, EINVAL, 0);
 }
 

Reply via email to