From owner-svn-src-head@freebsd.org Fri Apr 22 18:05:37 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0A60CB19E15; Fri, 22 Apr 2016 18:05:37 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id BEBFA1E4F; Fri, 22 Apr 2016 18:05:36 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u3MI5Znw021928; Fri, 22 Apr 2016 18:05:35 GMT (envelope-from ngie@FreeBSD.org) Received: (from ngie@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u3MI5Ypw021918; Fri, 22 Apr 2016 18:05:34 GMT (envelope-from ngie@FreeBSD.org) Message-Id: <201604221805.u3MI5Ypw021918@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ngie set sender to ngie@FreeBSD.org using -f From: Garrett Cooper Date: Fri, 22 Apr 2016 18:05:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r298485 - head/lib/libkvm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.21 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: Fri, 22 Apr 2016 18:05:37 -0000 Author: ngie Date: Fri Apr 22 18:05:34 2016 New Revision: 298485 URL: https://svnweb.freebsd.org/changeset/base/298485 Log: Fix up pointer issues with lib/libkvm In particular, - avoid dereferencing NULL pointers - test pointers against NULL, not 0 - test for errout == NULL in the top-level functions (kvm_open, kvm_openfiles, kvm_open2, etc) - Replace a realloc and free on failure with reallocf Found with: devel/cocchinelle Differential Revision: https://reviews.freebsd.org/D5954 MFC after: 1 week Reviewed by: jhb Sponsored by: EMC / Isilon Storage Division Modified: head/lib/libkvm/kvm.c head/lib/libkvm/kvm_amd64.c head/lib/libkvm/kvm_arm.c head/lib/libkvm/kvm_i386.c head/lib/libkvm/kvm_minidump_aarch64.c head/lib/libkvm/kvm_minidump_amd64.c head/lib/libkvm/kvm_minidump_arm.c head/lib/libkvm/kvm_minidump_i386.c head/lib/libkvm/kvm_minidump_mips.c head/lib/libkvm/kvm_proc.c Modified: head/lib/libkvm/kvm.c ============================================================================== --- head/lib/libkvm/kvm.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm.c Fri Apr 22 18:05:34 2016 (r298485) @@ -379,12 +379,12 @@ _kvm_open(kvm_t *kd, const char *uf, con kd->vmfd = -1; kd->pmfd = -1; kd->nlfd = -1; - kd->vmst = 0; - kd->procbase = 0; - kd->argspc = 0; - kd->argv = 0; + kd->vmst = NULL; + kd->procbase = NULL; + kd->argspc = NULL; + kd->argv = NULL; - if (uf == 0) + if (uf == NULL) uf = getbootfile(); else if (strlen(uf) >= MAXPATHLEN) { _kvm_err(kd, kd->program, "exec file name too long"); @@ -394,7 +394,7 @@ _kvm_open(kvm_t *kd, const char *uf, con _kvm_err(kd, kd->program, "bad flags arg"); goto failed; } - if (mf == 0) + if (mf == NULL) mf = _PATH_MEM; if ((kd->pmfd = open(mf, flag | O_CLOEXEC, 0)) < 0) { @@ -471,7 +471,7 @@ failed: /* * Copy out the error if doing sane error semantics. */ - if (errout != 0) + if (errout != NULL) strlcpy(errout, kd->errbuf, _POSIX2_LINE_MAX); (void)kvm_close(kd); return (0); @@ -484,7 +484,9 @@ kvm_openfiles(const char *uf, const char kvm_t *kd; if ((kd = calloc(1, sizeof(*kd))) == NULL) { - (void)strlcpy(errout, strerror(errno), _POSIX2_LINE_MAX); + if (errout != NULL) + (void)strlcpy(errout, strerror(errno), + _POSIX2_LINE_MAX); return (0); } return (_kvm_open(kd, uf, mf, flag, errout)); @@ -513,7 +515,9 @@ kvm_open2(const char *uf, const char *mf kvm_t *kd; if ((kd = calloc(1, sizeof(*kd))) == NULL) { - (void)strlcpy(errout, strerror(errno), _POSIX2_LINE_MAX); + if (errout != NULL) + (void)strlcpy(errout, strerror(errno), + _POSIX2_LINE_MAX); return (0); } kd->resolve_symbol = resolver; Modified: head/lib/libkvm/kvm_amd64.c ============================================================================== --- head/lib/libkvm/kvm_amd64.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_amd64.c Fri Apr 22 18:05:34 2016 (r298485) @@ -118,7 +118,7 @@ _amd64_initvtop(kvm_t *kd) amd64_pml4e_t *PML4; kd->vmst = (struct vmstate *)_kvm_malloc(kd, sizeof(*kd->vmst)); - if (kd->vmst == 0) { + if (kd->vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } @@ -153,6 +153,10 @@ _amd64_initvtop(kvm_t *kd) } pa = le64toh(pa); PML4 = _kvm_malloc(kd, AMD64_PAGE_SIZE); + if (PML4 == NULL) { + _kvm_err(kd, kd->program, "cannot allocate PML4"); + return (-1); + } if (kvm_read2(kd, pa, PML4, AMD64_PAGE_SIZE) != AMD64_PAGE_SIZE) { _kvm_err(kd, kd->program, "cannot read KPML4phys"); return (-1); @@ -188,7 +192,7 @@ _amd64_vatop(kvm_t *kd, kvaddr_t va, off * If we are initializing (kernel page table descriptor pointer * not yet set) then return pa == va to avoid infinite recursion. */ - if (vm->PML4 == 0) { + if (vm->PML4 == NULL) { s = _kvm_pa2off(kd, va, pa); if (s == 0) { _kvm_err(kd, kd->program, Modified: head/lib/libkvm/kvm_arm.c ============================================================================== --- head/lib/libkvm/kvm_arm.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_arm.c Fri Apr 22 18:05:34 2016 (r298485) @@ -117,7 +117,7 @@ _arm_initvtop(kvm_t *kd) } vm = _kvm_malloc(kd, sizeof(*vm)); - if (vm == 0) { + if (vm == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } @@ -168,6 +168,10 @@ _arm_initvtop(kvm_t *kd) return (-1); } l1pt = _kvm_malloc(kd, ARM_L1_TABLE_SIZE); + if (l1pt == NULL) { + _kvm_err(kd, kd->program, "cannot allocate l1pt"); + return (-1); + } if (kvm_read2(kd, pa, l1pt, ARM_L1_TABLE_SIZE) != ARM_L1_TABLE_SIZE) { _kvm_err(kd, kd->program, "cannot read l1pt"); free(l1pt); Modified: head/lib/libkvm/kvm_i386.c ============================================================================== --- head/lib/libkvm/kvm_i386.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_i386.c Fri Apr 22 18:05:34 2016 (r298485) @@ -162,6 +162,10 @@ _i386_initvtop(kvm_t *kd) } pa = le32toh(pa); PTD = _kvm_malloc(kd, 4 * I386_PAGE_SIZE); + if (PTD == NULL) { + _kvm_err(kd, kd->program, "cannot allocate PTD"); + return (-1); + } for (i = 0; i < 4; i++) { if (kvm_read2(kd, pa + (i * sizeof(pa64)), &pa64, sizeof(pa64)) != sizeof(pa64)) { @@ -195,6 +199,10 @@ _i386_initvtop(kvm_t *kd) } pa = le32toh(pa); PTD = _kvm_malloc(kd, I386_PAGE_SIZE); + if (PTD == NULL) { + _kvm_err(kd, kd->program, "cannot allocate PTD"); + return (-1); + } if (kvm_read2(kd, pa, PTD, I386_PAGE_SIZE) != I386_PAGE_SIZE) { _kvm_err(kd, kd->program, "cannot read PTD"); return (-1); @@ -228,7 +236,7 @@ _i386_vatop(kvm_t *kd, kvaddr_t va, off_ * If we are initializing (kernel page table descriptor pointer * not yet set) then return pa == va to avoid infinite recursion. */ - if (PTD == 0) { + if (PTD == NULL) { s = _kvm_pa2off(kd, va, pa); if (s == 0) { _kvm_err(kd, kd->program, @@ -318,7 +326,7 @@ _i386_vatop_pae(kvm_t *kd, kvaddr_t va, * If we are initializing (kernel page table descriptor pointer * not yet set) then return pa == va to avoid infinite recursion. */ - if (PTD == 0) { + if (PTD == NULL) { s = _kvm_pa2off(kd, va, pa); if (s == 0) { _kvm_err(kd, kd->program, Modified: head/lib/libkvm/kvm_minidump_aarch64.c ============================================================================== --- head/lib/libkvm/kvm_minidump_aarch64.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_minidump_aarch64.c Fri Apr 22 18:05:34 2016 (r298485) @@ -81,7 +81,7 @@ _aarch64_minidump_initvtop(kvm_t *kd) off_t off; vmst = _kvm_malloc(kd, sizeof(*vmst)); - if (vmst == 0) { + if (vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } Modified: head/lib/libkvm/kvm_minidump_amd64.c ============================================================================== --- head/lib/libkvm/kvm_minidump_amd64.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_minidump_amd64.c Fri Apr 22 18:05:34 2016 (r298485) @@ -81,7 +81,7 @@ _amd64_minidump_initvtop(kvm_t *kd) off_t off; vmst = _kvm_malloc(kd, sizeof(*vmst)); - if (vmst == 0) { + if (vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } Modified: head/lib/libkvm/kvm_minidump_arm.c ============================================================================== --- head/lib/libkvm/kvm_minidump_arm.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_minidump_arm.c Fri Apr 22 18:05:34 2016 (r298485) @@ -84,7 +84,7 @@ _arm_minidump_initvtop(kvm_t *kd) off_t off; vmst = _kvm_malloc(kd, sizeof(*vmst)); - if (vmst == 0) { + if (vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } Modified: head/lib/libkvm/kvm_minidump_i386.c ============================================================================== --- head/lib/libkvm/kvm_minidump_i386.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_minidump_i386.c Fri Apr 22 18:05:34 2016 (r298485) @@ -81,7 +81,7 @@ _i386_minidump_initvtop(kvm_t *kd) off_t off; vmst = _kvm_malloc(kd, sizeof(*vmst)); - if (vmst == 0) { + if (vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } Modified: head/lib/libkvm/kvm_minidump_mips.c ============================================================================== --- head/lib/libkvm/kvm_minidump_mips.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_minidump_mips.c Fri Apr 22 18:05:34 2016 (r298485) @@ -89,7 +89,7 @@ _mips_minidump_initvtop(kvm_t *kd) off_t off; vmst = _kvm_malloc(kd, sizeof(*vmst)); - if (vmst == 0) { + if (vmst == NULL) { _kvm_err(kd, kd->program, "cannot allocate vm"); return (-1); } Modified: head/lib/libkvm/kvm_proc.c ============================================================================== --- head/lib/libkvm/kvm_proc.c Fri Apr 22 17:51:19 2016 (r298484) +++ head/lib/libkvm/kvm_proc.c Fri Apr 22 18:05:34 2016 (r298485) @@ -544,7 +544,7 @@ kvm_getprocs(kvm_t *kd, int op, int arg, size += size / 10; kd->procbase = (struct kinfo_proc *) _kvm_realloc(kd, kd->procbase, size); - if (kd->procbase == 0) + if (kd->procbase == NULL) return (0); osize = size; st = sysctl(mib, temp_op == KERN_PROC_ALL || @@ -614,7 +614,7 @@ liveout: } size = nprocs * sizeof(struct kinfo_proc); kd->procbase = (struct kinfo_proc *)_kvm_malloc(kd, size); - if (kd->procbase == 0) + if (kd->procbase == NULL) return (0); nprocs = kvm_deadprocs(kd, op, arg, nl[1].n_value, @@ -637,21 +637,19 @@ liveout: void _kvm_freeprocs(kvm_t *kd) { - if (kd->procbase) { - free(kd->procbase); - kd->procbase = 0; - } + + free(kd->procbase); + kd->procbase = NULL; } void * _kvm_realloc(kvm_t *kd, void *p, size_t n) { - void *np = (void *)realloc(p, n); + void *np; - if (np == 0) { - free(p); + np = reallocf(p, n); + if (np == NULL) _kvm_err(kd, kd->program, "out of memory"); - } return (np); } @@ -672,7 +670,7 @@ kvm_argv(kvm_t *kd, const struct kinfo_p if (!ISALIVE(kd)) { _kvm_err(kd, kd->program, "cannot read user space from dead kernel"); - return (0); + return (NULL); } if (nchr == 0 || nchr > ARG_MAX) @@ -681,7 +679,7 @@ kvm_argv(kvm_t *kd, const struct kinfo_p buf = malloc(nchr); if (buf == NULL) { _kvm_err(kd, kd->program, "cannot allocate memory"); - return (0); + return (NULL); } buflen = nchr; argc = 32; @@ -706,12 +704,11 @@ kvm_argv(kvm_t *kd, const struct kinfo_p * to the requested len. */ if (errno != ENOMEM || bufsz != (size_t)buflen) - return (0); + return (NULL); buf[bufsz - 1] = '\0'; errno = 0; - } else if (bufsz == 0) { - return (0); - } + } else if (bufsz == 0) + return (NULL); i = 0; p = buf; do {