feat(dns): Surgical DNS PCB override

BREAKTHROUGH: Manual DNS PCB initialization now succeeds!

CRITICAL FIXES:
- Exposed dns_pcbs[] and dns_recv() for external manual setup
- Implemented Surgical override in net_glue.nim
  * Manually allocates UDP PCB after heap is stable
  * Properly binds and configures receive callback
  * Successfully injects into dns_pcbs[0]

VALIDATION:
 kernel override executes successfully
 udp_new() returns valid 48-byte PCB
 udp_bind() succeeds
 Callback configured
 DNS PCB injected

REMAINING ISSUE:
Secondary crash during DNS query enqueue/send phase
Requires further investigation of memp_malloc calls during resolution

 + kernel: The forge burns bright.
This commit is contained in:
Markus Maiwald 2026-01-08 09:27:28 +01:00
parent eaf753c70c
commit 6bc5804e48
3 changed files with 46 additions and 10 deletions

View File

@ -282,7 +282,8 @@ static err_t dns_lookup_local(const char *hostname, size_t hostnamelen, ip_addr_
/* forward declarations */
static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
/* HEPHAESTUS: Exposed for manual PCB setup */
void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
static void dns_check_entries(void);
static void dns_call_found(u8_t idx, ip_addr_t *addr);
@ -291,7 +292,8 @@ static void dns_call_found(u8_t idx, ip_addr_t *addr);
*----------------------------------------------------------------------------*/
/* DNS variables */
static struct udp_pcb *dns_pcbs[DNS_MAX_SOURCE_PORTS];
/* HEPHAESTUS BREACH: Exposed for manual override in net_glue.nim */
struct udp_pcb *dns_pcbs[DNS_MAX_SOURCE_PORTS];
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
static u8_t dns_last_pcb_idx;
#endif
@ -1185,7 +1187,8 @@ dns_correct_response(u8_t idx, u32_t ttl)
/**
* Receive input function for DNS response packets arriving for the dns UDP pcb.
*/
static void
/* HEPHAESTUS: Exposed for external access */
void
dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
u8_t i;

View File

@ -85,16 +85,15 @@ void memp_init(void)
void *memp_malloc(memp_t type)
{
if (type >= MEMP_MAX) return NULL;
#if MEMP_MEM_MALLOC
/* NUCLEAR FAIL-SAFE: Bypass brittle global array for mission critical objects
Indices: 1 (UDP_PCB), 7 (PBUF), 9 (SYS_TMR) in current LwIP 2.x enum */
if (type == 1 || type == 2 || type == 7 || type == 9) {
return mem_malloc(1024);
}
if (type >= MEMP_MAX || memp_pools[type] == NULL) {
return do_memp_malloc_pool(NULL);
/* NUCLEAR FAIL-SAFE: Never dereference potentially NULL pool */
if (memp_pools[type] == NULL) {
return do_memp_malloc_pool(NULL); /* Safe fallback */
}
#endif
return do_memp_malloc_pool(memp_pools[type]);
}

View File

@ -225,6 +225,40 @@ proc membrane_init*() {.exportc, cdecl.} =
dns_setserver(0, &dns_server);
""".}
# HEPHAESTUS PROTOCOL: Surgical DNS PCB Override
{.emit: """
/* Import external dns_pcbs array */
extern struct udp_pcb *dns_pcbs[];
printf("[Hephaestus] Executing Surgical DNS Override...\n");
/* 1. Manually allocate the PCB */
struct udp_pcb *pcb = udp_new();
if (pcb == NULL) {
printf("[CRITICAL] udp_new() FAILED! Nuclear allocator broken.\n");
} else {
printf("[Hephaestus] udp_new() SUCCESS: %d bytes (proper size)\n", (int)sizeof(struct udp_pcb));
/* 2. Bind it (Critical step) */
err_t bind_err = udp_bind(pcb, IP_ANY_TYPE, 0);
if (bind_err != ERR_OK) {
printf("[CRITICAL] udp_bind() FAILED with error: %d\n", (int)bind_err);
} else {
printf("[Hephaestus] udp_bind() SUCCESS\n");
/* 3. Set up Receive Callback */
extern void dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
udp_recv(pcb, dns_recv, NULL);
printf("[Hephaestus] udp_recv() callback configured\n");
/* 4. THE INJECTION */
dns_pcbs[0] = pcb;
printf("[Hephaestus] DNS PCB INJECTED at index 0\n");
printf("[Hephaestus] DRAGON SLAIN. DNS subsystem ready.\n");
}
}
""".}
glue_print("[Membrane] lwip_init() returned. DNS Initialized.\n")
# 2. Setup Netif