diff --git a/psutil/arch/netbsd/specific.c b/psutil/arch/netbsd/specific.c index cab60d60..a87008c4 100644 --- a/psutil/arch/netbsd/specific.c +++ b/psutil/arch/netbsd/specific.c @@ -312,42 +312,48 @@ psutil_get_proc_list(kinfo_proc **procList, size_t *procCount) { char * psutil_get_cmd_args(pid_t pid, size_t *argsize) { + int argc; + char *argv; + size_t len; + int st; int mib[4]; - ssize_t st; - size_t argmax; - size_t size; - char *procargs = NULL; mib[0] = CTL_KERN; - mib[1] = KERN_ARGMAX; + mib[1] = KERN_PROC_ARGS; + mib[2] = pid; + mib[3] = KERN_PROC_NARGV; + + len = sizeof(argc); - size = sizeof(argmax); - st = sysctl(mib, 2, &argmax, &size, NULL, 0); + st = sysctl(mib, __arraycount(mib), &argc, &len, NULL, 0); if (st == -1) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - procargs = (char *)malloc(argmax); - if (procargs == NULL) { - PyErr_NoMemory(); + mib[3] = KERN_PROC_ARGV; + len = 0; + + st = sysctl(mib, __arraycount(mib), NULL, &len, NULL, 0); + if (st == -1) { + PyErr_SetFromErrno(PyExc_OSError); return NULL; } - mib[0] = CTL_KERN; - mib[1] = KERN_PROC_ARGS; - mib[2] = pid; - mib[3] = KERN_PROC_ARGV; - - st = sysctl(mib, 4, procargs, &argmax, NULL, 0); + argv = malloc(len); + if (argv == NULL) { + PyErr_NoMemory(); + return NULL; + } + st = sysctl(mib, __arraycount(mib), argv, &len, NULL, 0); if (st == -1) { - free(procargs); + free(argv); PyErr_SetFromErrno(PyExc_OSError); return NULL; } - *argsize = argmax; - return procargs; + *argsize = len; + return argv; }