svn commit: r1935191 - httpd/httpd/trunk/modules/generators
[email protected] Thu, 11 Jun 2026 11:37:45 -0000
| Newsgroups | gmane.comp.apache.cvs |
|---|---|
| Message-ID | <178117786546.752818.13798705641229581189@svn03-he-fi> |
Author: jorton Date: Thu Jun 11 11:37:45 2026 New Revision: 1935191 Log: * modules/generators/mod_cgid.c (cgid_req_t): Change env_count to unsigned. Define ENV_COUNT_MAX. (get_req): Add upper bounds for uri_len, args_len, and env_count. Validate per-variable length in environment reading loop. Move validation before use of loglevel. Assisted-by: Claude Opus 4.6 <[email protected]> GitHub: PR#669 Modified: httpd/httpd/trunk/modules/generators/mod_cgid.c Modified: httpd/httpd/trunk/modules/generators/mod_cgid.c ============================================================================== --- httpd/httpd/trunk/modules/generators/mod_cgid.c Thu Jun 11 04:20:06 2026 (r1935190) +++ httpd/httpd/trunk/modules/generators/mod_cgid.c Thu Jun 11 11:37:45 2026 (r1935191) @@ -192,6 +192,8 @@ typedef struct { } cgid_rlimit_t; #endif +#define ENV_COUNT_MAX (256) + typedef struct { int req_type; /* request type (CGI_REQ, SSI_REQ, etc.) */ unsigned long conn_id; /* connection id; daemon uses this as a hash value @@ -201,7 +203,7 @@ typedef struct { pid_t ppid; /* sanity check for config problems leading to * wrong cgid socket use */ - int env_count; + unsigned env_count; ap_unix_identity_t ugid; apr_size_t filename_len; apr_size_t argv0_len; @@ -513,6 +515,11 @@ static apr_status_t get_req(int fd, requ if (stat != APR_SUCCESS) { return stat; } + + if (req->loglevel > APLOG_TRACE8) { + return APR_EINVAL; + } + r->server->log.level = req->loglevel; if (req->req_type == GETPID_REQ) { /* no more data sent for this request */ @@ -520,13 +527,14 @@ static apr_status_t get_req(int fd, requ } /* Sanity check the structure received. */ - if (req->env_count < 0 || req->uri_len == 0 - || req->filename_len > APR_PATH_MAX || req->filename_len == 0 - || req->argv0_len > APR_PATH_MAX || req->argv0_len == 0 - || req->loglevel > APLOG_TRACE8) { + if (req->env_count > ENV_COUNT_MAX + || req->filename_len == 0 || req->filename_len > APR_PATH_MAX + || req->argv0_len == 0 || req->argv0_len > APR_PATH_MAX + || req->uri_len == 0 || req->uri_len > APR_PATH_MAX + || req->args_len > APR_PATH_MAX) { return APR_EINVAL; } - + /* handle module indexes and such */ rconf = (void **)ap_create_request_config(r->pool); @@ -560,6 +568,9 @@ static apr_status_t get_req(int fd, requ if ((stat = sock_read(fd, &curlen, sizeof(curlen))) != APR_SUCCESS) { return stat; } + if (curlen > APR_PATH_MAX) { + return APR_EINVAL; + } environ[i] = apr_pcalloc(r->pool, curlen + 1); if ((stat = sock_read(fd, environ[i], curlen)) != APR_SUCCESS) { return stat;