On 11/21/2011 4:24 PM, s...@apache.org wrote:
Author: sf
Date: Mon Nov 21 22:24:12 2011
New Revision: 1204730

URL: http://svn.apache.org/viewvc?rev=1204730&view=rev
Log:
Merge r1204087, 1204090:

Limit recursion in ap_expr evaluation to avoid unbounded stack usage
* evaluate chains of ||,&&, and string concatenation non-recursively
* limit other types of recursion to 20 levels
* avoid some string copies if concatenating more than 2 strings

URL: 
http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/server/util_expr_eval.c?rev=1204730&r1=1204729&r2=1204730&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/server/util_expr_eval.c (original)
+++ httpd/httpd/branches/2.4.x/server/util_expr_eval.c Mon Nov 21 22:24:12 2011
@@ -56,10 +56,30 @@ static void expr_dump_tree(const ap_expr
                             int loglevel, int indent);
  #endif

+/*
+ * To reduce counting overhead, we only count calls to
+ * ap_expr_eval_word() and ap_expr_eval(). The max number of
+ * stack frames is larger by some factor.
+ */
+#define AP_EXPR_MAX_RECURSION   20
+static int inc_rec(ap_expr_eval_ctx_t *ctx)
+{
+    if (ctx->reclvl<  AP_EXPR_MAX_RECURSION) {
+        ctx->reclvl++;
+        return 0;
+    }
+    *ctx->err = "Recursion limit reached";
+    /* short circuit further evaluation */
+    ctx->reclvl = INT_MAX;

When did this project adopt Posix99?  Not that I'm complaining
but that isn't a K&R construct (and this is the first such breakage
that I'm aware of.)

Reply via email to