diff --git a/mongoose.c b/mongoose.c index e39f1b0258291b5ae4a221f78162635c5bf00e1e..39fb7576486c9681f2a2601894f5dccefb016b03 100644 --- a/mongoose.c +++ b/mongoose.c @@ -4415,53 +4415,63 @@ const char *mg_set_option(struct mg_server *server, const char *name, const char *value) { int ind = get_option_index(name); const char *error_msg = NULL; + char **v = NULL; - if (ind < 0) { - error_msg = "No such option"; - } else { - if (server->config_options[ind] != NULL) { - free(server->config_options[ind]); - } - server->config_options[ind] = mg_strdup(value); - DBG(("%s [%s]", name, value)); + if (ind < 0) return "No such option"; + v = &server->config_options[ind]; - if (ind == LISTENING_PORT) { - int port = ns_bind(&server->ns_server, value); - if (port < 0) { - error_msg = "Cannot bind to port"; - } else { - ns_sock_to_str(server->ns_server.listening_sock, server->local_ip, - sizeof(server->local_ip), 0); - if (!strcmp(value, "0")) { - char buf[10]; - mg_snprintf(buf, sizeof(buf), "%d", port); - free(server->config_options[ind]); - server->config_options[ind] = mg_strdup(buf); - } + // Return success immediately if setting to the same value + if ((*v == NULL && value == NULL) || + (value != NULL && *v != NULL && !strcmp(value, *v))) { + return NULL; + } + + if (*v != NULL) { + free(*v); + *v = NULL; + } + + if (value == NULL) return NULL; + + *v = mg_strdup(value); + DBG(("%s [%s]", name, *v)); + + if (ind == LISTENING_PORT) { + int port = ns_bind(&server->ns_server, value); + if (port < 0) { + error_msg = "Cannot bind to port"; + } else { + ns_sock_to_str(server->ns_server.listening_sock, server->local_ip, + sizeof(server->local_ip), 0); + if (!strcmp(value, "0")) { + char buf[10]; + mg_snprintf(buf, sizeof(buf), "%d", port); + free(*v); + *v = mg_strdup(buf); } + } #ifndef _WIN32 - } else if (ind == RUN_AS_USER) { - struct passwd *pw; - if ((pw = getpwnam(value)) == NULL) { - error_msg = "Unknown user"; - } else if (setgid(pw->pw_gid) != 0) { - error_msg = "setgid() failed"; - } else if (setuid(pw->pw_uid) != 0) { - error_msg = "setuid() failed"; - } + } else if (ind == RUN_AS_USER) { + struct passwd *pw; + if ((pw = getpwnam(value)) == NULL) { + error_msg = "Unknown user"; + } else if (setgid(pw->pw_gid) != 0) { + error_msg = "setgid() failed"; + } else if (setuid(pw->pw_uid) != 0) { + error_msg = "setuid() failed"; + } #endif #ifdef NS_ENABLE_SSL - } else if (ind == SSL_CERTIFICATE) { - int res = ns_set_ssl_cert(&server->ns_server, value); - if (res == -2) { - error_msg = "Cannot load PEM"; - } else if (res == -3) { - error_msg = "SSL not enabled"; - } else if (res == -1) { - error_msg = "SSL_CTX_new() failed"; - } -#endif + } else if (ind == SSL_CERTIFICATE) { + int res = ns_set_ssl_cert(&server->ns_server, value); + if (res == -2) { + error_msg = "Cannot load PEM"; + } else if (res == -3) { + error_msg = "SSL not enabled"; + } else if (res == -1) { + error_msg = "SSL_CTX_new() failed"; } +#endif } return error_msg;