1a38107941725211e7c3f051f7a8f5e12199f03acmaeder/* Licensed to the Apache Software Foundation (ASF) under one or more
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * contributor license agreements. See the NOTICE file distributed with
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner * this work for additional information regarding copyright ownership.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * The ASF licenses this file to You under the Apache License, Version 2.0
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance * (the "License"); you may not use this file except in compliance with
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * the License. You may obtain a copy of the License at
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu *
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance * http://www.apache.org/licenses/LICENSE-2.0
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu *
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * Unless required by applicable law or agreed to in writing, software
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * distributed under the License is distributed on an "AS IS" BASIS,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * See the License for the specific language governing permissions and
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * limitations under the License.
19e01e1a7e319063434bd86c8ecbc5f241ef9993Felix Gabriel Mance */
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski#include "httpd.h"
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include "http_core.h"
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance#include "http_log.h"
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include "util_fcgi.h"
be2439588008221e691321fdf4f75432cfb72878Felix Gabriel Mance
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu/* we know core's module_index is 0 */
fc05327b875b5723b6c17849b83477f29ec12c90Felix Gabriel Mance#undef APLOG_MODULE_INDEX
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae BungiuAP_DECLARE(void) ap_fcgi_header_to_array(ap_fcgi_header *h,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu unsigned char a[])
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu a[AP_FCGI_HDR_VERSION_OFFSET] = h->version;
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder a[AP_FCGI_HDR_TYPE_OFFSET] = h->type;
424860079d47bf490fa98d5d7498096a0447c569mcodescu a[AP_FCGI_HDR_REQUEST_ID_B1_OFFSET] = h->requestIdB1;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu a[AP_FCGI_HDR_REQUEST_ID_B0_OFFSET] = h->requestIdB0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu a[AP_FCGI_HDR_CONTENT_LEN_B1_OFFSET] = h->contentLengthB1;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder a[AP_FCGI_HDR_CONTENT_LEN_B0_OFFSET] = h->contentLengthB0;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder a[AP_FCGI_HDR_PADDING_LEN_OFFSET] = h->paddingLength;
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder a[AP_FCGI_HDR_RESERVED_OFFSET] = h->reserved;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae BungiuAP_DECLARE(void) ap_fcgi_header_from_array(ap_fcgi_header *h,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu unsigned char a[])
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu h->version = a[AP_FCGI_HDR_VERSION_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu h->type = a[AP_FCGI_HDR_TYPE_OFFSET];
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance h->requestIdB1 = a[AP_FCGI_HDR_REQUEST_ID_B1_OFFSET];
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance h->requestIdB0 = a[AP_FCGI_HDR_REQUEST_ID_B0_OFFSET];
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder h->contentLengthB1 = a[AP_FCGI_HDR_CONTENT_LEN_B1_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu h->contentLengthB0 = a[AP_FCGI_HDR_CONTENT_LEN_B0_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu h->paddingLength = a[AP_FCGI_HDR_PADDING_LEN_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu h->reserved = a[AP_FCGI_HDR_RESERVED_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
b84c87f199dc287d235d7dad6ea344f6912ef531Christian MaederAP_DECLARE(void) ap_fcgi_header_fields_from_array(unsigned char *version,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu unsigned char *type,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_uint16_t *request_id,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_uint16_t *content_len,
be00381168b3f10192afabbba136fb06d3a9f358Christian Maeder unsigned char *padding_len,
be00381168b3f10192afabbba136fb06d3a9f358Christian Maeder unsigned char a[])
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu{
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance *version = a[AP_FCGI_HDR_VERSION_OFFSET];
7852de3551fc797566ee71165bafe05b6d81728cnotanartist *type = a[AP_FCGI_HDR_TYPE_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu *request_id = (a[AP_FCGI_HDR_REQUEST_ID_B1_OFFSET] << 8)
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance + a[AP_FCGI_HDR_REQUEST_ID_B0_OFFSET];
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu *content_len = (a[AP_FCGI_HDR_CONTENT_LEN_B1_OFFSET] << 8)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu + a[AP_FCGI_HDR_CONTENT_LEN_B0_OFFSET];
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance *padding_len = a[AP_FCGI_HDR_PADDING_LEN_OFFSET];
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance}
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel ManceAP_DECLARE(void) ap_fcgi_begin_request_body_to_array(ap_fcgi_begin_request_body *h,
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance unsigned char a[])
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu a[AP_FCGI_BRB_ROLEB1_OFFSET] = h->roleB1;
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance a[AP_FCGI_BRB_ROLEB0_OFFSET] = h->roleB0;
424860079d47bf490fa98d5d7498096a0447c569mcodescu a[AP_FCGI_BRB_FLAGS_OFFSET] = h->flags;
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance a[AP_FCGI_BRB_RESERVED0_OFFSET] = h->reserved[0];
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance a[AP_FCGI_BRB_RESERVED1_OFFSET] = h->reserved[1];
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder a[AP_FCGI_BRB_RESERVED2_OFFSET] = h->reserved[2];
424860079d47bf490fa98d5d7498096a0447c569mcodescu a[AP_FCGI_BRB_RESERVED3_OFFSET] = h->reserved[3];
424860079d47bf490fa98d5d7498096a0447c569mcodescu a[AP_FCGI_BRB_RESERVED4_OFFSET] = h->reserved[4];
424860079d47bf490fa98d5d7498096a0447c569mcodescu}
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance
d6d81ead61a5f9fb7d047e623f7898e730c258camcodescuAP_DECLARE(void) ap_fcgi_fill_in_header(ap_fcgi_header *header,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu unsigned char type,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_uint16_t request_id,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_uint16_t content_len,
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance unsigned char padding_len)
7852de3551fc797566ee71165bafe05b6d81728cnotanartist{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu header->version = AP_FCGI_VERSION_1;
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance
9475501a6acf48434052d9e6f4a05ed6681eaaabFrancisc Nicolae Bungiu header->type = type;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
7852de3551fc797566ee71165bafe05b6d81728cnotanartist header->requestIdB1 = ((request_id >> 8) & 0xff);
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski header->requestIdB0 = ((request_id) & 0xff);
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
424860079d47bf490fa98d5d7498096a0447c569mcodescu header->contentLengthB1 = ((content_len >> 8) & 0xff);
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder header->contentLengthB0 = ((content_len) & 0xff);
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder
424860079d47bf490fa98d5d7498096a0447c569mcodescu header->paddingLength = padding_len;
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder header->reserved = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel ManceAP_DECLARE(void) ap_fcgi_fill_in_request_body(ap_fcgi_begin_request_body *brb,
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance int role,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu unsigned char flags)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->roleB1 = ((role >> 8) & 0xff);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->roleB0 = (role & 0xff);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->flags = flags;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->reserved[0] = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->reserved[1] = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->reserved[2] = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->reserved[3] = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu brb->reserved[4] = 0;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von SchroederAP_DECLARE(apr_size_t) ap_fcgi_encoded_env_len(apr_table_t *env,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder apr_size_t maxlen,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int *starting_elem)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu{
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu const apr_array_header_t *envarr;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu const apr_table_entry_t *elts;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder apr_size_t envlen, actualenvlen;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int i;
31e9d2a02e15b7dbc157e0d3fb3b84f6c8666482Christian Maeder
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (maxlen > AP_FCGI_MAX_CONTENT_LEN) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu maxlen = AP_FCGI_MAX_CONTENT_LEN;
656f17ae9b7610ff2de1b6eedeeadea0c3bcdc8dChristian Maeder }
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance envarr = apr_table_elts(env);
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance elts = (const apr_table_entry_t *) envarr->elts;
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu /* envlen - speculative, may overflow the limit
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu * actualenvlen - len required without overflowing
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu */
7852de3551fc797566ee71165bafe05b6d81728cnotanartist envlen = actualenvlen = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu for (i = *starting_elem; i < envarr->nelts; ) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_size_t keylen, vallen;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (!elts[i].key) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu (*starting_elem)++;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu i++;
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder continue;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu keylen = strlen(elts[i].key);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (keylen >> 7 == 0) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu envlen += 1;
06acd8a23b2f06e7b2373d53f738cf56c7f03223Francisc Nicolae Bungiu }
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu else {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu envlen += 4;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu envlen += keylen;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder vallen = strlen(elts[i].val);
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski if (vallen >> 7 == 0) {
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski envlen += 1;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski }
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder else {
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski envlen += 4;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder envlen += vallen;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder if (envlen > maxlen) {
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder break;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist }
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder actualenvlen = envlen;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder (*starting_elem)++;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder i++;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder }
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder return actualenvlen;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder}
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian MaederAP_DECLARE(apr_status_t) ap_fcgi_encode_env(request_rec *r,
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder apr_table_t *env,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu void *buffer,
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu apr_size_t buflen,
7852de3551fc797566ee71165bafe05b6d81728cnotanartist int *starting_elem)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu{
7852de3551fc797566ee71165bafe05b6d81728cnotanartist apr_status_t rv = APR_SUCCESS;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski const apr_array_header_t *envarr;
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance const apr_table_entry_t *elts;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski char *itr;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int i;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu envarr = apr_table_elts(env);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu elts = (const apr_table_entry_t *) envarr->elts;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu itr = buffer;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder for (i = *starting_elem; i < envarr->nelts; ) {
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance apr_size_t keylen, vallen;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance if (!elts[i].key) {
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder (*starting_elem)++;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski i++;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu continue;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance keylen = strlen(elts[i].key);
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (keylen >> 7 == 0) {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (buflen < 1) {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu rv = APR_ENOSPC; /* overflow */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu break;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu }
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr[0] = keylen & 0xff;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr += 1;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu buflen -= 1;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu }
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu else {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (buflen < 4) {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu rv = APR_ENOSPC; /* overflow */
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu break;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu }
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr[0] = ((keylen >> 24) & 0xff) | 0x80;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr[1] = ((keylen >> 16) & 0xff);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr[2] = ((keylen >> 8) & 0xff);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr[3] = ((keylen) & 0xff);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu itr += 4;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu buflen -= 4;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu }
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu vallen = strlen(elts[i].val);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
if (vallen >> 7 == 0) {
if (buflen < 1) {
rv = APR_ENOSPC; /* overflow */
break;
}
itr[0] = vallen & 0xff;
itr += 1;
buflen -= 1;
}
else {
if (buflen < 4) {
rv = APR_ENOSPC; /* overflow */
break;
}
itr[0] = ((vallen >> 24) & 0xff) | 0x80;
itr[1] = ((vallen >> 16) & 0xff);
itr[2] = ((vallen >> 8) & 0xff);
itr[3] = ((vallen) & 0xff);
itr += 4;
buflen -= 4;
}
if (buflen < keylen) {
rv = APR_ENOSPC; /* overflow */
break;
}
memcpy(itr, elts[i].key, keylen);
itr += keylen;
buflen -= keylen;
if (buflen < vallen) {
rv = APR_ENOSPC; /* overflow */
break;
}
memcpy(itr, elts[i].val, vallen);
itr += vallen;
if (buflen == vallen) {
(*starting_elem)++;
i++;
break; /* filled up predicted space, as expected */
}
buflen -= vallen;
(*starting_elem)++;
i++;
}
if (rv != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02492)
"ap_fcgi_encode_env: out of space "
"encoding environment");
}
return rv;
}