Hi,
使用 resty/upload.lua 时, 在32位系统上传文件 超出4G 会被截断。
比如我上传文件是 4.05GB 的文件, 最终上传的buffer 只有 50M, 然后最终是错误返回 client aborted。
ngx_http_lua_socket_tcp.h :
struct ngx_http_lua_socket_tcp_upstream_s {
......
size_t length;
size_t rest;
......
}


我想应该需要将 size_t  改为  off_t  ,  ngx_http_lua_socket_tcp.c:   有关 (size_t) 的转换去除。
4 days later

好像有道理,你本地修改验证一下的呢,看看可以修复不?

16 days later

doujiang24 我验证了一下,可以修复,我就是把 关联的 size_t 改为 off_t ,然后问题解决。
目前测在实际生产环境 跑了 2周,没发现什么问题

11 days later
13 days later
13 days later

eagle-china
我的改动是将 ngx_http_lua_socket_tcp.c: 有关 (size_t) 的转换去除, 测试时是OK,
与patch(https://github.com/openresty/lua-nginx-module/pull/1756) 改动一样,
但是我看到 有一些地方有 赋值, 有一些地方 u->length = bytes; u->rest = u->length;
为了安全起见, 我想应该 也要一起把 size_t 改成 off_t , 我没深入研究,只是从 变量赋值的角度去看 应该需要改它.

    nginx 中的 ngx_http_request_t->request_body->size 是 off_t 类型,但是 nginx中定义了宏 #define _FILE_OFFSET_BITS 64, 这样编译的时候 32 位上系统也使用的 off64_t, 但是size_t 依旧是32 位的。应该是这个道理
    不过貌似 off_t 是long 类型, size_t 是unsigned int 类型,比较也有问题

      Write a Reply...