From owner-svn-src-head@FreeBSD.ORG Sun Jan 15 18:51:08 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FC2C1065670; Sun, 15 Jan 2012 18:51:08 +0000 (UTC) (envelope-from trociny@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E564A8FC12; Sun, 15 Jan 2012 18:51:07 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0FIp7sF095392; Sun, 15 Jan 2012 18:51:07 GMT (envelope-from trociny@svn.freebsd.org) Received: (from trociny@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0FIp7GC095390; Sun, 15 Jan 2012 18:51:07 GMT (envelope-from trociny@svn.freebsd.org) Message-Id: <201201151851.q0FIp7GC095390@svn.freebsd.org> From: Mikolaj Golub Date: Sun, 15 Jan 2012 18:51:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230146 - head/lib/libkvm X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Jan 2012 18:51:08 -0000 Author: trociny Date: Sun Jan 15 18:51:07 2012 New Revision: 230146 URL: http://svn.freebsd.org/changeset/base/230146 Log: In kvm_argv(), the case when the supplied buffer was too short to hold the requested value was handled incorrectly, and the function retuned NULL instead of the truncated result. Fix this and also remove unnecessary check for buf != NULL, which alway retuns true. MFC after: 3 days Modified: head/lib/libkvm/kvm_proc.c Modified: head/lib/libkvm/kvm_proc.c ============================================================================== --- head/lib/libkvm/kvm_proc.c Sun Jan 15 18:47:24 2012 (r230145) +++ head/lib/libkvm/kvm_proc.c Sun Jan 15 18:51:07 2012 (r230146) @@ -658,30 +658,38 @@ kvm_argv(kvm_t *kd, const struct kinfo_p buflen = nchr; } } - if (buf != NULL) { - oid[0] = CTL_KERN; - oid[1] = KERN_PROC; - oid[2] = env ? KERN_PROC_ENV : KERN_PROC_ARGS; - oid[3] = kp->ki_pid; - bufsz = buflen; - i = sysctl(oid, 4, buf, &bufsz, 0, 0); - if (i == 0 && bufsz > 0) { - i = 0; - p = buf; - do { - bufp[i++] = p; - p += strlen(p) + 1; - if (i >= argc) { - argc += argc; - bufp = realloc(bufp, - sizeof(char *) * argc); - } - } while (p < buf + bufsz); - bufp[i++] = 0; - return (bufp); - } + oid[0] = CTL_KERN; + oid[1] = KERN_PROC; + oid[2] = env ? KERN_PROC_ENV : KERN_PROC_ARGS; + oid[3] = kp->ki_pid; + bufsz = buflen; + if (sysctl(oid, 4, buf, &bufsz, 0, 0) == -1) { + /* + * If the supplied buf is too short to hold the requested + * value the sysctl returns with ENOMEM. The buf is filled + * with the truncated value and the returned bufsz is equal + * to the requested len. + */ + if (errno != ENOMEM || bufsz != (size_t)buflen) + return (0); + buf[bufsz - 1] = '\0'; + errno = 0; + } else if (bufsz == 0) { + return (0); } - return (NULL); + i = 0; + p = buf; + do { + bufp[i++] = p; + p += strlen(p) + 1; + if (i >= argc) { + argc += argc; + bufp = realloc(bufp, + sizeof(char *) * argc); + } + } while (p < buf + bufsz); + bufp[i++] = 0; + return (bufp); } char **