Skip to content

Commit d8b26ec

Browse files
committed
Work in progress
1 parent 63d4593 commit d8b26ec

File tree

7 files changed

+100
-87
lines changed

7 files changed

+100
-87
lines changed

src/adapters/mc/OsConfigResource.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ OsConfigLogHandle GetLog(void)
5555

5656
void __attribute__((constructor(65535))) Initialize()
5757
{
58+
CheckForPreviousCrash(LOG_FILE, GetLog());
59+
5860
InstallCrashHandler(LOG_FILE);
5961

6062
g_resourceId = NULL;

src/common/asb/Asb.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -959,8 +959,6 @@ void AsbInitialize(OsConfigLogHandle log)
959959
RestrictFileAccessToCurrentAccountOnly(g_configurationFile);
960960
}
961961

962-
OsConfigLogInfo(log, "######################### Crash simulation in EnumerateUsers #########################");
963-
964962
if (IsConsoleLoggingEnabled())
965963
{
966964
OsConfigLogWarning(log, "AsbInitialize: console logging is enabled. If the syslog rotation is not enabled this may result in a fill-up of the local storage space");

src/common/commonutils/CommonUtils.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ extern "C"
5252
char* LoadStringFromFile(const char* fileName, bool stopAtEol, OsConfigLogHandle log);
5353
bool SavePayloadToFile(const char* fileName, const char* payload, const int payloadSizeBytes, OsConfigLogHandle log);
5454
bool FileEndsInEol(const char* fileName, OsConfigLogHandle log);
55+
char* ReadEndOfFile(const char* logFileName, unsigned int maxSize, OsConfigLogHandle log);
5556
bool AppendPayloadToFile(const char* fileName, const char* payload, const int payloadSizeBytes, OsConfigLogHandle log);
5657
bool SecureSaveToFile(const char* fileName, const char* payload, const int payloadSizeBytes, OsConfigLogHandle log);
5758
bool AppendToFile(const char* fileName, const char* payload, const int payloadSizeBytes, OsConfigLogHandle log);
@@ -264,7 +265,7 @@ long GetPerfClockTime(PerfClock* clock, OsConfigLogHandle log);
264265
void LogPerfClock(PerfClock* clock, const char* componentName, const char* objectName, int objectResult, long limit, OsConfigLogHandle log);
265266

266267
void InstallCrashHandler(const char* logFileName);
267-
void ParseLogForPreviousCrashIfAny(const char* logFileName, char** marker, char** stack, OsConfigLogHandle log);
268+
void CheckForPreviousCrash(const char* logFileName, OsConfigLogHandle log);
268269

269270
#ifdef __cplusplus
270271
}

src/common/commonutils/CrashHandler.c

Lines changed: 15 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -85,99 +85,39 @@ void InstallCrashHandler(const char* logFileName)
8585
sigaction(SIGILL, &sa, NULL);
8686
}
8787

88-
static char* LoadEndOfFile(const char* logFileName, OsConfigLogHandle log)
88+
void CheckForPreviousCrash(const char* logFileName, OsConfigLogHandle log)
8989
{
90-
const int maxSize = 2048;
91-
int size = 0;
92-
long offset = 0;
93-
size_t sizeRead = 0;
94-
FILE* file = NULL;
95-
char* string = NULL;
96-
97-
if (false == FileExists(logFileName))
98-
{
99-
return string;
100-
}
101-
102-
if (NULL != (file = fopen(logFileName, "r")))
103-
{
104-
if (LockFile(file, log))
105-
{
106-
fseek(file, 0, SEEK_END);
107-
size = (int)ftell(file);
108-
109-
if (size > maxSize)
110-
{
111-
size = maxSize;
112-
}
113-
114-
offset = (long)(ftell(file) - size);
115-
fseek(file, offset, SEEK_SET);
116-
117-
if (NULL != (string = (char*)malloc(size + 1)))
118-
{
119-
memset(string, 0, size + 1);
120-
sizeRead = fread(string, sizeof(char), size, file);
121-
UNUSED(sizeRead);
122-
}
123-
else
124-
{
125-
OsConfigLogError(log, "LoadEndOfFile: unable to allocate memory");
126-
}
127-
128-
UnlockFile(file, log);
129-
}
130-
131-
fclose(file);
132-
}
133-
134-
OsConfigLogDebug(log, "LoadEndOfFile: '%s' ends in '%s'", logFileName, string);
135-
136-
return string;
137-
}
138-
139-
void ParseLogForPreviousCrashIfAny(const char* logFileName, char** marker, char** stack, OsConfigLogHandle log)
140-
{
141-
const char* crashDueToMarker = "[ERROR] Crash due to";
142-
const char* stackTraceMarker = "[ERROR] Stack trace:";
14390
char* endOfFile = NULL;
14491
char* crashStart = NULL;
145-
char* stackStart = NULL;
14692
char* endOfLine = NULL;
93+
char* p = NULL;
14794

14895
if ((NULL == logFileName) || (false == FileExists(logFileName)) || (NULL == marker) || (NULL == stack))
14996
{
15097
return;
15198
}
15299

153-
*marker = NULL;
154-
*stack = NULL;
155-
156-
if (NULL != (endOfFile = LoadEndOfFile(logFileName, log)))
100+
if (NULL != (endOfFile = ReadEndOfFile(logFileName, log)))
157101
{
158-
if (NULL != (crashStart = strstr(endOfFile, crashDueToMarker)))
102+
if (NULL != (crashStart = strstr(endOfFile, CRASH_PREFIX)))
159103
{
160-
// Search for stack trace before mutating crashStart
161-
stackStart = strstr(endOfFile, stackTraceMarker);
104+
OsConfigLogError(log, "Previous crash detected:");
105+
OsConfigLogError(log, "%s", crashStart);
162106

163-
// Null-terminate the crash header line
164-
if (NULL != (endOfLine = strchr(crashStart, '\n')))
107+
p = crashStart;
108+
while (*p)
165109
{
166-
endOfLine[0] = 0;
110+
if (EOL == *p)
111+
{
112+
*p = ';';
113+
}
114+
p++;
167115
}
168116

169-
*marker = DuplicateString(crashStart);
170-
*stack = DuplicateString(stackStart);
171-
}
172-
else
173-
{
174-
OsConfigLogError(log, "ParseLogForPreviousCrashIfAny: '%s' not found in '%s'", crashDueToMarker, logFileName);
117+
118+
OSConfigTelemetryStatusTrace(crashStart, EFAULT);
175119
}
176120
}
177-
else
178-
{
179-
OsConfigLogError(log, "ParseLogForPreviousCrashIfAny: could not open '%s' (%d, %s)", logFileName, errno, strerror(errno));
180-
}
181121

182122
FREE_MEMORY(endOfFile);
183123
}

src/common/commonutils/FileUtils.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,56 @@ bool FileEndsInEol(const char* fileName, OsConfigLogHandle log)
166166
return result;
167167
}
168168

169+
char* ReadEndOfFile(const char* logFileName, unsigned int maxSize, OsConfigLogHandle log)
170+
{
171+
int size = 0;
172+
long offset = 0;
173+
size_t sizeRead = 0;
174+
FILE* file = NULL;
175+
char* string = NULL;
176+
177+
if ((0 == maxSize) || (false == FileExists(logFileName)))
178+
{
179+
return NULL;
180+
}
181+
182+
if (NULL != (file = fopen(logFileName, "r")))
183+
{
184+
if (LockFile(file, log))
185+
{
186+
fseek(file, 0, SEEK_END);
187+
size = (int)ftell(file);
188+
189+
if (size > maxSize)
190+
{
191+
size = maxSize;
192+
}
193+
194+
offset = (long)(ftell(file) - size);
195+
fseek(file, offset, SEEK_SET);
196+
197+
if (NULL != (string = (char*)malloc(size + 1)))
198+
{
199+
memset(string, 0, size + 1);
200+
sizeRead = fread(string, sizeof(char), size, file);
201+
UNUSED(sizeRead);
202+
}
203+
else
204+
{
205+
OsConfigLogError(log, "LoadEndOfFile: unable to allocate memory");
206+
}
207+
208+
UnlockFile(file, log);
209+
}
210+
211+
fclose(file);
212+
}
213+
214+
OsConfigLogDebug(log, "LoadEndOfFile: '%s' ends in '%s'", logFileName, string);
215+
216+
return string;
217+
}
218+
169219
bool AppendPayloadToFile(const char* fileName, const char* payload, const int payloadSizeBytes, OsConfigLogHandle log)
170220
{
171221
bool result = false;

src/common/tests/CommonUtilsUT.cpp

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3235,6 +3235,30 @@ TEST_F(CommonUtilsTest, LoggingOptions)
32353235

32363236
#endif //#ifdef(0) /////////////////////////////////////////////////////////////
32373237

3238+
TEST_F(CommonUtilsTest, ReadEndOfFile)
3239+
{
3240+
const char* testFileContents = "Line 1\nLine 2\nLine 3\nTestline 4\n";
3241+
char* contents = NULL;
3242+
EXPECT_TRUE(SavePayloadToFile(m_path, testFileContents, strlen(testFileContents), nullptr));
3243+
3244+
EXPECT_STREQ("\n", contents = ReadEndOfFile(m_path, 1, nullptr));
3245+
FREE_MEMORY(contents);
3246+
3247+
EXPECT_STREQ("4\n", contents = ReadEndOfFile(m_path, 2, nullptr));
3248+
FREE_MEMORY(contents);
3249+
3250+
EXPECT_STREQ(" 4\n", contents = ReadEndOfFile(m_path, 3, nullptr));
3251+
FREE_MEMORY(contents);
3252+
3253+
EXPECT_STREQ("Testline 4\n", contents = ReadEndOfFile(m_path, strlen("Testline 4\n"), nullptr));
3254+
FREE_MEMORY(contents);
3255+
3256+
EXPECT_STREQ("Line 2\nLine 3\nTestline 4\n", contents = ReadEndOfFile(m_path, strlen("Line 2\nLine 3\nTestline 4\n"), nullptr));
3257+
FREE_MEMORY(contents);
3258+
3259+
EXPECT_TRUE(Cleanup(m_path));
3260+
}
3261+
32383262
TEST_F(CommonUtilsTest, CrashHandler)
32393263
{
32403264
OsConfigLogHandle log = nullptr;
@@ -3258,15 +3282,12 @@ TEST_F(CommonUtilsTest, CrashHandler)
32583282
OsConfigLogInfo(log, "Done!");
32593283

32603284
// Verify the crash handler [ERROR] lines appear in the handler log
3261-
char* marker = NULL;
3262-
char* stack = NULL;
3263-
ParseLogForPreviousCrashIfAny(m_path, &marker, &stack, log);
3264-
EXPECT_NE(nullptr, marker);
3265-
EXPECT_NE(nullptr, stack);
3266-
OsConfigLogInfo(log, "Crash: %s", marker);
3267-
OsConfigLogInfo(log, "Stack: %s", stack);
3268-
FREE_MEMORY(marker);
3269-
FREE_MEMORY(stack);
3285+
char* contents = NULL;
3286+
char* result = NULL;
3287+
EXPECT_NE(nullptr, contents = LoadStringFromFile(m_path, false, nullptr));
3288+
printf("%s", contents);
3289+
EXPECT_NE(nullptr, result = strstr(contents, "[ERROR] Crash due to segmentation fault (SIGSEGV)"));
3290+
EXPECT_NE(nullptr, result = strstr(contents, "[ERROR] Stack trace:"));
32703291

32713292
CloseLog(&log);
32723293
EXPECT_TRUE(Cleanup(m_path));

src/modules/securitybaseline/src/lib/SecurityBaseline.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ static OsConfigLogHandle SecurityBaselineGetLog(void)
5151

5252
void SecurityBaselineInitialize(void)
5353
{
54+
CheckForPreviousCrash(g_securityBaselineLogFile, SecurityBaselineGetLog());
5455
InstallCrashHandler(g_securityBaselineLogFile);
5556
g_log = OpenLog(g_securityBaselineLogFile, g_securityBaselineRolledLogFile);
5657
AsbInitialize(SecurityBaselineGetLog());

0 commit comments

Comments
 (0)