From 0a3d74179af55fddcf3acdf83782a722e4c991ce Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Mon, 5 Jan 2015 12:52:52 +0100 Subject: [PATCH] nhttpd: ywebserver.cpp - fix possible segfault (svenhoefer) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/558f372dae8884c0522241610019fb4e6c4f8d6d Author: Jacek Jendrzej Date: 2015-01-05 (Mon, 05 Jan 2015) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/yhttpd_core/ywebserver.cpp | 37 +++++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/nhttpd/yhttpd_core/ywebserver.cpp b/src/nhttpd/yhttpd_core/ywebserver.cpp index b4b810fe3..e6b173a9e 100644 --- a/src/nhttpd/yhttpd_core/ywebserver.cpp +++ b/src/nhttpd/yhttpd_core/ywebserver.cpp @@ -413,6 +413,10 @@ bool CWebserver::handle_connection(CySocket *newSock) { // create arguments TWebserverConnectionArgs *newConn = new TWebserverConnectionArgs; + if (!newConn) { + dperror("CWebserver TWebserverConnectionArgs error!\n"); + return false; + } newConn->ySock = newSock; newConn->ySock->handling = true; newConn->WebserverBackref = this; @@ -457,24 +461,29 @@ bool CWebserver::handle_connection(CySocket *newSock) { // Webserver-Thread for each connection //------------------------------------------------------------------------- void *WebThread(void *args) { - CWebserverConnection *con; - CWebserver *ws; TWebserverConnectionArgs *newConn = (TWebserverConnectionArgs *) args; - ws = newConn->WebserverBackref; + if (!newConn) { + dperror("WebThread called without arguments!\n"); + return NULL; + } bool is_threaded = newConn->is_treaded; if (is_threaded) - log_level_printf(1, "++ Thread 0x06%X gestartet\n", - (int) pthread_self()); - - if (!newConn) { - dperror("WebThread called without arguments!\n"); - if (newConn->is_treaded) - pthread_exit( NULL); - } + log_level_printf(1, "++ Thread 0x06%X gestartet\n", (int) pthread_self()); // (1) create & init Connection - con = new CWebserverConnection(ws); + CWebserver *ws = newConn->WebserverBackref; + if (!ws) { + dperror("WebThread CWebserver error!\n"); + return NULL; + } + + CWebserverConnection *con = new CWebserverConnection(ws); + if (!con) { + dperror("WebThread CWebserverConnection error!\n"); + return NULL; + } + con->Request.UrlData["clientaddr"] = newConn->ySock->get_client_ip(); // TODO:here? con->sock = newConn->ySock; // give socket reference newConn->ySock->handling = true; // dont handle this socket now be webserver main loop @@ -485,9 +494,9 @@ void *WebThread(void *args) { // (3) end connection handling #ifdef Y_CONFIG_FEATURE_KEEP_ALIVE if(!con->keep_alive) - log_level_printf(2,"FD SHOULD CLOSE sock:%d!!!\n",con->sock->get_socket()); + log_level_printf(2,"FD SHOULD CLOSE sock:%d!!!\n",con->sock->get_socket()); else - ws->addSocketToMasterSet(con->sock->get_socket()); // add to master set + ws->addSocketToMasterSet(con->sock->get_socket()); // add to master set #else delete newConn->ySock; #endif