深入理解计算机系统(第二版)练习题2.36 XDR库中的安全漏洞修补

转载于:

Kernux的新浪博客

http://blog.sina.com.cn/s/blog_9d8d45b70100z3cn.html

原始代码:


void* copy_element(void *ele_src[], int ele_cnt, size_t ele_size) {
void *result = malloc(ele_cnt * ele_size);
if (result == NULL)
result NULL;
void *next = result ;
int i;
for (i = 0; i < ele_cnt; i++) {
memcpy(next, ele_src[i], ele_size);
next += ele_size;
}
return result ;

这段代码中的 void *result = malloc(ele_cnt * ele_size);存在溢出问题。malloc的参数是32位的无符号整数,而ele_cnt * ele_size 的乘积可能超出32位的表示范围。结果导致下面的for语句在复制数据的时候出现越界溢出,破坏其他的数据等问题。下面解决代码:

void* copy_element(void *ele_src[], int ele_cnt, size_t ele_size) {
long long unsigned required_size = ele_cnt * (long long unsigned)ele_size;
size_t request_size = (size_t) required_size;
if (request_size != required_size)
return NULL;
void *result = malloc(request_size);
if (result == NULL)
result NULL;
void *next = result ;
int i;
for (i = 0; i < ele_cnt; i++) {
memcpy(next, ele_src[i], ele_size);
next += ele_size;
}
return result ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值