Exemplo n.º 1
0
        private static void OnNewConverterCreatedCallback(IComWorker <IOleConverter> converterProcess, object requestParameters)
        {
            IOleConverter worker = converterProcess.Worker;
            uint          num    = 0U;
            string        conversionsDirectory = OleConverter.GetConversionsDirectory(true);

            if (conversionsDirectory == null)
            {
                StorageGlobals.ContextTraceError(ExTraceGlobals.CcOleTracer, "OleConverter::OnNewConverterCreatedCallback: conversions directory full or inaccessible.");
                throw new OleConversionFailedException(ServerStrings.OleConversionFailed);
            }
            int num2;

            worker.ConfigureConverter(out num2, 4194304U, 262144U, conversionsDirectory, out num);
            if (num2 != 0)
            {
                StorageGlobals.ContextTraceError(ExTraceGlobals.CcOleTracer, "OleConverter::OnNewConverterCreatedCallback: failed to configure converter.");
                throw new OleConversionFailedException(ServerStrings.OleConversionFailed, new COMException("HRESULT =", num2));
            }
            if (num != (uint)converterProcess.ProcessId)
            {
                StorageGlobals.ContextTraceError(ExTraceGlobals.CcOleTracer, "OleConverter::OnNewConverterCreatedCallback: process id mismatch.");
                throw new OleConversionFailedException(ServerStrings.OleConversionInitError(Process.GetCurrentProcess().ProcessName, converterProcess.ProcessId, (int)num));
            }
        }
Exemplo n.º 2
0
        private static string SaveStreamToTempFile(Stream stream)
        {
            StringBuilder stringBuilder        = new StringBuilder(256);
            string        conversionsDirectory = OleConverter.GetConversionsDirectory(true);

            if (NativeMethods.GetTempFileName(conversionsDirectory, "ole", 0U, stringBuilder) == 0)
            {
                StorageGlobals.ContextTraceError <string, int>(ExTraceGlobals.CcOleTracer, "OleConverter::SaveStreamToTempFile: failed to create temp file name, directory = {0}. Error {1}", conversionsDirectory, Marshal.GetLastWin32Error());
                throw new OleConversionFailedException(ServerStrings.OleConversionPrepareFailed);
            }
            try
            {
                using (FileStream fileStream = new FileStream(stringBuilder.ToString(), FileMode.OpenOrCreate, FileAccess.Write))
                {
                    Util.StreamHandler.CopyStreamData(stream, fileStream);
                    fileStream.Close();
                }
            }
            catch (IOException arg)
            {
                OleConverter.DeleteTempFile(stringBuilder.ToString());
                StorageGlobals.ContextTraceError <IOException>(ExTraceGlobals.CcOleTracer, "OleConverter::SaveStreamToTempFile: IOException caught. Exception:\n {0}", arg);
                throw new OleConversionFailedException(ServerStrings.OleConversionPrepareFailed);
            }
            return(stringBuilder.ToString());
        }
Exemplo n.º 3
0
        private static Stream CreateResultStream(object result)
        {
            string text = result as string;

            if (text != null)
            {
                try
                {
                    return(new OleConverter.ConversionResultFileStream(text));
                }
                catch (IOException arg)
                {
                    OleConverter.DeleteTempFile(text);
                    StorageGlobals.ContextTraceError <IOException>(ExTraceGlobals.CcOleTracer, "OleConverter::CreateResultStream: IOException caught. Exception:\n {0}", arg);
                    throw new OleConversionFailedException(ServerStrings.OleConversionResultFailed);
                }
            }
            byte[] array = result as byte[];
            if (array != null)
            {
                return(new MemoryStream(array));
            }
            StorageGlobals.ContextTraceError <Type>(ExTraceGlobals.CcOleTracer, "OleConverter::CreateResultStream: result type is invalid, {0}.", result.GetType());
            throw new OleConversionFailedException(ServerStrings.OleConversionInvalidResultType);
        }
Exemplo n.º 4
0
 protected override void Dispose(bool disposing)
 {
     base.Dispose(disposing);
     if (!this.isDeleted && this.filename != null)
     {
         OleConverter.DeleteTempFile(this.filename);
         this.isDeleted = true;
     }
 }
Exemplo n.º 5
0
 public override void Close()
 {
     base.Close();
     if (!this.isDeleted)
     {
         OleConverter.DeleteTempFile(this.filename);
         this.isDeleted = true;
     }
 }
Exemplo n.º 6
0
        private static void DestroyOleObjectData(object oleObjectData)
        {
            string text = oleObjectData as string;

            if (text != null)
            {
                OleConverter.DeleteTempFile(text);
            }
        }
Exemplo n.º 7
0
        private static void DirectoryCleanup(object cleanupLock, bool isForced)
        {
            string conversionsDirectory = OleConverter.GetConversionsDirectory(false);

            if (conversionsDirectory == null)
            {
                return;
            }
            try
            {
                if (Monitor.TryEnter(cleanupLock) || (isForced && Monitor.TryEnter(cleanupLock, 30000)))
                {
                    NativeMethods.WIN32_FIND_DATA win32_FIND_DATA = default(NativeMethods.WIN32_FIND_DATA);
                    using (SafeFindHandle safeFindHandle = NativeMethods.FindFirstFile(Path.Combine(conversionsDirectory, "*"), out win32_FIND_DATA))
                    {
                        if (!safeFindHandle.IsInvalid)
                        {
                            do
                            {
                                if ((win32_FIND_DATA.FileAttributes & NativeMethods.FileAttributes.Directory) != NativeMethods.FileAttributes.Directory)
                                {
                                    ExDateTime fileCreateTimeUtc = OleConverter.GetFileCreateTimeUtc(ref win32_FIND_DATA);
                                    TimeSpan   t = ExDateTime.UtcNow.Subtract(fileCreateTimeUtc);
                                    if (t > OleConverter.MaxFileLifetime)
                                    {
                                        NativeMethods.DeleteFile(Path.Combine(conversionsDirectory, win32_FIND_DATA.FileName));
                                    }
                                }
                            }while (NativeMethods.FindNextFile(safeFindHandle, out win32_FIND_DATA));
                        }
                    }
                }
            }
            finally
            {
                if (Monitor.IsEntered(cleanupLock))
                {
                    Monitor.Exit(cleanupLock);
                }
            }
        }
Exemplo n.º 8
0
 private static object CreateOleObjectData(Stream oleDataStream, bool canCacheInMemory)
 {
     if (canCacheInMemory && oleDataStream.CanSeek)
     {
         long length = oleDataStream.Length;
         if (length <= 262144L)
         {
             byte[] array = new byte[length];
             int    num;
             for (int i = 0; i < array.Length; i += num)
             {
                 num = oleDataStream.Read(array, i, (int)length - i);
                 if (num == 0)
                 {
                     StorageGlobals.ContextTraceError(ExTraceGlobals.CcOleTracer, "OleConverter::CreateOleObjectData: unable to load full stream.");
                     throw new OleConversionFailedException(ServerStrings.OleUnableToReadAttachment);
                 }
             }
             return(array);
         }
     }
     return(OleConverter.SaveStreamToTempFile(oleDataStream));
 }
Exemplo n.º 9
0
        private Stream ConvertToBitmap()
        {
            Stream stream = null;

            using (StorageGlobals.SetTraceContext(this))
            {
                if (StandaloneFuzzing.IsEnabled)
                {
                    using (Bitmap bitmap = new Bitmap(1, 1))
                    {
                        stream = new MemoryStream();
                        bitmap.Save(stream, ImageFormat.Jpeg);
                        goto IL_5C;
                    }
                }
                OleConverter instance = OleConverter.Instance;
                using (Stream contentStream = this.GetContentStream(PropertyOpenMode.ReadOnly))
                {
                    stream = instance.ConvertToBitmap(contentStream);
                }
                IL_5C :;
            }
            return(stream);
        }
Exemplo n.º 10
0
 private static void DirectoryCleanup(object cleanupLock)
 {
     OleConverter.DirectoryCleanup(cleanupLock, false);
 }
Exemplo n.º 11
0
 internal void ForceRunDirectoryCleanup()
 {
     OleConverter.DirectoryCleanup(this.cleanupLock, true);
 }
Exemplo n.º 12
0
        internal Stream ConvertToBitmap(Stream oleDataStream)
        {
            object obj = null;
            int    num = Interlocked.Increment(ref this.nQueueSize);
            Stream result;

            try
            {
                try
                {
                    bool canCacheInMemory = num <= 30;
                    obj = OleConverter.CreateOleObjectData(oleDataStream, canCacheInMemory);
                    OleConverter.ConversionRequestParameters conversionRequestParameters = new OleConverter.ConversionRequestParameters(obj, null);
                    base.ExecuteRequest(conversionRequestParameters);
                    result = OleConverter.CreateResultStream(conversionRequestParameters.ResponseData);
                }
                catch (ComInterfaceInitializeException ex)
                {
                    StorageGlobals.ContextTraceError <ComInterfaceInitializeException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex);
                    throw new OleConversionServerBusyException(ServerStrings.OleConversionFailed, ex);
                }
                catch (ComProcessBusyException ex2)
                {
                    StorageGlobals.ContextTraceError <ComProcessBusyException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex2);
                    throw new OleConversionServerBusyException(ServerStrings.OleConversionFailed, ex2);
                }
                catch (ComProcessTimeoutException ex3)
                {
                    StorageGlobals.ContextTraceError <ComProcessTimeoutException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex3);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex3);
                }
                catch (ComProcessBeyondMemoryLimitException ex4)
                {
                    StorageGlobals.ContextTraceError <ComProcessBeyondMemoryLimitException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex4);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex4);
                }
                catch (COMException ex5)
                {
                    StorageGlobals.ContextTraceError <COMException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex5);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex5);
                }
                catch (InvalidComObjectException ex6)
                {
                    StorageGlobals.ContextTraceError <InvalidComObjectException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex6);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex6);
                }
                catch (InvalidCastException ex7)
                {
                    StorageGlobals.ContextTraceError <InvalidCastException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex7);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex7);
                }
                catch (NoSupportException ex8)
                {
                    StorageGlobals.ContextTraceError <NoSupportException>(ExTraceGlobals.CcOleTracer, "OleConverter::ConvertToBitmap: ole conversion failed. Exception:\n {0}", ex8);
                    throw new OleConversionFailedException(ServerStrings.OleConversionFailed, ex8);
                }
            }
            catch (StoragePermanentException exc)
            {
                OleConverter.SaveFailedConversionData(obj, exc, null);
                throw;
            }
            catch (StorageTransientException exc2)
            {
                OleConverter.SaveFailedConversionData(obj, exc2, null);
                throw;
            }
            finally
            {
                Interlocked.Decrement(ref this.nQueueSize);
                if (obj != null)
                {
                    OleConverter.DestroyOleObjectData(obj);
                }
            }
            return(result);
        }