--- src/lib/libkvm/kvm.c 2007/04/29 01:36:04 1.10 +++ src/lib/libkvm/kvm.c 2007/12/03 14:42:45 1.11 @@ -167,6 +167,11 @@ _kvm_open(kvm_t *kd, const char *uf, con _kvm_syserr(kd, kd->program, "%s", mf); goto failed; } + 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; @@ -180,10 +185,6 @@ _kvm_open(kvm_t *kd, const char *uf, con */ if (strcmp(mf, _PATH_DEVNULL) == 0) { kd->vmfd = open(_PATH_DEVNULL, O_RDONLY); - } else if (strcmp(mf, _PATH_MEM) != 0) { - _kvm_err(kd, kd->program, - "%s: not physical memory device", mf); - goto failed; } else { if ((kd->vmfd = open(_PATH_KMEM, flag)) < 0) { _kvm_syserr(kd, kd->program, "%s", _PATH_KMEM); @@ -458,7 +459,7 @@ kvm_readstr(kvm_t *kd, u_long kva, char return NULL; } } - cc = read(kd->vmfd, &ch, 1); + cc = read(kd->pmfd, &ch, 1); if ((ssize_t)cc < 0) { _kvm_syserr(kd, 0, "kvm_readstr"); return NULL;