On 2020-07-09, Theo de Raadt wrote: > Hang on. Do people ever want to force time calls, outside of ktrace? > I doubt it. Should ktrace maybe have a flag, similar to -B with LD_BIND_NOW, > which sets the new environment variable? Maybe -T? The problem smells very > similar to the root cause for LD_BIND_NOW setting..
So taking into account most feedback, another round. env variable is now _LIBC_NOUSERTC. It's not libc's concern that ktrace may want this, so I didn't go with that. The feature in question is usertc, so that seems the most direct name. Call getenv before issetugid. Added a -T option to ktrace for transparency. I got ambitious here and made it take suboptions, anticipating that other transparency modifications may be desired. Fold in -B perhaps? I think typing -Tt is not so burdensome, and saves us some alphabet down the line. As a bonus, fix ktrace usage. -B only works with second synopsis, with command. Index: lib/libc/dlfcn/init.c =================================================================== RCS file: /home/cvs/src/lib/libc/dlfcn/init.c,v retrieving revision 1.8 diff -u -p -r1.8 init.c --- lib/libc/dlfcn/init.c 6 Jul 2020 13:33:05 -0000 1.8 +++ lib/libc/dlfcn/init.c 10 Jul 2020 02:12:41 -0000 @@ -114,6 +114,8 @@ _libc_preinit(int argc, char **argv, cha _timekeep->tk_version != TK_VERSION) _timekeep = NULL; } + if (getenv("_LIBC_NOUSERTC") && issetugid() == 0) + _timekeep = NULL; break; } } Index: usr.bin/ktrace/extern.h =================================================================== RCS file: /home/cvs/src/usr.bin/ktrace/extern.h,v retrieving revision 1.4 diff -u -p -r1.4 extern.h --- usr.bin/ktrace/extern.h 26 Apr 2018 18:30:36 -0000 1.4 +++ usr.bin/ktrace/extern.h 10 Jul 2020 02:21:37 -0000 @@ -26,3 +26,4 @@ */ int getpoints(const char *, int); +int gettrans(const char *, int); Index: usr.bin/ktrace/ktrace.1 =================================================================== RCS file: /home/cvs/src/usr.bin/ktrace/ktrace.1,v retrieving revision 1.30 diff -u -p -r1.30 ktrace.1 --- usr.bin/ktrace/ktrace.1 15 May 2019 15:36:59 -0000 1.30 +++ usr.bin/ktrace/ktrace.1 10 Jul 2020 02:24:04 -0000 @@ -37,14 +37,15 @@ .Nd enable kernel process tracing .Sh SYNOPSIS .Nm ktrace -.Op Fl aBCcdi +.Op Fl aCcdi .Op Fl f Ar trfile .Op Fl g Ar pgid .Op Fl p Ar pid .Op Fl t Ar trstr .Nm ktrace -.Op Fl adi +.Op Fl aBdi .Op Fl f Ar trfile +.Op Fl T Ar transopts .Op Fl t Ar trstr .Ar command .Sh DESCRIPTION @@ -109,6 +110,15 @@ processes. Enable (disable) tracing on the indicated process ID (only one .Fl p flag is permitted). +.It Fl T Ar transopts +Request additional transparency from libc. +By default, no options are enabled. +The argument can contain one or more of the following letters. +.Pp +.Bl -tag -width flag -offset indent -compact +.It Cm t +Disable userland timecounters so that time related system calls are visible. +.El .It Fl t Ar trstr Select which information to put into the dump file. The argument can contain one or more of the following letters. Index: usr.bin/ktrace/ktrace.c =================================================================== RCS file: /home/cvs/src/usr.bin/ktrace/ktrace.c,v retrieving revision 1.36 diff -u -p -r1.36 ktrace.c --- usr.bin/ktrace/ktrace.c 28 Jun 2019 13:35:01 -0000 1.36 +++ usr.bin/ktrace/ktrace.c 10 Jul 2020 02:23:33 -0000 @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) { enum { NOTSET, CLEAR, CLEARALL } clear; - int append, ch, fd, inherit, ops, pidset, trpoints; + int append, ch, fd, inherit, ops, pidset, trpoints, transparency; pid_t pid; char *tracefile, *tracespec; mode_t omask; @@ -71,6 +71,7 @@ main(int argc, char *argv[]) clear = NOTSET; append = ops = pidset = inherit = pid = 0; trpoints = is_ltrace ? KTRFAC_USER : DEF_POINTS; + transparency = 0; tracefile = DEF_TRACEFILE; tracespec = NULL; @@ -100,7 +101,7 @@ main(int argc, char *argv[]) usage(); } } else { - while ((ch = getopt(argc, argv, "aBCcdf:g:ip:t:")) != -1) + while ((ch = getopt(argc, argv, "aBCcdf:g:ip:t:T:")) != -1) switch ((char)ch) { case 'a': append = 1; @@ -140,6 +141,13 @@ main(int argc, char *argv[]) usage(); } break; + case 'T': + transparency = gettrans(optarg, 0); + if (transparency < 0) { + warnx("unknown facility in %s", optarg); + usage(); + } + break; default: usage(); } @@ -154,6 +162,9 @@ main(int argc, char *argv[]) if (inherit) trpoints |= KTRFAC_INHERIT; + if (transparency && TRANS_TIME) + putenv("_LIBC_NOUSERTC="); + (void)signal(SIGSYS, no_ktrace); if (clear != NOTSET) { if (clear == CLEARALL) { @@ -240,9 +251,9 @@ usage(void) " [-u trspec] command\n", __progname); else - fprintf(stderr, "usage: %s [-aBCcdi] [-f trfile] [-g pgid]" + fprintf(stderr, "usage: %s [-aCcdi] [-f trfile] [-g pgid]" " [-p pid] [-t trstr]\n" - " %s [-adi] [-f trfile] [-t trstr] command\n", + " %s [-aBdi] [-f trfile] [-T transopts] [-t trstr] command\n", __progname, __progname); exit(1); } Index: usr.bin/ktrace/ktrace.h =================================================================== RCS file: /home/cvs/src/usr.bin/ktrace/ktrace.h,v retrieving revision 1.10 diff -u -p -r1.10 ktrace.h --- usr.bin/ktrace/ktrace.h 6 Mar 2016 20:25:27 -0000 1.10 +++ usr.bin/ktrace/ktrace.h 10 Jul 2020 02:18:01 -0000 @@ -38,3 +38,5 @@ #define ALL_POINTS (DEF_POINTS | KTRFAC_EXECENV) #define DEF_TRACEFILE "ktrace.out" + +#define TRANS_TIME 1 Index: usr.bin/ktrace/subr.c =================================================================== RCS file: /home/cvs/src/usr.bin/ktrace/subr.c,v retrieving revision 1.14 diff -u -p -r1.14 subr.c --- usr.bin/ktrace/subr.c 26 Apr 2018 12:42:51 -0000 1.14 +++ usr.bin/ktrace/subr.c 10 Jul 2020 02:15:44 -0000 @@ -86,3 +86,24 @@ getpoints(const char *s, int defpoints) } return (facs); } + +int +gettrans(const char *s, int deftrans) +{ + int trans = 0; + + while (*s) { + switch(*s) { + case 't': + trans |= TRANS_TIME; + break; + case '+': + trans |= deftrans; + break; + default: + return (-1); + } + s++; + } + return (trans); +}