Author: mmacy
Date: Mon Jun  4 21:17:46 2018
New Revision: 334639
URL: https://svnweb.freebsd.org/changeset/base/334639

Log:
  libpmc: improve arg checking

Modified:
  head/lib/libpmc/libpmc.c

Modified: head/lib/libpmc/libpmc.c
==============================================================================
--- head/lib/libpmc/libpmc.c    Mon Jun  4 21:17:42 2018        (r334638)
+++ head/lib/libpmc/libpmc.c    Mon Jun  4 21:17:46 2018        (r334639)
@@ -37,12 +37,14 @@ __FBSDID("$FreeBSD$");
 
 #include <ctype.h>
 #include <errno.h>
+#include <err.h>
 #include <fcntl.h>
 #include <pmc.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
+#include <sysexits.h>
 #include <unistd.h>
 
 #include "libpmcinternal.h"
@@ -1035,13 +1037,16 @@ pmc_allocate(const char *ctrspec, enum pmc_mode mode,
         */
        r = spec_copy = strdup(ctrspec);
        ctrname = strsep(&r, ",");
-       if (pmc_pmu_pmcallocate(ctrname, &pmc_config) == 0) {
-               if (PMC_CALL(PMCALLOCATE, &pmc_config) < 0) {
+       if (pmc_pmu_enabled()) {
+               if (pmc_pmu_pmcallocate(ctrname, &pmc_config) == 0) {
+                       if (PMC_CALL(PMCALLOCATE, &pmc_config) < 0) {
+                               goto out;
+                       }
+                       retval = 0;
+                       *pmcid = pmc_config.pm_pmcid;
                        goto out;
                }
-               retval = 0;
-               *pmcid = pmc_config.pm_pmcid;
-               goto out;
+               errx(EX_USAGE, "ERROR: pmc_pmu_allocate failed, check for 
ctrname %s\n", ctrname);
        } else {
                free(spec_copy);
                spec_copy = NULL;
@@ -1068,7 +1073,7 @@ pmc_allocate(const char *ctrspec, enum pmc_mode mode,
        ev = NULL;
        for (n = 0; n < PMC_CLASS_TABLE_SIZE; n++) {
                pcd = pmc_class_table[n];
-               if (pmc_mdep_is_compatible_class(pcd->pm_evc_class) &&
+               if (pcd && pmc_mdep_is_compatible_class(pcd->pm_evc_class) &&
                    strncasecmp(ctrname, pcd->pm_evc_name,
                                pcd->pm_evc_name_size) == 0) {
                        if ((ev = pmc_match_event_class(ctrname +
@@ -1086,7 +1091,7 @@ pmc_allocate(const char *ctrspec, enum pmc_mode mode,
         */
        for (n = 0; ev == NULL && n < PMC_CLASS_TABLE_SIZE; n++) {
                pcd = pmc_class_table[n];
-               if (pmc_mdep_is_compatible_class(pcd->pm_evc_class))
+               if (pcd && pmc_mdep_is_compatible_class(pcd->pm_evc_class))
                        ev = pmc_match_event_class(ctrname, pcd);
        }
 
_______________________________________________
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