Add Bounded Web Admission Diagnostics
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Compile the entire production diagnostic module with deterministic public-API fakes.
|
||||
|
||||
No TLS, network, scheduler, hardware or real heap/stack measurement is simulated.
|
||||
Lock assertions and injected interleavings test the bounded publication contract.
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
import re
|
||||
import subprocess
|
||||
import tempfile
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
def without_includes(path):
|
||||
return '\n'.join(line for line in path.read_text().splitlines()
|
||||
if not line.startswith(('#include', '#pragma once')))
|
||||
|
||||
server = (ROOT / 'src/web_server.c').read_text()
|
||||
wrappers = []
|
||||
for name in ('traced_ticket_handler', 'traced_websocket_handler',
|
||||
'traced_admin_ticket_handler', 'traced_admin_upgrade_handler'):
|
||||
match = re.search(r'static esp_err_t ' + name + r'\(httpd_req_t \*request\)\n\{.*?\n\}', server, re.S)
|
||||
assert match, name
|
||||
wrappers.append(match.group())
|
||||
# This slice must not take over cleanup, add async probes, or enable SDK logging.
|
||||
assert 'config.user_cb = web_diagnostics_tls;' in server
|
||||
assert 'config.httpd.close_fn' not in server and 'config.httpd.open_fn' not in server
|
||||
source = (ROOT / 'src/web_diagnostics.c').read_text()
|
||||
for forbidden in ('httpd_queue_work', 'httpd_get_client_list', 'esp_event_handler_register',
|
||||
'httpd_req_get_', 'request->uri', 'request->user_ctx', 'request->sess_ctx',
|
||||
'malloc(', 'calloc(', 'xTaskCreate', 'ESP_LOG', 'esp_log_level_set'):
|
||||
assert forbidden not in source, forbidden
|
||||
|
||||
with tempfile.TemporaryDirectory(prefix='web-diagnostics-') as directory:
|
||||
directory = Path(directory)
|
||||
unit = directory / 'test.c'
|
||||
unit.write_text((HERE / 'fakes.h').read_text() + '\n' +
|
||||
without_includes(ROOT / 'src/web_diagnostics.h') + '\n' +
|
||||
without_includes(ROOT / 'src/web_diagnostics.c') + '\n' +
|
||||
'\n'.join(wrappers) + '\n' + (HERE / 'test.c').read_text())
|
||||
executable = directory / 'test'
|
||||
subprocess.run([os.environ.get('CC', 'cc'), '-std=c11', '-Wall', '-Wextra', '-Werror',
|
||||
str(unit), '-o', str(executable)], check=True)
|
||||
subprocess.run([str(executable)], check=True)
|
||||
print('PASS: production integration/secrecy source guards (1 group)')
|
||||
Reference in New Issue
Block a user