| 114 | } |
| 115 | |
| 116 | AP_DECLARE(apr_size_t) ap_fcgi_encoded_env_len(apr_table_t *env, |
| 117 | apr_size_t maxlen, |
| 118 | int *starting_elem) |
| 119 | { |
| 120 | const apr_array_header_t *envarr; |
| 121 | const apr_table_entry_t *elts; |
| 122 | apr_size_t envlen, actualenvlen; |
| 123 | int i; |
| 124 | |
| 125 | if (maxlen > AP_FCGI_MAX_CONTENT_LEN) { |
| 126 | maxlen = AP_FCGI_MAX_CONTENT_LEN; |
| 127 | } |
| 128 | |
| 129 | envarr = apr_table_elts(env); |
| 130 | elts = (const apr_table_entry_t *) envarr->elts; |
| 131 | |
| 132 | /* envlen - speculative, may overflow the limit |
| 133 | * actualenvlen - len required without overflowing |
| 134 | */ |
| 135 | envlen = actualenvlen = 0; |
| 136 | for (i = *starting_elem; i < envarr->nelts; ) { |
| 137 | apr_size_t keylen, vallen; |
| 138 | |
| 139 | if (!elts[i].key) { |
| 140 | (*starting_elem)++; |
| 141 | i++; |
| 142 | continue; |
| 143 | } |
| 144 | |
| 145 | keylen = strlen(elts[i].key); |
| 146 | |
| 147 | if (keylen >> 7 == 0) { |
| 148 | envlen += 1; |
| 149 | } |
| 150 | else { |
| 151 | envlen += 4; |
| 152 | } |
| 153 | |
| 154 | envlen += keylen; |
| 155 | |
| 156 | vallen = elts[i].val ? strlen(elts[i].val) : 0; |
| 157 | |
| 158 | if (vallen >> 7 == 0) { |
| 159 | envlen += 1; |
| 160 | } |
| 161 | else { |
| 162 | envlen += 4; |
| 163 | } |
| 164 | |
| 165 | envlen += vallen; |
| 166 | |
| 167 | if (envlen > maxlen) { |
| 168 | break; |
| 169 | } |
| 170 | |
| 171 | actualenvlen = envlen; |
| 172 | (*starting_elem)++; |
| 173 | i++; |
no outgoing calls
no test coverage detected