Make code compile when basename() is POSIX compliant.

The POSIX basename() function is allowed to modify its input buffer,
which means its argument is "char *". Pull a copy of the input string
before computing the base.

Reviewed by:	jtl
Differential Revision:	https://reviews.freebsd.org/D6465
This commit is contained in:
ed 2016-05-25 08:45:03 +00:00
parent 351a56086c
commit f826cc44bc

View File

@ -310,8 +310,9 @@ pmcstat_callgraph_do_gmon_arcs(void)
void
pmcpl_gmon_initimage(struct pmcstat_image *pi)
{
const char *execpath;
int count, nlen;
char *sn;
char *sn, *snbuf;
char name[NAME_MAX];
/*
@ -321,9 +322,11 @@ pmcpl_gmon_initimage(struct pmcstat_image *pi)
* `basename(path)`+ "~" + NNN + ".gmon" till we get a free
* entry.
*/
if ((sn = basename(pmcstat_string_unintern(pi->pi_execpath))) == NULL)
err(EX_OSERR, "ERROR: Cannot process \"%s\"",
pmcstat_string_unintern(pi->pi_execpath));
execpath = pmcstat_string_unintern(pi->pi_execpath);
if ((snbuf = strdup(execpath)) == NULL)
err(EX_OSERR, "ERROR: Cannot copy \"%s\"", execpath);
if ((sn = basename(snbuf)) == NULL)
err(EX_OSERR, "ERROR: Cannot process \"%s\"", execpath);
nlen = strlen(sn);
nlen = min(nlen, (int) (sizeof(name) - sizeof(".gmon")));
@ -355,6 +358,7 @@ pmcpl_gmon_initimage(struct pmcstat_image *pi)
}
} while (count > 0);
}
free(snbuf);
LIST_INIT(&pi->pi_gmlist);
}