[mod_cgi] perf: cache getenv() results at start up

This commit is contained in:
Glenn Strauss 2018-11-15 03:30:09 -05:00
parent 5ff1ddeb66
commit 2d91475828
1 changed files with 30 additions and 10 deletions

View File

@ -48,6 +48,11 @@ typedef struct {
size_t oused;
char **eptr;
size_t esize;
buffer *ld_preload;
buffer *ld_library_path;
#ifdef __CYGWIN__
buffer *systemroot;
#endif
} env_accum;
typedef struct {
@ -108,11 +113,23 @@ static void cgi_handler_ctx_free(handler_ctx *hctx) {
INIT_FUNC(mod_cgi_init) {
plugin_data *p;
const char *s;
p = calloc(1, sizeof(*p));
force_assert(p);
/* for valgrind */
s = getenv("LD_PRELOAD");
if (s) p->env.ld_preload = buffer_init_string(s);
s = getenv("LD_LIBRARY_PATH");
if (s) p->env.ld_library_path = buffer_init_string(s);
#ifdef __CYGWIN__
/* CYGWIN needs SYSTEMROOT */
s = getenv("SYSTEMROOT");
if (s) p->env.systemroot = buffer_init_string(s);
#endif
return p;
}
@ -143,6 +160,11 @@ FREE_FUNC(mod_cgi_free) {
free(p->env.ptr);
free(p->env.offsets);
free(p->env.eptr);
buffer_free(p->env.ld_preload);
buffer_free(p->env.ld_library_path);
#ifdef __CYGWIN__
buffer_free(p->env.systemroot);
#endif
free(p);
return HANDLER_GO_ON;
@ -745,7 +767,6 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, handler_
{
size_t i = 0;
const char *s;
http_cgi_opts opts = { 0, 0, NULL, NULL };
env_accum *env = &p->env;
env->used = 0;
@ -756,19 +777,18 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, handler_
http_cgi_headers(srv, con, &opts, cgi_env_add, env);
/* for valgrind */
if (NULL != (s = getenv("LD_PRELOAD"))) {
cgi_env_add(env, CONST_STR_LEN("LD_PRELOAD"), s, strlen(s));
if (p->env.ld_preload) {
cgi_env_add(env, CONST_STR_LEN("LD_PRELOAD"), CONST_BUF_LEN(p->env.ld_preload));
}
if (NULL != (s = getenv("LD_LIBRARY_PATH"))) {
cgi_env_add(env, CONST_STR_LEN("LD_LIBRARY_PATH"), s, strlen(s));
if (p->env.ld_library_path) {
cgi_env_add(env, CONST_STR_LEN("LD_LIBRARY_PATH"), CONST_BUF_LEN(p->env.ld_library_path));
}
#ifdef __CYGWIN__
#ifdef __CYGWIN__
/* CYGWIN needs SYSTEMROOT */
if (NULL != (s = getenv("SYSTEMROOT"))) {
cgi_env_add(env, CONST_STR_LEN("SYSTEMROOT"), s, strlen(s));
if (p->env.systemroot) {
cgi_env_add(env, CONST_STR_LEN("SYSTEMROOT"), CONST_BUF_LEN(p->env.systemroot));
}
#endif
#endif
if (env->esize <= env->oused) {
env->esize = (env->oused + 1 + 0xf) & ~(0xfuL);