Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Jun 2020 18:44:14 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r361844 - head/lib/librtld_db
Message-ID:  <202006051844.055IiE7i003859@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Fri Jun  5 18:44:14 2020
New Revision: 361844
URL: https://svnweb.freebsd.org/changeset/base/361844

Log:
  librtld_db: Handle anonymous mappings below the first file mapping.
  
  r360979 erroneously assumed that the lowest mapping in an address space
  would be a file mapping, but of course this is not true in general.
  
  Reported and tested by:	Frederic Chardon <chardon.frederic@gmail.com>
  MFC after:	3 days

Modified:
  head/lib/librtld_db/rtld_db.c

Modified: head/lib/librtld_db/rtld_db.c
==============================================================================
--- head/lib/librtld_db/rtld_db.c	Fri Jun  5 18:37:04 2020	(r361843)
+++ head/lib/librtld_db/rtld_db.c	Fri Jun  5 18:44:14 2020	(r361844)
@@ -186,11 +186,15 @@ rd_loadobj_iter(rd_agent_t *rdap, rl_iter_f *cb, void 
 		 * file, but we want the mapping offset relative to the base
 		 * mapping.
 		 */
-		if (kve->kve_type == KVME_TYPE_VNODE &&
-		    kve->kve_vn_fileid != fileid) {
-			base = kve->kve_start;
-			fileid = kve->kve_vn_fileid;
-			path = kve->kve_path;
+		if (kve->kve_type == KVME_TYPE_VNODE) {
+			if (kve->kve_vn_fileid != fileid) {
+				base = kve->kve_start;
+				fileid = kve->kve_vn_fileid;
+				path = kve->kve_path;
+			}
+		} else {
+			base = 0;
+			path = NULL;
 		}
 		memset(&rdl, 0, sizeof(rdl));
 		/*
@@ -205,7 +209,8 @@ rd_loadobj_iter(rd_agent_t *rdap, rl_iter_f *cb, void 
 			rdl.rdl_prot |= RD_RDL_W;
 		if (kve->kve_protection & KVME_PROT_EXEC)
 			rdl.rdl_prot |= RD_RDL_X;
-		strlcpy(rdl.rdl_path, path, sizeof(rdl.rdl_path));
+		if (path != NULL)
+			strlcpy(rdl.rdl_path, path, sizeof(rdl.rdl_path));
 		if ((*cb)(&rdl, clnt_data) != 0) {
 			ret = RD_ERR;
 			break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202006051844.055IiE7i003859>