[mod_cgi] perf: cache getenv() results at start up
@@ -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,17 +777,16 @@ 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__
/* 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
