文件协程fseek ftell 文件大于2G bug

启用文件协程后对于大于2G的文件fseek 和ftell 会造成错误

<?php
Swoole\Runtime::enableCoroutine();
Co\run(function () {
    $fp=fopen("/tmp/555","r+");
    fseek($fp,2147724448,SEEK_SET);
    echo ftell($fp);    
});

输出结果:
-2147242848

修改 plain_wrapper.c 389行

if (data->fd >= 0)
    {
        zend_off_t result;
        //result = lseek(data->fd, offset, whence); 此行 lseek修改为lseek64 重新编译
        result = lseek64(data->fd, offset, whence);
        if (result == (zend_off_t) -1)
            return -1;

        *newoffset = result;
        return 0;

    }
阅读 3.6k
3 个回答

实际上,以 32位无符号整数来看, -21472428482147724448 相等。

建议补丁至git

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进