Date: Fri, 6 Jan 2006 18:34:56 GMT From: "Wojciech A. Koszek" <dunstan@freebsd.czest.pl> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/91411: [PATCH] kvm(3) should handle empty files properly Message-ID: <200601061834.k06IYtLd061061@freebsd.czest.pl> Resent-Message-ID: <200601061840.k06Ie4nI012579@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 91411 >Category: bin >Synopsis: [PATCH] kvm(3) should handle empty files properly >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Jan 06 18:40:04 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Wojciech A. Koszek >Release: FreeBSD 7.0-CURRENT i386 >Organization: >Environment: System: FreeBSD dunstan.freebsd.czest.pl 7.0-CURRENT FreeBSD 7.0-CURRENT #4: Mon Jan 2 21:27:11 CET 2006 root@dunstan.freebsd.czest.pl:/usr/obj/usr/src/sys/LAPTOP i386 >Description: Right now you will get segmentation fault with almost every application linked with kvm(3) if the file which name was passed in kvm_open.. has 0 bytes: root@dunstan:(/usr/src/lib/libkvm)# touch /tmp/Zzz root@dunstan:(/usr/src/lib/libkvm)# ps -M /tmp/Zzz zsh: segmentation fault ps -M /tmp/Zzz Besides ps(1), every program tries to properly handle error value returned from kvm_open*, which should be NULL (and this behaviour is documented in manual page). >How-To-Repeat: root@dunstan:(/usr/src/lib/libkvm)# touch /tmp/Zzz root@dunstan:(/usr/src/lib/libkvm)# ps -M /tmp/Zzz zsh: segmentation fault ps -M /tmp/Zzz >Fix: Patch is here: http://freebsd.czest.pl/dunstan/FreeBSD/libkvm.0.patch --- libkvm.0.patch begins here --- (c) 2006 Wojciech A. Koszek <dunstan%FreeBSD.czest.pl> Patch against FreeBSD 7.0-CURRENT, kern.osreldate: 700011. diff --exclude=CVS -upr /usr/src/bin/ps/ps.c src/bin/ps/ps.c --- /usr/src/bin/ps/ps.c Wed Feb 9 18:37:38 2005 +++ src/bin/ps/ps.c Wed Jan 4 23:00:47 2006 @@ -432,7 +432,7 @@ main(int argc, char *argv[]) xkeep = xkeep_implied; kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); - if (kd == 0) + if (kd == NULL) errx(1, "%s", errbuf); if (!_fmt) diff --exclude=CVS -upr /usr/src/lib/libkvm/kvm.c src/lib/libkvm/kvm.c --- /usr/src/lib/libkvm/kvm.c Tue Jul 19 16:48:58 2005 +++ src/lib/libkvm/kvm.c Wed Jan 4 22:59:11 2006 @@ -179,6 +179,15 @@ _kvm_open(kd, uf, mf, flag, errout) _kvm_syserr(kd, kd->program, "%s", mf); goto failed; } + /* + * Disallow access to 0-length files, since further initialization + * will cause segmentation fault. + */ + if (S_ISREG(st.st_mode) && st.st_size <= 0) { + errno = EINVAL; + _kvm_syserr(kd, kd->program, "empty file"); + goto failed; + } if (fcntl(kd->pmfd, F_SETFD, FD_CLOEXEC) < 0) { _kvm_syserr(kd, kd->program, "%s", mf); goto failed; @@ -225,10 +234,10 @@ 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); + return (NULL); } kvm_t * --- libkvm.0.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601061834.k06IYtLd061061>
