Korobov Vladimir via nginx-ru
November 22, 2022 08:52AM
Добрый день.

Статический анализ исходного кода выявил некоторые непонятные для меня места.
ngx_http_proxy_module.c: строка 1489

while (*(uintptr_t *) le.ip) {

lcode = *(ngx_http_script_len_code_pt *) le.ip;
(void) lcode(&le);

for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
lcode = *(ngx_http_script_len_code_pt *) le.ip;
}
le.ip += sizeof(uintptr_t);

if (val_len == 0) {
e.skip = 1;

while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
e.ip += sizeof(uintptr_t);

e.skip = 0;

continue;
}

code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);

*e.pos++ = ':'; *e.pos++ = ' ';

while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
e.ip += sizeof(uintptr_t);

*e.pos++ = CR; *e.pos++ = LF;
}

В этой строке e.ip не проверяется на валидность перед использованием, хотя в этом файле это всегда делается перед использованием. Помогите понять почему?

Подобное происходит в
ngx_http_scgi_module.c: 852
if (skip_empty && val_len == 0) {
e.skip = 1;

while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
e.ip += sizeof(uintptr_t);

e.skip = 0;

continue;
}

#if (NGX_DEBUG)
key = e.pos;
#endif
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);

#if (NGX_DEBUG)
val = e.pos;
#endif
while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
И в ngx_http_uwsgi_module.c : 1069
if (skip_empty && val_len == 0) {
e.skip = 1;

while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}
e.ip += sizeof(uintptr_t);

e.skip = 0;

continue;
}

*e.pos++ = (u_char) (key_len & 0xff);
*e.pos++ = (u_char) ((key_len >> 8) & 0xff);

code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);

*e.pos++ = (u_char) (val_len & 0xff);
*e.pos++ = (u_char) ((val_len >> 8) & 0xff);

while (*(uintptr_t *) e.ip) {
code = *(ngx_http_script_code_pt *) e.ip;
code((ngx_http_script_engine_t *) &e);
}


С уважением,
Владимир Коробов

_______________________________________________
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-leave@nginx.org
Subject Author Posted

Статический анализ nginx

Korobov Vladimir via nginx-ru November 22, 2022 08:52AM

Re: Статический анализ nginx

Maxim Dounin November 22, 2022 09:20AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 211
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready