|
65 | 65 |
|
66 | 66 | //go:embed fixtures/logs_with_level_as_int_or_string.json |
67 | 67 | logsWithLevelAsIntOrStringData []byte |
| 68 | + |
| 69 | + //go:embed fixtures/large_logs_buffer_test.json |
| 70 | + largeLogsBufferTestData []byte |
68 | 71 | ) |
69 | 72 |
|
70 | 73 | func TestParseLogs(t *testing.T) { |
@@ -334,3 +337,35 @@ func TestParseActiveDirectoryLogs(t *testing.T) { |
334 | 337 | }) |
335 | 338 | } |
336 | 339 | } |
| 340 | + |
| 341 | +// Regression [CLOUDS-7233]: Because of a shared reference to the internal scanner buffer, |
| 342 | +// memory corruption would trigger under a particular set of circumstances |
| 343 | +func TestParseLargeLogsBufferReuse(t *testing.T) { |
| 344 | + t.Parallel() |
| 345 | + |
| 346 | + // GIVEN: The set of circumstances triggering the bug: |
| 347 | + // - logs large enough to force buffer overwriting |
| 348 | + // - pii scrubber rules are not set |
| 349 | + reader := bytes.NewReader(largeLogsBufferTestData) |
| 350 | + closer := io.NopCloser(reader) |
| 351 | + blob := newBlob("/SUBSCRIPTIONS/TEST-SUB/RESOURCEGROUPS/TEST-RG/PROVIDERS/MICROSOFT.TEST/TEST", "insights-logs-test") |
| 352 | + scrubber := logs.NewPiiScrubber(nil) |
| 353 | + |
| 354 | + // WHEN: Parsed via logs.Parse() |
| 355 | + parsedLogsIter, _, err := logs.Parse(closer, blob, scrubber) |
| 356 | + require.NoError(t, err) |
| 357 | + |
| 358 | + var collectedLogs []*logs.Log |
| 359 | + for response := range parsedLogsIter { |
| 360 | + require.NoError(t, response.Err) |
| 361 | + collectedLogs = append(collectedLogs, response.ParsedLog) |
| 362 | + } |
| 363 | + |
| 364 | + // THEN: Make sure logs aren't corrupted/malformed |
| 365 | + firstLogContent := string(collectedLogs[0].Content) |
| 366 | + assert.Contains(t, firstLogContent, "FIRST_LOG_MARKER", "First log Content should contain FIRST_LOG_MARKER") |
| 367 | + assert.NotContains(t, firstLogContent, "SECOND_LOG_MARKER", "First log Content should NOT contain SECOND_LOG_MARKER (buffer reuse corruption)") |
| 368 | + |
| 369 | + secondLogContent := string(collectedLogs[1].Content) |
| 370 | + assert.Contains(t, secondLogContent, "SECOND_LOG_MARKER", "Second log Content should contain SECOND_LOG_MARKER") |
| 371 | +} |
0 commit comments