【发布时间】:2011-12-16 11:16:42
【问题描述】:
我们在 Linux 下有一个 Mono 应用程序,它对一堆文件进行图像处理。
为此,我们(除其他外)使用 System.Drawing,并且在大多数情况下它为我们提供了良好的服务。然而,偶尔我们会遇到一个使应用程序崩溃的图像——它是本地调用中的崩溃,这对 try catch 是免疫的。简而言之,调用之类的
System.Drawing.Image.FromFile(imagePath);
会导致崩溃。错误消息如下所示:
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipLoadImageFromFile (string,intptr&) <0xffffffff>
这会立即将整个应用程序拉下来。
我们遇到过一些发生这种情况的情况 - 损坏的 GIF 文件、TIFF 文件中的意外标题 - 仅举几例。由于我们无法控制图像的来源,我们只需要处理可能的崩溃。
问题:我想隔离我们在不受信任的文件上使用 GDI+(通过 System.Drawing)的地方,以便它可以愉快地崩溃而不会杀死整个应用程序。
我已经尝试过使用单独的应用程序域,但我无法阻止崩溃。很可能是我做错了!
一些细节:openSUSE 11.4 (x86_64), Mono 版本 2.10.2, libgdiplus0 (package) 2.10-30.2, libtiff3 (package) 3.9.4-3.7.1
请注意,我们遇到的具体问题已及时修复 - 请参阅下面的 cmets。问题仍然存在。
我本来希望以某种方式隔离程序的一部分,这样它就不会把整个事情拖垮——但我担心唯一的答案是调用一个外部进程,如下面的答案所述。我会保留一段时间,然后接受这个答案!
【问题讨论】:
-
我建议为导致崩溃的图像提交错误 (bugzilla.xamarin.com),以便修复问题。由于图像解析历来是安全问题的根源,因此最好将错误设为 Xamarin 私有,这样您就不会泄露可能的安全问题。
-
对,登录为 bugzilla.xamarin.com/show_bug.cgi?id=1752 和 bugzilla.xamarin.com/show_bug.cgi?id=1753 最后,我们尽可能避开了 System.Drawing,并依赖于 Mono 下的 Gdk,到目前为止,它似乎更加强大。
-
@FPC 这两个问题现在都已修复。谢谢!
-
太棒了! 印象深刻。谢谢。
标签: c# .net mono system.drawing