diff options
Diffstat (limited to 'lib/libc/gen/setproctitle.c')
-rw-r--r-- | lib/libc/gen/setproctitle.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/lib/libc/gen/setproctitle.c b/lib/libc/gen/setproctitle.c index 9dff328..cd705fb 100644 --- a/lib/libc/gen/setproctitle.c +++ b/lib/libc/gen/setproctitle.c @@ -42,10 +42,9 @@ __FBSDID("$FreeBSD$"); * 1: old_ps_strings at the very top of the stack. * 2: old_ps_strings at SPARE_USRSPACE below the top of the stack. * 3: ps_strings at the very top of the stack. - * We only support a kernel providing #3 style ps_strings. - * - * For historical purposes, a definition of the old ps_strings structure - * and location is preserved below: + * This attempts to support a kernel built in the #2 and #3 era. + */ + struct old_ps_strings { char *old_ps_argvstr; int old_ps_nargvstr; @@ -54,7 +53,6 @@ struct old_ps_strings { }; #define OLD_PS_STRINGS ((struct old_ps_strings *) \ (USRSTACK - SPARE_USRSPACE - sizeof(struct old_ps_strings))) - */ #include <stdarg.h> @@ -138,38 +136,41 @@ setproctitle(const char *fmt, ...) ps_strings = (struct ps_strings *)ul_ps_strings; } - /* - * PS_STRINGS points to zeroed memory on a style #2 kernel. - * Should not happen. - */ - if (ps_strings->ps_argvstr == NULL) - return; - - /* style #3 */ - if (oargc == -1) { - /* Record our original args */ - oargc = ps_strings->ps_nargvstr; - oargv = ps_strings->ps_argvstr; - for (i = len = 0; i < oargc; i++) { - /* - * The program may have scribbled into its - * argv array, e.g., to remove some arguments. - * If that has happened, break out before - * trying to call strlen on a NULL pointer. - */ - if (oargv[i] == NULL) { - oargc = i; - break; + /* PS_STRINGS points to zeroed memory on a style #2 kernel */ + if (ps_strings->ps_argvstr) { + /* style #3 */ + if (oargc == -1) { + /* Record our original args */ + oargc = ps_strings->ps_nargvstr; + oargv = ps_strings->ps_argvstr; + for (i = len = 0; i < oargc; i++) { + /* + * The program may have scribbled into its + * argv array, e.g., to remove some arguments. + * If that has happened, break out before + * trying to call strlen on a NULL pointer. + */ + if (oargv[i] == NULL) { + oargc = i; + break; + } + snprintf(obuf + len, SPT_BUFSIZE - len, "%s%s", + len ? " " : "", oargv[i]); + if (len) + len++; + len += strlen(oargv[i]); + if (len >= SPT_BUFSIZE) + break; } - snprintf(obuf + len, SPT_BUFSIZE - len, "%s%s", - len != 0 ? " " : "", oargv[i]); - if (len != 0) - len++; - len += strlen(oargv[i]); - if (len >= SPT_BUFSIZE) - break; } + ps_strings->ps_nargvstr = nargc; + ps_strings->ps_argvstr = nargvp; + } else { + /* style #2 - we can only restore our first arg :-( */ + if (*obuf == '\0') + strncpy(obuf, OLD_PS_STRINGS->old_ps_argvstr, + SPT_BUFSIZE - 1); + OLD_PS_STRINGS->old_ps_nargvstr = 1; + OLD_PS_STRINGS->old_ps_argvstr = nargvp[0]; } - ps_strings->ps_nargvstr = nargc; - ps_strings->ps_argvstr = nargvp; } |