diff --git a/include/libwebsockets/lws-misc.h b/include/libwebsockets/lws-misc.h index 073108ad4..d8519d297 100644 --- a/include/libwebsockets/lws-misc.h +++ b/include/libwebsockets/lws-misc.h @@ -895,7 +895,7 @@ struct lws_spawn_piped_info { struct lws *opt_parent; const char * const *exec_array; - char **env_array; + const char **env_array; const char *protocol_name; const char *chroot_path; const char *wd; diff --git a/lib/plat/unix/unix-spawn.c b/lib/plat/unix/unix-spawn.c index 1e3a01e7d..bfa0fc9e3 100644 --- a/lib/plat/unix/unix-spawn.c +++ b/lib/plat/unix/unix-spawn.c @@ -528,16 +528,19 @@ lws_spawn_piped(const struct lws_spawn_piped_info *i) #if defined(__linux__) || defined(__APPLE__) m = 0; while (i->env_array[m]){ - char *p = strchr(i->env_array[m], '='); - *p++ = '\0'; - setenv(i->env_array[m], p, 1); + const char *p = strchr(i->env_array[m], '='); + int naml = lws_ptr_diff(p, i->env_array[m]); + char enam[32]; + + lws_strnncpy(enam, i->env_array[m], naml, sizeof(enam)); + setenv(enam, p, 1); m++; } #endif execvp(i->exec_array[0], (char * const *)&i->exec_array[0]); #else execvpe(i->exec_array[0], (char * const *)&i->exec_array[0], - &i->env_array[0]); + (char **)&i->env_array[0]); #endif lwsl_err("%s: child exec of %s failed %d\n", __func__, i->exec_array[0], diff --git a/lib/roles/cgi/cgi-server.c b/lib/roles/cgi/cgi-server.c index 5a39116d0..1aa2f9cff 100644 --- a/lib/roles/cgi/cgi-server.c +++ b/lib/roles/cgi/cgi-server.c @@ -385,7 +385,7 @@ lws_cgi(struct lws *wsi, const char * const *exec_array, #endif memset(&info, 0, sizeof(info)); - info.env_array = env_array; + info.env_array = (const char **)env_array; info.exec_array = exec_array; info.max_log_lines = 20000; info.opt_parent = wsi;