コード例 #1
0
            public static CrashHeader ParseCrashHeader(BinaryReader Reader)
            {
                var OutCrashHeader = new CrashHeader();

                OutCrashHeader.DirectoryName    = FBinaryReaderHelper.ReadFixedSizeString(Reader);
                OutCrashHeader.FileName         = FBinaryReaderHelper.ReadFixedSizeString(Reader);
                OutCrashHeader.UncompressedSize = Reader.ReadInt32();
                OutCrashHeader.FileCount        = Reader.ReadInt32();
                return(OutCrashHeader);
            }
コード例 #2
0
        private static bool DecompressDataRouterContent(byte[] CompressedBufferArray, string InLandingZone)
        {
            // Decompress to landing zone
            byte[] UncompressedBufferArray = new byte[Config.Default.MaxUncompressedS3RecordSize];

            int UncompressedSize = NativeMethods.UncompressMemoryZlib(UncompressedBufferArray, CompressedBufferArray);

            if (UncompressedSize < 0)
            {
                string FailString = "! DecompressDataRouterContent() failed in UncompressMemoryZlib() with " +
                                    NativeMethods.GetZlibError(UncompressedSize);
                CrashReporterProcessServicer.WriteFailure(FailString);
                CrashReporterProcessServicer.StatusReporter.IncrementCount(StatusReportingEventNames.ReadS3RecordFailedEvent);
                return(false);
            }

            using (BinaryReader BinaryData = new BinaryReader(new MemoryStream(UncompressedBufferArray, 0, UncompressedSize, false)))
            {
                char[] MarkerChars = BinaryData.ReadChars(3);
                if (MarkerChars[0] == 'C' && MarkerChars[1] == 'R' && MarkerChars[2] == '1')
                {
                    CrashHeader CrashHeader = DataRouterReportQueue.CrashHeader.ParseCrashHeader(BinaryData);

                    // Create safe directory name and then create the directory on disk
                    string CrashFolderName = GetSafeFilename(CrashHeader.DirectoryName);
                    string CrashFolderPath = Path.Combine(InLandingZone, CrashFolderName);

                    // Early check for duplicate processed report
                    lock (ReportIndexLock)
                    {
                        if (CrashReporterProcessServicer.ReportIndex.ContainsReport(CrashFolderName))
                        {
                            // Crash report not accepted by index
                            CrashReporterProcessServicer.WriteEvent(string.Format(
                                                                        "DataRouterReportQueue: Duplicate report skipped early {0} in a DataRouterReportQueue", CrashFolderPath));
                            CrashReporterProcessServicer.StatusReporter.IncrementCount(StatusReportingEventNames.DuplicateRejected);
                            return(false);                            // this isn't an error so don't set error message
                        }
                    }

                    // Create target folder
                    int TryIndex = 1;
                    while (Directory.Exists(CrashFolderPath))
                    {
                        CrashFolderPath = Path.Combine(InLandingZone, string.Format("{0}_DUPE{1:D3}", CrashFolderName, TryIndex++));
                    }
                    Directory.CreateDirectory(CrashFolderPath);

                    if (UncompressedSize != CrashHeader.UncompressedSize)
                    {
                        CrashReporterProcessServicer.WriteEvent(
                            string.Format(
                                "DecompressDataRouterContent() warning UncompressedSize mismatch (embedded={0}, actual={1}) Path={2}",
                                CrashHeader.UncompressedSize, UncompressedSize, CrashFolderPath));
                    }

                    if (!ParseCrashFiles(BinaryData, CrashHeader.FileCount, CrashFolderPath))
                    {
                        string FailString = "! DecompressDataRouterContent() failed to write files Path=" + CrashFolderPath;
                        CrashReporterProcessServicer.WriteFailure(FailString);
                        CrashReporterProcessServicer.StatusReporter.IncrementCount(StatusReportingEventNames.ReadS3RecordFailedEvent);
                        return(false);
                    }
                }
                else
                {
#if ALLOWOLDCLIENTDATA
                    // Early Data Router upload format was broken.
                    // Should be [CR1][CrashHeader][File][File][File][File]...
                    // Actually [Undefined CrashHeader][File][File][File][File]...[CrashHeader]

                    // Seek to end minus header size
                    BinaryData.BaseStream.Position = UncompressedSize - DataRouterReportQueue.CrashHeader.FixedSize;
                    var CrashHeader = DataRouterReportQueue.CrashHeader.ParseCrashHeader(BinaryData);

                    // Create safe directory name and then create the directory on disk
                    string CrashFolderName = GetSafeFilename(CrashHeader.DirectoryName);
                    string CrashFolderPath = Path.Combine(InLandingZone, CrashFolderName);

                    // Early check for duplicate processed report
                    lock (ReportIndexLock)
                    {
                        if (CrashReporterProcessServicer.ReportIndex.ContainsReport(CrashFolderName))
                        {
                            // Crash report not accepted by index
                            CrashReporterProcessServicer.WriteEvent(string.Format(
                                                                        "DataRouterReportQueue: Duplicate report skipped early {0} in a DataRouterReportQueue", CrashFolderPath));
                            CrashReporterProcessServicer.StatusReporter.IncrementCount(StatusReportingEventNames.DuplicateRejected);
                            return(false);                            // this isn't an error so don't set error message
                        }
                    }

                    // Create target folder
                    int TryIndex = 1;
                    while (Directory.Exists(CrashFolderPath))
                    {
                        CrashFolderPath = Path.Combine(InLandingZone, string.Format("{0}_DUPE{1:D3}", CrashFolderName, TryIndex++));
                    }
                    Directory.CreateDirectory(CrashFolderPath);

                    if (UncompressedSize != CrashHeader.UncompressedSize + CrashHeader.FixedSize)
                    {
                        CrashReporterProcessServicer.WriteEvent(
                            string.Format(
                                "DecompressDataRouterContent() warning UncompressedSize mismatch (embedded={0}, actual={1}) Path={2}",
                                CrashHeader.UncompressedSize, UncompressedSize, CrashFolderPath));
                    }

                    // Seek to start of files (header size in from start)
                    BinaryData.BaseStream.Position = CrashHeader.FixedSize;
                    if (!ParseCrashFiles(BinaryData, CrashHeader.FileCount, CrashFolderPath))
                    {
                        string FailString = "! DecompressDataRouterContent() failed to write files Path=" + CrashFolderPath;
                        CrashReporterProcessServicer.WriteFailure(FailString);
                        CrashReporterProcessServicer.StatusReporter.IncrementCount(StatusReportingEventNames.ReadS3RecordFailedEvent);
                        return(false);
                    }
#else
                    ErrorMessage = "! DecompressDataRouterContent() failed to read invalid data format. Corrupt or old format data received Path=" + CrashFolderPath;
                    return(false);
#endif
                }
            }

            return(true);
        }
コード例 #3
0
			public static CrashHeader ParseCrashHeader(BinaryReader Reader)
			{
				var OutCrashHeader = new CrashHeader();
				OutCrashHeader.DirectoryName = FBinaryReaderHelper.ReadFixedSizeString(Reader);
				OutCrashHeader.FileName = FBinaryReaderHelper.ReadFixedSizeString(Reader);
				OutCrashHeader.UncompressedSize = Reader.ReadInt32();
				OutCrashHeader.FileCount = Reader.ReadInt32();
				return OutCrashHeader;
			}