OpenOffice(OOo)是美国阿帕奇(Apache)软件基金会的一款开源的办公软件套件。该套件包含文本文档、电子表格、演示文稿、绘图、数据库等。 OpenOffice的rtl_allocateMemory()函数没有执行整数溢出检查便以8字节为边界环绕分配请求,以下是sal/rtl/source/alloc_global.c中的漏洞代码: 191void * 192SAL_CALL rtl_allocateMemory (sal_Size n) 193{ 194void * p = 0; 195if (n > 0) 196{ 197addr; 198 size = RTL_MEMORY_ALIGN(n + RTL_MEMALIGN, RTL_MEMALIGN); 199 200int index = (size - 1) >> RTL_MEMALIGN_SHIFT; 201OSL_ASSERT(RTL_MEMALIGN >= sizeof(sal_Size)); 202 203try_alloc: 204if (index < RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SHIFT) 205addr = (char*)rtl_cache_alloc(g_alloc_table[index]); 206else 207addr = (char*)rtl_arena_alloc (gp_alloc_arena, &size); 208 在198行,如果n> UINT_MAX - RTL_MEMALIGN的话n + RTL_MEMALIGN计算就可能溢出,导致在try_alloc分配了不充分的缓冲区,然后将这个缓冲区返回给了调用函数。由于调用函数所认为缓冲区大小比实际大小大得多,因此可能触发堆溢出。
OpenOffice(OOo)是美国阿帕奇(Apache)软件基金会的一款开源的办公软件套件。该套件包含文本文档、电子表格、演示文稿、绘图、数据库等。 OpenOffice的rtl_allocateMemory()函数没有执行整数溢出检查便以8字节为边界环绕分配请求,以下是sal/rtl/source/alloc_global.c中的漏洞代码: 191void * 192SAL_CALL rtl_allocateMemory (sal_Size n) 193{ 194void * p = 0; 195if (n > 0) 196{ 197addr; 198 size = RTL_MEMORY_ALIGN(n + RTL_MEMALIGN, RTL_MEMALIGN); 199 200int index = (size - 1) >> RTL_MEMALIGN_SHIFT; 201OSL_ASSERT(RTL_MEMALIGN >= sizeof(sal_Size)); 202 203try_alloc: 204if (index < RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SHIFT) 205addr = (char*)rtl_cache_alloc(g_alloc_table[index]); 206else 207addr = (char*)rtl_arena_alloc (gp_alloc_arena, &size); 208 在198行,如果n> UINT_MAX - RTL_MEMALIGN的话n + RTL_MEMALIGN计算就可能溢出,导致在try_alloc分配了不充分的缓冲区,然后将这个缓冲区返回给了调用函数。由于调用函数所认为缓冲区大小比实际大小大得多,因此可能触发堆溢出。