|
53 | 53 | import org.apache.catalina.util.IOTools;
|
54 | 54 | import org.apache.juli.logging.Log;
|
55 | 55 | import org.apache.juli.logging.LogFactory;
|
| 56 | +import org.apache.naming.resources.JrePlatform; |
56 | 57 | import org.apache.tomcat.util.res.StringManager;
|
57 | 58 |
|
58 | 59 |
|
@@ -248,10 +249,21 @@ public final class CGIServlet extends HttpServlet {
|
248 | 249 | private static final long serialVersionUID = 1L;
|
249 | 250 |
|
250 | 251 | private static final Set<String> DEFAULT_SUPER_METHODS = new HashSet<String>();
|
| 252 | + private static final Pattern DEFAULT_CMD_LINE_ARGUMENTS_DECODED_PATTERN; |
| 253 | + private static final String ALLOW_ANY_PATTERN = ".*"; |
| 254 | + |
251 | 255 | static {
|
252 | 256 | DEFAULT_SUPER_METHODS.add("HEAD");
|
253 | 257 | DEFAULT_SUPER_METHODS.add("OPTIONS");
|
254 | 258 | DEFAULT_SUPER_METHODS.add("TRACE");
|
| 259 | + |
| 260 | + if (JrePlatform.IS_WINDOWS) { |
| 261 | + DEFAULT_CMD_LINE_ARGUMENTS_DECODED_PATTERN = Pattern.compile("[a-zA-Z0-9\\Q-_.\\/:\\E]+"); |
| 262 | + } else { |
| 263 | + // No restrictions |
| 264 | + DEFAULT_CMD_LINE_ARGUMENTS_DECODED_PATTERN = null; |
| 265 | + } |
| 266 | + |
255 | 267 | }
|
256 | 268 |
|
257 | 269 |
|
@@ -317,6 +329,14 @@ public final class CGIServlet extends HttpServlet {
|
317 | 329 | private Pattern cmdLineArgumentsEncodedPattern =
|
318 | 330 | Pattern.compile("[a-zA-Z0-9\\Q%;/?:@&,$-_.!~*'()\\E]+");
|
319 | 331 |
|
| 332 | + /** |
| 333 | + * Limits the decoded form of individual command line arguments. Default |
| 334 | + * varies by platform. |
| 335 | + */ |
| 336 | + private Pattern cmdLineArgumentsDecodedPattern = DEFAULT_CMD_LINE_ARGUMENTS_DECODED_PATTERN; |
| 337 | + |
| 338 | + |
| 339 | + |
320 | 340 | /**
|
321 | 341 | * Sets instance variables.
|
322 | 342 | * <P>
|
@@ -414,6 +434,14 @@ public void init(ServletConfig config) throws ServletException {
|
414 | 434 | cmdLineArgumentsEncodedPattern =
|
415 | 435 | Pattern.compile(getServletConfig().getInitParameter("cmdLineArgumentsEncoded"));
|
416 | 436 | }
|
| 437 | + |
| 438 | + String value = getServletConfig().getInitParameter("cmdLineArgumentsDecoded"); |
| 439 | + if (ALLOW_ANY_PATTERN.equals(value)) { |
| 440 | + // Optimisation for case where anything is allowed |
| 441 | + cmdLineArgumentsDecodedPattern = null; |
| 442 | + } else if (value != null) { |
| 443 | + cmdLineArgumentsDecodedPattern = Pattern.compile(value); |
| 444 | + } |
417 | 445 | }
|
418 | 446 |
|
419 | 447 |
|
@@ -817,7 +845,17 @@ protected boolean setupFromRequest(HttpServletRequest req)
|
817 | 845 | }
|
818 | 846 | return false;
|
819 | 847 | }
|
| 848 | + |
820 | 849 | String decodedArgument = URLDecoder.decode(encodedArgument, parameterEncoding);
|
| 850 | + if (cmdLineArgumentsDecodedPattern != null && |
| 851 | + !cmdLineArgumentsDecodedPattern.matcher(decodedArgument).matches()) { |
| 852 | + if (log.isDebugEnabled()) { |
| 853 | + log.debug(sm.getString("cgiServlet.invalidArgumentDecoded", |
| 854 | + decodedArgument, cmdLineArgumentsDecodedPattern.toString())); |
| 855 | + } |
| 856 | + return false; |
| 857 | + } |
| 858 | + |
821 | 859 | cmdLineParameters.add(decodedArgument);
|
822 | 860 | }
|
823 | 861 | }
|
@@ -1126,7 +1164,6 @@ protected boolean setCGIEnvironment(HttpServletRequest req) throws IOException {
|
1126 | 1164 | this.env = envp;
|
1127 | 1165 |
|
1128 | 1166 | return true;
|
1129 |
| - |
1130 | 1167 | }
|
1131 | 1168 |
|
1132 | 1169 | /**
|
|
0 commit comments