From owner-svn-src-stable@FreeBSD.ORG Wed Jul 10 19:42:08 2013 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 83609F4B; Wed, 10 Jul 2013 19:42:08 +0000 (UTC) (envelope-from trociny@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 5B8EB17A4; Wed, 10 Jul 2013 19:42:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r6AJg8hY060410; Wed, 10 Jul 2013 19:42:08 GMT (envelope-from trociny@svn.freebsd.org) Received: (from trociny@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r6AJg8PH060409; Wed, 10 Jul 2013 19:42:08 GMT (envelope-from trociny@svn.freebsd.org) Message-Id: <201307101942.r6AJg8PH060409@svn.freebsd.org> From: Mikolaj Golub Date: Wed, 10 Jul 2013 19:42:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r253166 - stable/9/lib/libkvm X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Jul 2013 19:42:08 -0000 Author: trociny Date: Wed Jul 10 19:42:07 2013 New Revision: 253166 URL: http://svnweb.freebsd.org/changeset/base/253166 Log: Direct commit to stable branch to fix ABI breakage: In r227839, when removing libkvm dependency on procfs(5), kvm_uread() function, used for reading from /proc/pid/mem, was removed too. This change broke ABI. Bring kvm_uread() back so that the ABI is kept. In head soname is going to be bumped instead. Reported by: rmh Discussed on: arch Suggested by: jilles Modified: stable/9/lib/libkvm/kvm_proc.c Modified: stable/9/lib/libkvm/kvm_proc.c ============================================================================== --- stable/9/lib/libkvm/kvm_proc.c Wed Jul 10 19:15:59 2013 (r253165) +++ stable/9/lib/libkvm/kvm_proc.c Wed Jul 10 19:42:07 2013 (r253166) @@ -712,3 +712,55 @@ kvm_getenvv(kvm_t *kd, const struct kinf { return (kvm_argv(kd, kp, 1, nchr)); } + +/* + * Read from user space. The user context is given by p. + */ +ssize_t +kvm_uread(kvm_t *kd, const struct kinfo_proc *kp, u_long uva, char *buf, + size_t len) +{ + char *cp; + char procfile[MAXPATHLEN]; + ssize_t amount; + int fd; + + if (!ISALIVE(kd)) { + _kvm_err(kd, kd->program, + "cannot read user space from dead kernel"); + return (0); + } + + sprintf(procfile, "/proc/%d/mem", kp->ki_pid); + fd = open(procfile, O_RDONLY, 0); + if (fd < 0) { + _kvm_err(kd, kd->program, "cannot open %s", procfile); + return (0); + } + + cp = buf; + while (len > 0) { + errno = 0; + if (lseek(fd, (off_t)uva, 0) == -1 && errno != 0) { + _kvm_err(kd, kd->program, "invalid address (%lx) in %s", + uva, procfile); + break; + } + amount = read(fd, cp, len); + if (amount < 0) { + _kvm_syserr(kd, kd->program, "error reading %s", + procfile); + break; + } + if (amount == 0) { + _kvm_err(kd, kd->program, "EOF reading %s", procfile); + break; + } + cp += amount; + uva += amount; + len -= amount; + } + + close(fd); + return ((ssize_t)(cp - buf)); +}