Skip to content

Commit 241ba2b

Browse files
notrojclaude
andcommitted
* test/modules/filters/test_003_sed.py (TestSed.configure): Check a
failing configuration with httpd -t, and return its stderr; apachectl_stderr is not set on Windows. (test_filters_003_32, test_filters_003_35, test_filters_003_38, test_filters_003_39, test_filters_003_40, test_filters_003_42, test_filters_003_44, test_filters_003_45, test_filters_003_46): Use it. * changes-entries/sed-fixes.txt: Add entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 59ca067 commit 241ba2b

2 files changed

Lines changed: 31 additions & 28 deletions

File tree

‎changes-entries/sed-fixes.txt‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*) mod_sed: Reject malformed scripts which were accepted before, handle
2+
bytes with the high bit set as delimiters and in y commands, filter a
3+
request body read a line at a time, and drop the request Content-Length
4+
once InputSed alters the body. [Joe Orton]

‎test/modules/filters/test_003_sed.py‎

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,14 @@ def configure(self, env, exprs, extra="", input_sed=False, fails=False):
103103
conf.add_vhost_test1()
104104
conf.install()
105105
if fails:
106-
assert env.apache_restart() != 0, f"{exprs}: accepted"
107-
return
106+
# Check the configuration with httpd -t, which reports the error
107+
# on stderr on every platform; the server is not restarted.
108+
r = env.run([os.path.join(env.bin_dir, "httpd"),
109+
"-d", env.server_dir,
110+
"-f", os.path.join(env.server_dir, "conf",
111+
"httpd.conf"), "-t"])
112+
assert r.exit_code != 0, f"{exprs}: accepted"
113+
return r.stderr
108114
assert env.apache_restart() == 0
109115

110116
def get(self, env, path="/sed.html", options=None):
@@ -430,9 +436,8 @@ def test_filters_003_31(self, env, expr, out):
430436
r"s/a\{1\}\{2,30\}/X/",
431437
])
432438
def test_filters_003_32(self, env, expr):
433-
self.configure(env, expr, fails=True)
434-
assert "not allowed here" in env.apachectl_stderr, \
435-
env.apachectl_stderr
439+
err = self.configure(env, expr, fails=True)
440+
assert "not allowed here" in err, err
436441

437442
# --- backreferences to groups -----------------------------------------
438443

@@ -444,8 +449,8 @@ def test_filters_003_32(self, env, expr):
444449
r"s/\(a\1\)/X/",
445450
])
446451
def test_filters_003_35(self, env, expr):
447-
self.configure(env, expr, fails=True)
448-
assert "out of range" in env.apachectl_stderr, env.apachectl_stderr
452+
err = self.configure(env, expr, fails=True)
453+
assert "out of range" in err, err
449454

450455
# A backreference to a closed group, even with a later group still open.
451456
def test_filters_003_36(self, env):
@@ -462,8 +467,8 @@ def test_filters_003_37(self, env):
462467

463468
# Any deeper is rejected.
464469
def test_filters_003_38(self, env):
465-
self.configure(env, ["{" * 21 + "p"] + ["}"] * 21, fails=True)
466-
assert "too many {'s" in env.apachectl_stderr, env.apachectl_stderr
470+
err = self.configure(env, ["{" * 21 + "p"] + ["}"] * 21, fails=True)
471+
assert "too many {'s" in err, err
467472

468473
# --- bracket expressions ----------------------------------------------
469474

@@ -474,8 +479,8 @@ def test_filters_003_38(self, env):
474479
["s/aaaa]*/b/", "s/[a-"],
475480
])
476481
def test_filters_003_39(self, env, exprs):
477-
self.configure(env, exprs, fails=True)
478-
assert "imbalance" in env.apachectl_stderr, env.apachectl_stderr
482+
err = self.configure(env, exprs, fails=True)
483+
assert "imbalance" in err, err
479484

480485
# --- unterminated expressions -----------------------------------------
481486

@@ -486,9 +491,8 @@ def test_filters_003_39(self, env, exprs):
486491
["s/aaaa/b/", "s/a"],
487492
])
488493
def test_filters_003_40(self, env, exprs):
489-
self.configure(env, exprs, fails=True)
490-
assert "missing delimiter" in env.apachectl_stderr, \
491-
env.apachectl_stderr
494+
err = self.configure(env, exprs, fails=True)
495+
assert "missing delimiter" in err, err
492496

493497
# --- delimiters -------------------------------------------------------
494498

@@ -502,9 +506,8 @@ def test_filters_003_41(self, env):
502506
# An s or y command which ends before its delimiter is rejected.
503507
@pytest.mark.parametrize("expr", ["s", "/monday/s", "y", "/monday/y"])
504508
def test_filters_003_42(self, env, expr):
505-
self.configure(env, expr, fails=True)
506-
assert "command garbled" in env.apachectl_stderr, \
507-
env.apachectl_stderr
509+
err = self.configure(env, expr, fails=True)
510+
assert "command garbled" in err, err
508511

509512
# y maps bytes with the high bit set like any other.
510513
def test_filters_003_43(self, env):
@@ -517,11 +520,9 @@ def test_filters_003_43(self, env):
517520
# rejected without writing past the buffer. Only a memory checker sees
518521
# the difference.
519522
def test_filters_003_44(self, env):
520-
self.configure(env, [f"r {'A' * 998}"] * 10 + ["r 123456789",
521-
"/x/p"],
522-
fails=True)
523-
assert "too much command text" in env.apachectl_stderr, \
524-
env.apachectl_stderr
523+
err = self.configure(env, [f"r {'A' * 998}"] * 10
524+
+ ["r 123456789", "/x/p"], fails=True)
525+
assert "too much command text" in err, err
525526

526527
# An interval count is rejected as too large however many digits it
527528
# has, rather than wrapping around.
@@ -531,17 +532,15 @@ def test_filters_003_44(self, env):
531532
r"s/o\{1,4294967298\}/X/",
532533
])
533534
def test_filters_003_45(self, env, expr):
534-
self.configure(env, expr, fails=True)
535-
assert "Range endpoint too large" in env.apachectl_stderr, \
536-
env.apachectl_stderr
535+
err = self.configure(env, expr, fails=True)
536+
assert "Range endpoint too large" in err, err
537537

538538
# A line number too large for a 64-bit count is rejected rather than
539539
# wrapping around; one which fits, but which no document reaches, is
540540
# accepted.
541541
def test_filters_003_46(self, env):
542-
self.configure(env, "99999999999999999999p", fails=True)
543-
assert "command garbled" in env.apachectl_stderr, \
544-
env.apachectl_stderr
542+
err = self.configure(env, "99999999999999999999p", fails=True)
543+
assert "command garbled" in err, err
545544

546545
def test_filters_003_47(self, env):
547546
assert self.body(env, "9223372036854775807d").decode() == DOC

0 commit comments

Comments
 (0)