80 lines
2.5 KiB
Diff
80 lines
2.5 KiB
Diff
|
|
From 8dd304035848e780372a5a4bb1afac2b2d20bc43 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Aliaksey Kandratsenka <alkondratenko@gmail.com>
|
||
|
|
Date: Sun, 5 Aug 2018 19:52:11 -0700
|
||
|
|
Subject: [PATCH 18/39] Format and fix out of bound access in CpuProfilerSwitch
|
||
|
|
|
||
|
|
GCC was giving warning on snprintf and it hinted at base_profile_name
|
||
|
|
and full_profile_name not being long enough.
|
||
|
|
|
||
|
|
Fix is to ensure base_profile_name is long enough for PATH_MAX and
|
||
|
|
that full_profile_name is enough longer to fit extra chars.
|
||
|
|
---
|
||
|
|
src/profiler.cc | 49 +++++++++++++++++++++++--------------------------
|
||
|
|
1 file changed, 23 insertions(+), 26 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/src/profiler.cc b/src/profiler.cc
|
||
|
|
index f4f5990..3bd0ed9 100644
|
||
|
|
--- a/src/profiler.cc
|
||
|
|
+++ b/src/profiler.cc
|
||
|
|
@@ -144,34 +144,31 @@ class CpuProfiler {
|
||
|
|
// number is defined in the environment variable CPUPROFILESIGNAL.
|
||
|
|
static void CpuProfilerSwitch(int signal_number)
|
||
|
|
{
|
||
|
|
- bool static started = false;
|
||
|
|
- static unsigned profile_count = 0;
|
||
|
|
- static char base_profile_name[1024] = "\0";
|
||
|
|
-
|
||
|
|
- if (base_profile_name[0] == '\0') {
|
||
|
|
- if (!GetUniquePathFromEnv("CPUPROFILE", base_profile_name)) {
|
||
|
|
- RAW_LOG(FATAL,"Cpu profiler switch is registered but no CPUPROFILE is defined");
|
||
|
|
- return;
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
- if (!started)
|
||
|
|
- {
|
||
|
|
- char full_profile_name[1024];
|
||
|
|
-
|
||
|
|
- snprintf(full_profile_name, sizeof(full_profile_name), "%s.%u",
|
||
|
|
- base_profile_name, profile_count++);
|
||
|
|
-
|
||
|
|
- if(!ProfilerStart(full_profile_name))
|
||
|
|
- {
|
||
|
|
- RAW_LOG(FATAL, "Can't turn on cpu profiling for '%s': %s\n",
|
||
|
|
- full_profile_name, strerror(errno));
|
||
|
|
- }
|
||
|
|
+ static unsigned profile_count;
|
||
|
|
+ static char base_profile_name[PATH_MAX];
|
||
|
|
+ static bool started = false;
|
||
|
|
+
|
||
|
|
+ if (base_profile_name[0] == '\0') {
|
||
|
|
+ if (!GetUniquePathFromEnv("CPUPROFILE", base_profile_name)) {
|
||
|
|
+ RAW_LOG(FATAL,"Cpu profiler switch is registered but no CPUPROFILE is defined");
|
||
|
|
+ return;
|
||
|
|
}
|
||
|
|
- else
|
||
|
|
- {
|
||
|
|
- ProfilerStop();
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (!started) {
|
||
|
|
+ char full_profile_name[PATH_MAX + 16];
|
||
|
|
+
|
||
|
|
+ snprintf(full_profile_name, sizeof(full_profile_name), "%s.%u",
|
||
|
|
+ base_profile_name, profile_count++);
|
||
|
|
+
|
||
|
|
+ if(!ProfilerStart(full_profile_name)) {
|
||
|
|
+ RAW_LOG(FATAL, "Can't turn on cpu profiling for '%s': %s\n",
|
||
|
|
+ full_profile_name, strerror(errno));
|
||
|
|
}
|
||
|
|
- started = !started;
|
||
|
|
+ } else {
|
||
|
|
+ ProfilerStop();
|
||
|
|
+ }
|
||
|
|
+ started = !started;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Profile data structure singleton: Constructor will check to see if
|
||
|
|
--
|
||
|
|
1.8.3.1
|
||
|
|
|