@@ -36,6 +36,7 @@ static void msc_xml_on_start_elementns(
36
36
xml_parser_state -> pathlen += (taglen + 1 );
37
37
char * newpath = apr_pstrcat (msr -> mp , xml_parser_state -> currpath , "." , (char * )localname , NULL );
38
38
xml_parser_state -> currpath = newpath ;
39
+ xml_parser_state -> currpathbufflen += taglen + 1 ; // +1 for the '.' character here too
39
40
40
41
int * new_stack_item = (int * )apr_array_push (xml_parser_state -> has_child_stack );
41
42
* new_stack_item = 0 ;
@@ -44,6 +45,7 @@ static void msc_xml_on_start_elementns(
44
45
// this is necessary because if there is any text between the tags (new line, etc)
45
46
// it will be added to the current value
46
47
xml_parser_state -> currval = NULL ;
48
+ xml_parser_state -> currvalbufflen = 0 ;
47
49
48
50
// if there is an item before the current one we set that has a child
49
51
if (xml_parser_state -> depth > 1 ) {
@@ -72,8 +74,12 @@ static void msc_xml_on_end_elementns(
72
74
if (apr_table_elts (msr -> arguments )-> nelts >= msr -> txcfg -> arguments_limit ) {
73
75
if (msr -> txcfg -> debuglog_level >= 4 ) {
74
76
msr_log (msr , 4 , "Skipping request argument, over limit (XML): name \"%s\", value \"%s\"" ,
75
- log_escape_ex (msr -> mp , xml_parser_state -> currpath , strlen (xml_parser_state -> currpath )),
76
- log_escape_ex (msr -> mp , xml_parser_state -> currval , strlen (xml_parser_state -> currval )));
77
+ log_escape_ex (msr -> mp , xml_parser_state -> currpath , xml_parser_state -> currpathbufflen ),
78
+ log_escape_ex (msr -> mp ,
79
+ (xml_parser_state -> currval == NULL ? apr_pstrndup (msr -> mp , "" , 1 ) : xml_parser_state -> currval ),
80
+ (xml_parser_state -> currvalbufflen == 0 ? 1 : xml_parser_state -> currvalbufflen )
81
+ )
82
+ );
77
83
}
78
84
msr -> msc_reqbody_error = 1 ;
79
85
msr -> xml -> xml_error = apr_psprintf (msr -> mp , "More than %ld ARGS (GET + XML)" , msr -> txcfg -> arguments_limit );
@@ -84,15 +90,15 @@ static void msc_xml_on_end_elementns(
84
90
msc_arg * arg = (msc_arg * ) apr_pcalloc (msr -> mp , sizeof (msc_arg ));
85
91
86
92
arg -> name = xml_parser_state -> currpath ;
87
- arg -> name_len = strlen ( arg -> name ) ;
88
- arg -> value = xml_parser_state -> currval ;
89
- arg -> value_len = strlen (xml_parser_state -> currval ) ;
93
+ arg -> name_len = xml_parser_state -> currpathbufflen ;
94
+ arg -> value = ( xml_parser_state -> currval == NULL ) ? apr_pstrndup ( msr -> mp , "" , 1 ) : xml_parser_state -> currval ;
95
+ arg -> value_len = (xml_parser_state -> currvalbufflen == 0 ) ? 1 : xml_parser_state -> currvalbufflen ;
90
96
arg -> value_origin_len = arg -> value_len ;
91
97
arg -> origin = "XML" ;
92
98
93
99
if (msr -> txcfg -> debuglog_level >= 9 ) {
94
100
msr_log (msr , 9 , "Adding XML argument '%s' with value '%s'" ,
95
- xml_parser_state -> currpath , xml_parser_state -> currval );
101
+ arg -> name , arg -> value );
96
102
}
97
103
98
104
apr_table_addn (msr -> arguments ,
@@ -106,9 +112,11 @@ static void msc_xml_on_end_elementns(
106
112
// -1 is needed because we don't need the last '.'
107
113
char * newpath = apr_pstrndup (msr -> mp , xml_parser_state -> currpath , xml_parser_state -> pathlen - 1 );
108
114
xml_parser_state -> currpath = newpath ;
115
+ xml_parser_state -> currpathbufflen = xml_parser_state -> pathlen - 1 ;
109
116
110
117
xml_parser_state -> depth -- ;
111
118
xml_parser_state -> currval = NULL ;
119
+ xml_parser_state -> currvalbufflen = 0 ;
112
120
}
113
121
114
122
static void msc_xml_on_characters (void * ctx , const xmlChar * ch , int len ) {
@@ -123,6 +131,7 @@ static void msc_xml_on_characters(void *ctx, const xmlChar *ch, int len) {
123
131
((xml_parser_state -> currval != NULL ) ? xml_parser_state -> currval : "" ),
124
132
apr_pstrndup (msr -> mp , (const char * )ch , len ),
125
133
NULL );
134
+ xml_parser_state -> currvalbufflen += len ;
126
135
// check if the memory allocation was successful
127
136
if (xml_parser_state -> currval == NULL ) {
128
137
msr -> xml -> xml_error = apr_psprintf (msr -> mp , "Failed to allocate memory for XML value." );
@@ -174,8 +183,9 @@ int xml_init(modsec_rec *msr, char **error_msg) {
174
183
msr -> xml -> xml_parser_state -> depth = 0 ;
175
184
msr -> xml -> xml_parser_state -> pathlen = 4 ; // "xml\0"
176
185
msr -> xml -> xml_parser_state -> currpath = apr_pstrdup (msr -> mp , "xml" );
186
+ msr -> xml -> xml_parser_state -> currpathbufflen = 3 ; // "xml"
177
187
msr -> xml -> xml_parser_state -> currval = NULL ;
178
- msr -> xml -> xml_parser_state -> currpathbufflen = 4 ;
188
+ msr -> xml -> xml_parser_state -> currvalbufflen = 0 ;
179
189
// initialize the stack with item of 10
180
190
// this will store the information about nodes
181
191
// 10 is just an initial value, it can be automatically incremented
0 commit comments