IE6 Hotfix MS-042将导致其Crash!

简介:
 近来Test Team和部分Devs发现,在某些时候使用 我们产品中的右键菜单会导致IE 6.0(sp1)直接Crash掉。从不同机器上IE不断Crash的情况来看,这应该可以确定是IE的问题,而不是偶然的机器环境导致的问题。虽然没有一个固定的步骤来准确复现这个问题,但是大家还是感觉到这是一个新近才集中出现的问题,因为我们产品中所使用的 菜单控件创建于2004年11月30日,虽然后来有众多的修改,可是都没有改动及其基本的结构。

    昨天我和同事在为这个Menu继续添加新功能时,发现这个Popup菜单导致IE Crash的问题变得十分频繁,几乎每做8,9步显示菜单的操作就能导致IE 6 Crash。

    IE-MS042-Crash.png
    // 这样的问题真是让人无法忍受啊!!!

    能搞出: The instruction at "0x4a5b19d6" referenced memory at "0x00000020". The memory could not be "red". 这样的问题,显然已经完全操出了脚本的能力。

    原来引起这个问题的始作俑者居然是IE最近release的一个hotfix,该 Hotfix 923762本来使用来解决IE非法退出的问题。可是没想到去鬼使神差的影响到了脚本生成Popup窗口的功能。

    虽然没有固定的复现这个问题的步骤,但是下面这个页面还是很容易的在安装了该hotfix的IE上引发Crash:
< html >
< head >
     < script  language ="javascript" >
    
var  g_popup  =   null ;
    
function  ShowPopup(elmt)
    
{
        g_popup 
=  window.createPopup();
        
var  popBody  =  g_popup.document.body;
        popBody.innerHTML 
=  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
            
+  ' < tr >< td >< button onclick = " ShowPopup(this) " > Show Popup Window </ button >< br >< br > '
            
+  '蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
        g_popup.show(
100 100 400 200 , elmt );
    }

    
</ script >
</ head >
< body >
     < button  onclick ="ShowPopup(this)" >Show Popup Window </ button >
</ body >
</ html >
    // 保存为*.htm文件就可以了,打开后反复点击第一个"Show Popup Window",大概10次左右就会Crash。

    进一步分析这个问题,再看看下面这两个改进的示例:
< script  language ="javascript" >
var  g_popup  =   null ;
function  ShowPopup(elmt)
{
    
if  (  ! g_popup ) g_popup  =  window.createPopup();
    
var  popBody  =  g_popup.document.body;
    popBody.innerHTML 
=  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
        
+  ' < tr >< td >< button onclick = " ShowPopup(this) " > Show Popup Window </ button >< br >< br > '
        
+  '蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
    g_popup.show(
100 100 400 200 , elmt );
}

</ script >

< script  language ="javascript" >
var  g_popup  =   null ;
function  ShowPopup(elmt)
{
    g_popup 
=  window.createPopup();
    
var  popBody  =  g_popup.document.body;
    popBody.innerHTML 
=  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
        
+  ' < tr >< td > 蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
    g_popup.show(
100 100 400 200 , elmt );
}

</ script >

    新的版本在反复点击"Show Popup Window"后不会Crash(至少我点了很久很久没有Crash...)。

    仔细分析,我们可以发现,这个问题应该是IE内存泄露造成的。在第一个改进中,我们缓存了g_popup,反复点击其实只使用了一个popup窗口;而在第二个改进中,我们把从popup窗口内部元素对parent页面函数的引用去掉了。这样一来我们可以很容易的发现出错页面的原因: 反复的生成并丢弃了对parent页面脚本元素有引用关系的popup窗口,就会使IE Crash掉。
    
    那么大概知道了Crash的原因后,可以完全有效的避免这个Crash吗?我认为答案是否定的,因为使用Popup窗口来构成的菜单,不太可能绝对的不去引用Parent页面中的脚本方法,同时也很难有绝对安全的办法来避免产生野popup实例(没有被页面引用的popup,类似野指针概念)。退一万步,就算都避免了,那么这种cut过的popup还有什么实用意义呢?

    除了自己小心,那么最有只能祈祷M$赶快推出新的补丁的补丁的补丁。。。


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
590 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
234 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
828 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1217 157
|
6天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
514 109