mirror of
https://github.com/knutwurst/patchdl.git
synced 2026-10-06 07:00:26 +02:00
queue_buffer leaked the MUST_FREE payload (every queue_json_owned/ build_*_json/strdup(resp)) when MHD_create_response_from_buffer hit OOM. The MUST_FREE contract hands ownership to MHD only on success — on the NULL return path the caller still owns the buffer, so free it before bailing. Critical under memory pressure where the first OOM turns into a cascade. patchdl_websrv_stop walked the verxml thread + workers but never freed the remaining dl_job_t entries or g_debug_json. Today main never calls the function, but the early-failure path inside patchdl_websrv_start does, and any later graceful-shutdown work would hit the same leak. Drain g_pool.jobs through free_job_locked under the pool lock; free g_debug_json under g_mutex. RAM caps: - MHD: CONNECTION_LIMIT 64 -> 8 (single-user UI), and THREAD_STACK_SIZE = 512 KB. THREAD_PER_CONNECTION on libc's default pthread stack (multi-MB) was reserving hundreds of MB of VM per burst; the largest stack frame in any handler is the 8 KB sidecar buffer, so 512 KB is generous even with curl + openssl in the path. - patchdl_buf_t caps: manifest 64 -> 16 MiB, version.xml 16 -> 4 MiB. Real PS5 manifests are 1-2 MiB; the old caps allowed 64 MiB per fetch with multiple fetches possible in flight. - patchdl_install_status_json: ai_install_status_t (2 KB pad) moves from the MHD worker stack to a calloc/free pair so a polling browser doesn't keep committing pages on each /api/installstatus tick. - seed_from_sidecar: 16 KB stack buf -> 8 KB. 4096-piece cap fits with the JSON wrapper inside 8 KB. No functional changes; download/install/scan/tile paths unaffected.