diff options
Diffstat (limited to 'tools/perf/jvmti/jvmti_agent.c')
| -rw-r--r-- | tools/perf/jvmti/jvmti_agent.c | 49 | 
1 files changed, 38 insertions, 11 deletions
diff --git a/tools/perf/jvmti/jvmti_agent.c b/tools/perf/jvmti/jvmti_agent.c index ac1bcdc17dae..f7eb63cbbc65 100644 --- a/tools/perf/jvmti/jvmti_agent.c +++ b/tools/perf/jvmti/jvmti_agent.c @@ -125,7 +125,7 @@ perf_get_timestamp(void)  }  static int -debug_cache_init(void) +create_jit_cache_dir(void)  {  	char str[32];  	char *base, *p; @@ -144,8 +144,13 @@ debug_cache_init(void)  	strftime(str, sizeof(str), JIT_LANG"-jit-%Y%m%d", &tm); -	snprintf(jit_path, PATH_MAX - 1, "%s/.debug/", base); - +	ret = snprintf(jit_path, PATH_MAX, "%s/.debug/", base); +	if (ret >= PATH_MAX) { +		warnx("jvmti: cannot generate jit cache dir because %s/.debug/" +			" is too long, please check the cwd, JITDUMPDIR, and" +			" HOME variables", base); +		return -1; +	}  	ret = mkdir(jit_path, 0755);  	if (ret == -1) {  		if (errno != EEXIST) { @@ -154,20 +159,32 @@ debug_cache_init(void)  		}  	} -	snprintf(jit_path, PATH_MAX - 1, "%s/.debug/jit", base); +	ret = snprintf(jit_path, PATH_MAX, "%s/.debug/jit", base); +	if (ret >= PATH_MAX) { +		warnx("jvmti: cannot generate jit cache dir because" +			" %s/.debug/jit is too long, please check the cwd," +			" JITDUMPDIR, and HOME variables", base); +		return -1; +	}  	ret = mkdir(jit_path, 0755);  	if (ret == -1) {  		if (errno != EEXIST) { -			warn("cannot create jit cache dir %s", jit_path); +			warn("jvmti: cannot create jit cache dir %s", jit_path);  			return -1;  		}  	} -	snprintf(jit_path, PATH_MAX - 1, "%s/.debug/jit/%s.XXXXXXXX", base, str); - +	ret = snprintf(jit_path, PATH_MAX, "%s/.debug/jit/%s.XXXXXXXX", base, str); +	if (ret >= PATH_MAX) { +		warnx("jvmti: cannot generate jit cache dir because" +			" %s/.debug/jit/%s.XXXXXXXX is too long, please check" +			" the cwd, JITDUMPDIR, and HOME variables", +			base, str); +		return -1; +	}  	p = mkdtemp(jit_path);  	if (p != jit_path) { -		warn("cannot create jit cache dir %s", jit_path); +		warn("jvmti: cannot create jit cache dir %s", jit_path);  		return -1;  	} @@ -228,7 +245,7 @@ void *jvmti_open(void)  {  	char dump_path[PATH_MAX];  	struct jitheader header; -	int fd; +	int fd, ret;  	FILE *fp;  	init_arch_timestamp(); @@ -245,12 +262,22 @@ void *jvmti_open(void)  	memset(&header, 0, sizeof(header)); -	debug_cache_init(); +	/* +	 * jitdump file dir +	 */ +	if (create_jit_cache_dir() < 0) +		return NULL;  	/*  	 * jitdump file name  	 */ -	scnprintf(dump_path, PATH_MAX, "%s/jit-%i.dump", jit_path, getpid()); +	ret = snprintf(dump_path, PATH_MAX, "%s/jit-%i.dump", jit_path, getpid()); +	if (ret >= PATH_MAX) { +		warnx("jvmti: cannot generate jitdump file full path because" +			" %s/jit-%i.dump is too long, please check the cwd," +			" JITDUMPDIR, and HOME variables", jit_path, getpid()); +		return NULL; +	}  	fd = open(dump_path, O_CREAT|O_TRUNC|O_RDWR, 0666);  	if (fd == -1)  | 
