| 177 | } |
| 178 | |
| 179 | AP_DECLARE(apr_status_t) ap_fcgi_encode_env(request_rec *r, |
| 180 | apr_table_t *env, |
| 181 | void *buffer, |
| 182 | apr_size_t buflen, |
| 183 | int *starting_elem) |
| 184 | { |
| 185 | apr_status_t rv = APR_SUCCESS; |
| 186 | const apr_array_header_t *envarr; |
| 187 | const apr_table_entry_t *elts; |
| 188 | char *itr; |
| 189 | int i; |
| 190 | |
| 191 | envarr = apr_table_elts(env); |
| 192 | elts = (const apr_table_entry_t *) envarr->elts; |
| 193 | |
| 194 | itr = buffer; |
| 195 | |
| 196 | for (i = *starting_elem; i < envarr->nelts; ) { |
| 197 | apr_size_t keylen, vallen; |
| 198 | |
| 199 | if (!elts[i].key) { |
| 200 | (*starting_elem)++; |
| 201 | i++; |
| 202 | continue; |
| 203 | } |
| 204 | |
| 205 | keylen = strlen(elts[i].key); |
| 206 | |
| 207 | if (keylen >> 7 == 0) { |
| 208 | if (buflen < 1) { |
| 209 | rv = APR_ENOSPC; /* overflow */ |
| 210 | break; |
| 211 | } |
| 212 | itr[0] = keylen & 0xff; |
| 213 | itr += 1; |
| 214 | buflen -= 1; |
| 215 | } |
| 216 | else { |
| 217 | if (buflen < 4) { |
| 218 | rv = APR_ENOSPC; /* overflow */ |
| 219 | break; |
| 220 | } |
| 221 | itr[0] = ((keylen >> 24) & 0xff) | 0x80; |
| 222 | itr[1] = ((keylen >> 16) & 0xff); |
| 223 | itr[2] = ((keylen >> 8) & 0xff); |
| 224 | itr[3] = ((keylen) & 0xff); |
| 225 | itr += 4; |
| 226 | buflen -= 4; |
| 227 | } |
| 228 | |
| 229 | vallen = elts[i].val ? strlen(elts[i].val) : 0; |
| 230 | |
| 231 | if (vallen >> 7 == 0) { |
| 232 | if (buflen < 1) { |
| 233 | rv = APR_ENOSPC; /* overflow */ |
| 234 | break; |
| 235 | } |
| 236 | itr[0] = vallen & 0xff; |
no outgoing calls
no test coverage detected