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.frede...@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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to