白癜风早期能根治吗 http://news.39.net/bjzkhbzy/170902/5668928.html*本文首创建者:chilau,本文属FreeBuf首创嘉奖策动,未经承诺不准转载
触发前提:
php7.2.x,开启gd库。只要要三行代码便可实行!
我在内地调试php的时间发觉某个老代码能够直接把php给crash掉,因而成文。
php没有报错,直接死掉了,应当是内部逻辑有题目。再传到效劳器上试试:
啊哈,同样的成果。触发这个题目的代码以下:
im=imagecreate(,);imageantialias(im,true);imageline(im,0,0,10,10,0xffffff);
话未几说,上vs调试。先看挪用客栈吧。
从这边能够看出是在GD库的画像素点的场合出了错,被调试器断在了gdImageSetAAPixelColor这个函数里。
再看对应代码,拜访了gdImagePtr布局体中的一个成员,致使拜访违例。咱们再从立即窗口查看一下:
没错,tpixels是个空指针!
那tpixels是干啥的呢?在gd.h内里犹以下表明:
/*Truecolorflagandpixels.New2.0fieldsappearhereattheendtominimizebreakageofexistingobjectcode.*/inttrueColor;int**tpixels;
看来是和真彩色相干的东西,咱们再顺着挪用客栈往前看。
这边是gdImageAALine函数,一个个点地画线,干的是脚夫活。从gdImageLine里挪用了它:
这边的前提判定是能否开启了防锯齿功用。倘若咱们挪用imageantialias函数翻开这个功用,那末就会走这边来。
上头图里便是咱们从php挪用的imageline函数的完结啦,特别简洁。能够看出图片是真彩色的时间它会默许开启防锯齿功用。
这边题目就在于,咱们创造(imagecreate)的图片不是真彩色的图,此后咱们手动开启了防锯齿(imageantialias),挪用出来想固然地把它当做一张真彩色图,进而致使了差错。
着末咱们来看看两个函数的不同:
跟出来,能够看到imagecreate函数挪用的gdImageCreate里直接把真彩色相干的成员设为了null。
与之比较,imagecreatetruecolor函数挪用的gdImageCreateTrueColor函数里为每个像素点都分派了对应内存并初始化为0了:
归纳一下,从上头解析能够看出,触发这个题目的前提有3个:
1.php版本为7.2.x且开启了gd库
2.创造了非真彩色图且开启抗锯齿
3.在创造的图句柄长举办像素点写入
致使这个题目的因为依旧代码窜改思虑不全面,引入了新的弱点;没有对通盘或许前提举办测试,以是从php7.2.0始终到php7.2.4都还存在题目。
曾经向php官方汇报,倘若正在临盆处境应用相干版本请送还旧版本,旧版本里不存在这个题目。
*本文首创建者:chilau,本文属FreeBuf首创嘉奖策动,未经承诺不准转载
预览时标签弗成点收录于合集#个