Author: markj
Date: Sun Jan 25 00:34:43 2015
New Revision: 277667
URL: https://svnweb.freebsd.org/changeset/base/277667

Log:
  Ensure that we don't try to demangle a symbol name if we failed to look
  up the symbol. Add a test to exercise this code path.
  
  Reviewed by:  adrian

Modified:
  head/lib/libproc/proc_sym.c
  head/lib/libproc/tests/proc_test.c

Modified: head/lib/libproc/proc_sym.c
==============================================================================
--- head/lib/libproc/proc_sym.c Sun Jan 25 00:32:17 2015        (r277666)
+++ head/lib/libproc/proc_sym.c Sun Jan 25 00:34:43 2015        (r277667)
@@ -335,8 +335,8 @@ proc_addr2sym(struct proc_handle *p, uin
                goto out;
 
        error = lookup_addr(e, symtabscn, symtabstridx, off, addr, &s, symcopy);
-       if (error == 0)
-               goto out;
+       if (error != 0)
+               goto err2;
 
 out:
        demangle(s, name, namesz);

Modified: head/lib/libproc/tests/proc_test.c
==============================================================================
--- head/lib/libproc/tests/proc_test.c  Sun Jan 25 00:32:17 2015        
(r277666)
+++ head/lib/libproc/tests/proc_test.c  Sun Jan 25 00:34:43 2015        
(r277667)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2014 Mark Johnston <ma...@freebsd.org>
+ * Copyright (c) 2014, 2015 Mark Johnston <ma...@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -295,6 +295,43 @@ ATF_TC_BODY(symbol_lookup, tc)
        proc_free(phdl);
 }
 
+ATF_TC(symbol_lookup_fail);
+ATF_TC_HEAD(symbol_lookup_fail, tc)
+{
+       atf_tc_set_md_var(tc, "descr",
+           "Verify that proc_addr2sym() returns an error when given an offset "
+           "that it cannot resolve.");
+}
+ATF_TC_BODY(symbol_lookup_fail, tc)
+{
+       char symname[32];
+       GElf_Sym sym;
+       struct proc_handle *phdl;
+       prmap_t *map;
+       int error;
+
+       phdl = start_prog(tc, false);
+
+       /* Initialize the rtld_db handle. */
+       (void)proc_rdagent(phdl);
+
+       map = proc_obj2map(phdl, target_prog_file);
+       ATF_REQUIRE_MSG(map != NULL, "failed to look up map for '%s'",
+           target_prog_file);
+
+       /*
+        * We shouldn't be able to find symbols at the beginning of a mapped
+        * file.
+        */
+       error = proc_addr2sym(phdl, map->pr_vaddr, symname, sizeof(symname),
+           &sym);
+       ATF_REQUIRE_MSG(error != 0, "unexpectedly found a symbol");
+
+       ATF_CHECK_EQ_MSG(proc_continue(phdl), 0, "failed to resume execution");
+
+       proc_free(phdl);
+}
+
 ATF_TC(signal_forward);
 ATF_TC_HEAD(signal_forward, tc)
 {
@@ -343,6 +380,7 @@ ATF_TP_ADD_TCS(tp)
        ATF_TP_ADD_TC(tp, map_alias_name2map);
        ATF_TP_ADD_TC(tp, map_alias_name2sym);
        ATF_TP_ADD_TC(tp, symbol_lookup);
+       ATF_TP_ADD_TC(tp, symbol_lookup_fail);
        ATF_TP_ADD_TC(tp, signal_forward);
 
        return (atf_no_error());
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to