Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Проблема с if (-x $request_filename)
Hello!
On Mon, Nov 02, 2009 at 03:02:50PM +0300, TJ@xxxxxx 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
# HG changeset patch
# User Maxim Dounin <mdounin@xxxxxxxxxx>
# 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
|