书接上回,上次说到CVE-2011-3026这个漏洞,在这里做一下简单分析。根据资料显示这个漏洞在新版本的libpng中是修复了的,所以找到两个版本的代码,进行比较,如下图。
从比较结果可以知道:新版本中加入了整形溢出判断:
if (prefix_size >= (~(png_size_t)0) - 1 ||
expanded_size >= (~(png_size_t)0) - 1 - prefix_size||....)
png_warning(...)
这种形式,是不是很熟悉呢?恩,是的,和上次提到的预防整形溢出的写法如出一辙:
if( a > INT_MAX - b )
{
complain();
}
那INT_MAX得值是不是就等于~(png_size_t)0)呢?让我们先来看一看linux里的定义吧,
先看kernel.h里的:
#define INT_MAX ((int)(~0U>>1))
#define INT_MIN (-INT_MAX - 1)
#define UINT_MAX (~0U)
#define LONG_MAX ((long)(~0UL>>1))
#define LONG_MIN (-LONG_MAX - 1)
#define ULONG_MAX (~0UL)
细心的朋友已经发现了,UINT_MAX的值与新版libpng里的写法是一样的,即:
if( a > UINT_MAX - b )
{
complain();
}
注:个人觉得不需要等号的,libpng里为何加等号,得问写那行代码的人了。
另外,《C陷阱与缺陷》中说INT_MAX的定义在limits.h里,我们来看一下吧:
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)
参考:
声明:本文写作皆因个人兴趣,仅供学习目的,限于本人水平有限,不当之处请指正,欢迎讨论。
阅读(377) | 评论(0) | 转发(0) |