Проблема с if (-x $request_filename)

Maxim Dounin mdounin at mdounin.ru
Mon Nov 2 16:10:21 MSK 2009


Hello!

On Mon, Nov 02, 2009 at 03:02:50PM +0300, TJ at dir.bg wrote:

> Приветствую!
> 
> 
> Кусок конфига (ссылка на доки
> http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html):
> ..
>                location /chkimg/
>                {
>                        root /var/projects/www/test;
> 
>                        log_format      imgtestlog
>                            '"$request" $status $body_bytes_sent '
>                            '"$http_referer" "$chk_img"
> "$request_filename"';
> 
>                        access_log      /var/log/nginx/imgtest.log
> imgtestlog;
> 
>                        if (-x $request_filename)
>                        {
>                                set $chk_img 1;
>                        }
> 
>                        if ($chk_img)
>                        {
>                                return 403;
>                        }
>                }
> ..
> 
> При запросе файла (картинки jpeg) с установленным аттрибутом
> исполнения (chmod +x) - эффект нулевой, т.е. отдается содержимое
> файла. В логе - правильный request_filename и пустая $chk_img.
> Соответственно ожидаемо отдается файл без такого аттрибута.
> 
> Подобная ситуация, когда -x заменяю на !-x и запрашиваю файл с
> аттрибутом +x и файл без такового - в обоих случаях ошибка 403.
> 
> Ради чистоты эксперимента заменил -x на -e - сразу же получаю 403
> ошибку и в логе $chk_img равна 1.
> 
> Проблема пришла из дебиана и nginx/0.6.32. Решил проверить на
> рабочей тачке с гентой и nginx посвежее nginx/0.7.59, gentoo linux.
> 
> В чем траблы?

Сюрприз: в данном случае виноват не if() сам по себе. :)

Патч.

Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1257167380 -10800
# Node ID 390513ca2454584ec531b48c30441bbbb80aef8d
# Parent  ecbed719d238b2311b3aac80a82a9aa3717e925e
Change ngx_is_exec() to return boolean.

Returning bitmask may be more efficient in some cases, but casting it
to 1-bit wide variable (as done in ngx_open_file_cache.c, the only place
where ngx_is_exec() is currently used) always produce false due to implicit
type conversion.

diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -141,7 +141,7 @@ ngx_int_t ngx_set_file_time(u_char *name
 #define ngx_is_dir(sb)           (S_ISDIR((sb)->st_mode))
 #define ngx_is_file(sb)          (S_ISREG((sb)->st_mode))
 #define ngx_is_link(sb)          (S_ISLNK((sb)->st_mode))
-#define ngx_is_exec(sb)          ((sb)->st_mode & S_IXUSR)
+#define ngx_is_exec(sb)          (((sb)->st_mode & S_IXUSR) == S_IXUSR)
 #define ngx_file_access(sb)      ((sb)->st_mode & 0777)
 #define ngx_file_size(sb)        (sb)->st_size
 #define ngx_file_mtime(sb)       (sb)->st_mtime


More information about the nginx-ru mailing list