1 定义ngx_file_info_wrapper 函数 定义在 ./nginx-1.24.0/src/core/ngx_open_file_cache.cstaticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log){ngx_int_trc;#if!(NGX_HAVE_OPENAT)rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;#elsengx_fd_tfd;if(of-disable_symlinksNGX_DISABLE_SYMLINKS_OFF){rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}fdngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fdNGX_INVALID_FILE){returnNGX_FILE_ERROR;}rcngx_fd_info(fd,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_fd_info_n;}if(ngx_close_file(fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%V\ failed,name);}returnrc;#endif}ngx_file_info_wrapper 函数是 Nginx 封装的文件元数据获取函数。 它的作用是 根据 disable_symlinks 配置 选择安全的方式获取文件的 stat 信息。 如果允许符号链接直接调用 stat 如果需要禁用符号链接则先通过 open 打开文件遵守符号链接限制 再用 fstat 获取信息最后关闭文件。 同时它会将操作中的错误码和失败阶段记录到 of 中供上层使用。2 详解1 函数签名staticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log)返回值 仅表示系统调用执行是否成功。 成功返回 NGX_OK 失败返回 NGX_FILE_ERROR -1参数1 ngx_str_t *name 文件的完整路径参数2 ngx_open_file_info_t *of 指向 ngx_open_file_info_t 结构体的指针。 这是一个双向参数既携带输入控制信息又承载输出错误信息。参数3 ngx_file_info_t *fi 指向 ngx_file_info_t 结构体的指针这是一个纯粹的输出参数 用于接收文件系统返回的完整元数据信息参数4 ngx_log_t *log 表示当前的日志对象2 逻辑流程1 不支持 openat 2 支持 openat 1 无符号链接限制 直接调用 ngx_file_infostat获取文件信息 2 有符号链接限制{ngx_int_trc;局部变量声明 存储底层系统调用的返回值 统一接收返回值便于后续错误判断和传递1 不支持 openat#if!(NGX_HAVE_OPENAT)rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;如果系统不支持 openat则编译以上代码块。2 支持 openat支持 openat 时#elsengx_fd_tfd;if(of-disable_symlinksNGX_DISABLE_SYMLINKS_OFF){rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}检查是否完全未启用符号链接限制。 逻辑 如果 disable_symlinks 配置为 off 则允许跟随符号链接 此时可直接使用 stat性能更好。直接调用 stat 获取文件信息。若 stat 失败将全局 errno 保存到 of-err 并设置 of-failed 为 stat 字符串标识然后返回错误。 逻辑错误信息由 of 带回调用者可根据 of-err 判断具体原因。return rc; 成功时返回 NGX_OK。 正常路径结束文件信息已填入 fi。需要限制符号链接时fdngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fdNGX_INVALID_FILE){returnNGX_FILE_ERROR;}rcngx_fd_info(fd,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_fd_info_n;}if(ngx_close_file(fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%V\ failed,name);}returnrc;#endif}
ngx_file_info_wrapper
1 定义ngx_file_info_wrapper 函数 定义在 ./nginx-1.24.0/src/core/ngx_open_file_cache.cstaticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log){ngx_int_trc;#if!(NGX_HAVE_OPENAT)rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;#elsengx_fd_tfd;if(of-disable_symlinksNGX_DISABLE_SYMLINKS_OFF){rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}fdngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fdNGX_INVALID_FILE){returnNGX_FILE_ERROR;}rcngx_fd_info(fd,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_fd_info_n;}if(ngx_close_file(fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%V\ failed,name);}returnrc;#endif}ngx_file_info_wrapper 函数是 Nginx 封装的文件元数据获取函数。 它的作用是 根据 disable_symlinks 配置 选择安全的方式获取文件的 stat 信息。 如果允许符号链接直接调用 stat 如果需要禁用符号链接则先通过 open 打开文件遵守符号链接限制 再用 fstat 获取信息最后关闭文件。 同时它会将操作中的错误码和失败阶段记录到 of 中供上层使用。2 详解1 函数签名staticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log)返回值 仅表示系统调用执行是否成功。 成功返回 NGX_OK 失败返回 NGX_FILE_ERROR -1参数1 ngx_str_t *name 文件的完整路径参数2 ngx_open_file_info_t *of 指向 ngx_open_file_info_t 结构体的指针。 这是一个双向参数既携带输入控制信息又承载输出错误信息。参数3 ngx_file_info_t *fi 指向 ngx_file_info_t 结构体的指针这是一个纯粹的输出参数 用于接收文件系统返回的完整元数据信息参数4 ngx_log_t *log 表示当前的日志对象2 逻辑流程1 不支持 openat 2 支持 openat 1 无符号链接限制 直接调用 ngx_file_infostat获取文件信息 2 有符号链接限制{ngx_int_trc;局部变量声明 存储底层系统调用的返回值 统一接收返回值便于后续错误判断和传递1 不支持 openat#if!(NGX_HAVE_OPENAT)rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;如果系统不支持 openat则编译以上代码块。2 支持 openat支持 openat 时#elsengx_fd_tfd;if(of-disable_symlinksNGX_DISABLE_SYMLINKS_OFF){rcngx_file_info(name-data,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}检查是否完全未启用符号链接限制。 逻辑 如果 disable_symlinks 配置为 off 则允许跟随符号链接 此时可直接使用 stat性能更好。直接调用 stat 获取文件信息。若 stat 失败将全局 errno 保存到 of-err 并设置 of-failed 为 stat 字符串标识然后返回错误。 逻辑错误信息由 of 带回调用者可根据 of-err 判断具体原因。return rc; 成功时返回 NGX_OK。 正常路径结束文件信息已填入 fi。需要限制符号链接时fdngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fdNGX_INVALID_FILE){returnNGX_FILE_ERROR;}rcngx_fd_info(fd,fi);if(rcNGX_FILE_ERROR){of-errngx_errno;of-failedngx_fd_info_n;}if(ngx_close_file(fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%V\ failed,name);}returnrc;#endif}