annotate src/http/modules/ngx_http_ssi_filter_module.h @ 8102:49e7db44b57c

SSI: handling of subrequests from other modules (ticket #1263). As the SSI parser always uses the context from the main request for storing variables and blocks, that context should always exist for subrequests using SSI, even though the main request does not necessarily have SSI enabled. However, `ngx_http_get_module_ctx(r->main, ...)` is getting NULL in such cases, resulting in the worker crashing SIGSEGV when accessing its attributes. This patch links the first initialized context to the main request, and upgrades it only when main context is initialized.
author Ciel Zhao <i@ciel.dev>
date Mon, 21 Nov 2022 17:01:34 +0300
parents d620f497c50f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4381
diff changeset
4 * Copyright (C) Nginx, Inc.
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #ifndef _NGX_HTTP_SSI_FILTER_H_INCLUDED_
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #define _NGX_HTTP_SSI_FILTER_H_INCLUDED_
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 #include <ngx_config.h>
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 #include <ngx_core.h>
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 #include <ngx_http.h>
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
1545
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
17 #define NGX_HTTP_SSI_MAX_PARAMS 16
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
1545
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
19 #define NGX_HTTP_SSI_COMMAND_LEN 32
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
20 #define NGX_HTTP_SSI_PARAM_LEN 32
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
21 #define NGX_HTTP_SSI_PARAMS_N 4
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23
1545
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
24 #define NGX_HTTP_SSI_COND_IF 1
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
25 #define NGX_HTTP_SSI_COND_ELSE 2
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
26
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
27
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
28 #define NGX_HTTP_SSI_NO_ENCODING 0
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
29 #define NGX_HTTP_SSI_URL_ENCODING 1
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
30 #define NGX_HTTP_SSI_ENTITY_ENCODING 2
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
31
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
32
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 typedef struct {
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 ngx_hash_t hash;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 ngx_hash_keys_arrays_t commands;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 } ngx_http_ssi_main_conf_t;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 typedef struct {
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ngx_buf_t *buf;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 u_char *pos;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 u_char *copy_start;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 u_char *copy_end;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 ngx_uint_t key;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 ngx_str_t command;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 ngx_array_t params;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 ngx_table_elt_t *param;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 ngx_table_elt_t params_array[NGX_HTTP_SSI_PARAMS_N];
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 ngx_chain_t *in;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 ngx_chain_t *out;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 ngx_chain_t **last_out;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 ngx_chain_t *busy;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 ngx_chain_t *free;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 ngx_uint_t state;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 ngx_uint_t saved_state;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 size_t saved;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 size_t looked;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 size_t value_len;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64
777
4ab852b691f5 <!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents: 758
diff changeset
65 ngx_list_t *variables;
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 645
diff changeset
66 ngx_array_t *blocks;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
4381
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
68 #if (NGX_PCRE)
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
69 ngx_uint_t ncaptures;
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
70 int *captures;
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
71 u_char *captures_data;
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
72 #endif
e9a0427f4139 SSI: added regex captures support in the expression of the "if" command.
Valentin Bartenev <vbart@nginx.com>
parents: 1545
diff changeset
73
8102
49e7db44b57c SSI: handling of subrequests from other modules (ticket #1263).
Ciel Zhao <i@ciel.dev>
parents: 4412
diff changeset
74 unsigned shared:1;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
75 unsigned conditional:2;
1545
2d8fab47dd89 SSI echo encoding
Igor Sysoev <igor@sysoev.ru>
parents: 777
diff changeset
76 unsigned encoding:2;
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 645
diff changeset
77 unsigned block:1;
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
78 unsigned output:1;
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
79 unsigned output_chosen:1;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80
758
86bb73dc8d40 fix <!--#include virtual=... wait="yes" -->
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
81 ngx_http_request_t *wait;
609
608cf78b24ef nginx-0.3.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 597
diff changeset
82 void *value_buf;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_str_t timefmt;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_str_t errmsg;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 } ngx_http_ssi_ctx_t;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 typedef ngx_int_t (*ngx_http_ssi_command_pt) (ngx_http_request_t *r,
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_http_ssi_ctx_t *ctx, ngx_str_t **);
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 typedef struct {
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 ngx_str_t name;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_uint_t index;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 unsigned mandatory:1;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 unsigned multiple:1;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 } ngx_http_ssi_param_t;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 typedef struct {
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_str_t name;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 ngx_http_ssi_command_pt handler;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 ngx_http_ssi_param_t *params;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
629
65bf042c0b4f nginx-0.3.36-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 609
diff changeset
106 unsigned conditional:2;
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 645
diff changeset
107 unsigned block:1;
597
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 unsigned flush:1;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 } ngx_http_ssi_command_t;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 extern ngx_module_t ngx_http_ssi_filter_module;
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
9262f520ce21 nginx-0.3.20-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 #endif /* _NGX_HTTP_SSI_FILTER_H_INCLUDED_ */