malloc 和 memcpy 的漏洞

Vulnerability of malloc and memcpy

void *copy_elements(void *ele_src[], int ele_cnt, size_t ele_size) 
{ 
    /*
     * Allocate buffer for ele_cnt objects, each of ele_size bytes 
     * and copy from locations designated by ele_src
     */

    void *result = malloc(ele_cnt * ele_size); 

    if (result == NULL)
        /* malloc failed */
        return NULL; 
   
    void *next = result;
    int i;

    for (i = 0; i < ele_cnt; i++) {
        /* Copy object i to destination */ 
        memcpy(next, ele_src[i], ele_size);
        /* Move pointer to next memory region */ 
        next += ele_size;
    }

    return result; 
}

以上代码存在漏洞问题。在某些 ele_cntele_size 值下,代码可能会崩溃。我怀疑它与 mallocmemcpy 发生的无符号 - 有符号转换有关,但我不确定如何正确利用它。如有帮助,将不胜感激!

我觉得下一个问题是+= ele_size不是你想的那样。添加指针时,它会自动与偏移量相乘。您可以在 for 循环中打印下一个值,以便您可以使用 printf("%p", next)

检查它是否为真

发布的代码存在多个问题:

  • 由于 ele_cnt 是用有符号类型定义的,因此应该测试传递的值是负数还是零,并且 return NULL 无需尝试分配大量内存,这可能会导致运行时错误。
  • 对于防御性编码,ele_size 也不应为零。
  • next += ele_size; 无效,因为 next 具有 void * 类型。一些编译器允许它作为扩展,但代码不可移植。
  • 一次复制一个元素效率低下,一次调用 memcpy 就足够了。

这是修改后的版本:

#include <stdlib.h>
#include <string.h>

void *copy_elements(const void *ele_src[], int ele_cnt, size_t ele_size) 
{ 
    /*
     * Allocate buffer for ele_cnt objects, each of ele_size bytes 
     * and copy from locations designated by ele_src
     */
    void *result;

    if (ele_cnt <= 0 || ele_size == 0) {
        /* invalid arguments */
        return NULL;
    }

    if ((result = malloc(ele_cnt * ele_size)) == NULL) {
        /* malloc failure */
        return NULL;
    }

    /* copy all elements with a single call to memcpy */
    return memcpy(result, ele_src, ele_cnt * ele_size);   
}