- 论坛徽章:
- 20
|
本帖最后由 nswcfd 于 2016-03-09 18:30 编辑
write(3,...) 应该不是echo命令。
不过,write的count参数,17930862827480475073,也太大了吧。
倒是count太大跟返回-EFAULT关联起来了。vfs_write里面,access_ok检查失败就返回EFAULT。
问题就变成了,count是怎么被改变的?以及返回-EFAULT之后,为什么会循环,这是不是app自身的行为(比如/bin/cp)?
这里还有一点,就是sys_write的返回值:
虽然vfs_write返回<0的错误值,由于楼主替换的函数使用int,导致返回app的返回值是大的正整数。
app在这种情况下的反映是什么?ret=write(...,n),结果返回ret>n?
类似cp的框架通常为:- while (n = read(..., n) > 0) {
- write_n(..., n);
- }
复制代码 其中的write_n可能是- write_n(..., n) {
- total = 0;
- while (total != n) { //<======= 问题可能在于终止条件是!=,而不是>=
- r = write(..., n - total); //<======= n - total存在溢出的可能
- if (r < 0) break;
- total += r; //<======= 把错误值当成正值返回,导致total>n
- }
- }
复制代码 以上只是一种猜想,能否把strace的输出过滤一下(比如去重),看看是怎么从最开始合理的write call变成最后的样子的?
|
|