Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314236
  • 博文数量: 45
  • 博客积分: 2079
  • 博客等级: 上尉
  • 技术积分: 464
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-03 16:57
文章分类

全部博文(45)

文章存档

2015年(1)

2013年(1)

2012年(9)

2011年(2)

2010年(32)

分类: C/C++

2012-03-05 10:03:53

   书接上回,上次说到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)

参考:

声明:本文写作皆因个人兴趣,仅供学习目的,限于本人水平有限,不当之处请指正,欢迎讨论。
阅读(2321) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~