in modules/fcgid/fcgid_protocol.c [25:86]
static size_t init_environment(char *buf, char **envp)
{
char *spliter;
apr_size_t namelen, valuelen;
char *cur_buf = buf;
size_t buffer_size = 0;
for (; *envp != NULL; envp++) {
spliter = strchr(*envp, '=');
if (spliter == NULL)
continue;
namelen = spliter - *envp;
valuelen = strlen(spliter + 1);
/* Put name length to buffer */
if (namelen < 0x80) {
if (!buf)
buffer_size++;
else
*cur_buf++ = (unsigned char) namelen;
} else {
if (!buf)
buffer_size += 4;
else {
*cur_buf++ = (unsigned char) ((namelen >> 24) | 0x80);
*cur_buf++ = (unsigned char) (namelen >> 16);
*cur_buf++ = (unsigned char) (namelen >> 8);
*cur_buf++ = (unsigned char) namelen;
}
}
/* Put value length to buffer */
if (valuelen < 0x80) {
if (!buf)
buffer_size++;
else
*cur_buf++ = (unsigned char) valuelen;
} else {
if (!buf)
buffer_size += 4;
else {
*cur_buf++ = (unsigned char) ((valuelen >> 24) | 0x80);
*cur_buf++ = (unsigned char) (valuelen >> 16);
*cur_buf++ = (unsigned char) (valuelen >> 8);
*cur_buf++ = (unsigned char) valuelen;
}
}
/* Now the name and body buffer */
if (!buf) {
buffer_size += namelen;
buffer_size += valuelen;
} else {
memcpy(cur_buf, *envp, namelen);
cur_buf += namelen;
memcpy(cur_buf, spliter + 1, valuelen);
cur_buf += valuelen;
}
}
return buffer_size;
}