From 81ea84ca414361a0983a18256f44dcdc75675f4d Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 31 Jul 2015 14:40:06 +0200 Subject: Error handling in server.c --- server.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'server.c') diff --git a/server.c b/server.c index c62afd3..d24af1a 100644 --- a/server.c +++ b/server.c @@ -170,6 +170,8 @@ server_t *server_getFromBase(struct string *in) uint32_t server_searchRequest(server_t *server, struct SearchRequest *req) { epoll_server_t * const s = &server->con; + if (!server_ensureConnected(server)) return 0; + printf("fd: %d, Kill: %d, Bound: %d, idle: %d\n", s->fd, (int)s->kill, (int)s->bound, (int)(time(NULL) - s->lastActive)); if (s->fd != -1 && !s->kill) { uint32_t msgId = server_searchRequestOnConnection(s, req); if (msgId != 0) return msgId; @@ -233,6 +235,7 @@ uint32_t server_tryUserBind(server_t *server, struct string *binddn, struct stri fmt_ldapbindrequeststring(bufoff, 3, binddn, password); fmt_ldapmessage(bufoff - headerLen, id, BindRequest, bodyLen); if (!server_send(con, bufoff - headerLen, bodyLen + headerLen, FALSE)) { + printf("[Server] Could not send user bindrequest to server %s\n", server->addr); server_free(con); return 0; } @@ -270,6 +273,7 @@ void server_free(epoll_server_t *server) { proxy_removeServer(server); server->bound = FALSE; + server->kill = FALSE; if (server->ssl != NULL) { SSL_free(server->ssl); server->ssl = NULL; @@ -299,7 +303,7 @@ static void server_callback(void *data, int haveIn, int haveOut, int doCleanup) // SSL if (!server->sslConnected) { // Still SSL-Connecting - if (!ssl_connectServer(server)) { + if (!ssl_connectServer(server) || doCleanup || server->kill) { printf("[Proxy] SSL handshake for AD server %s failed.\n", server->serverData->addr); server_free(server); return; @@ -379,6 +383,7 @@ static void server_haveIn(epoll_server_t *server) BOOL server_send(epoll_server_t *server, const char *buffer, size_t len, const BOOL cork) { + if (server->kill) return FALSE; if (server->ssl == NULL && server->sbFill == 0 && !cork) { // Nothing in send buffer, fire away const int ret = write(server->fd, buffer, len); @@ -457,9 +462,9 @@ static BOOL server_ensureConnected(server_t *server) { epoll_server_t * const con = &server->con; if (con->fd != -1 && con->lastActive + 120 > time(NULL)) return TRUE; - if (con->fd != -1) close(con->fd); - con->bound = FALSE; - con->sbPos = con->sbFill = 0; + if (con->fd != -1) { + server_free(con); + } int sock = server_connectInternal(server); if (sock == -1) { printf("[Server] Creating socket for shared connection failed.\n"); @@ -492,9 +497,14 @@ static BOOL server_ensureConnected(server_t *server) con->fd = -1; return FALSE; } + con->kill = FALSE; fmt_ldapbindrequest(bufoff, 3, server->bind, server->password); fmt_ldapmessage(bufoff - headerLen, MSGID_BIND, BindRequest, bodyLen); - return server_send(con, bufoff - headerLen, bodyLen + headerLen, FALSE); + if (!server_send(con, bufoff - headerLen, bodyLen + headerLen, FALSE)) { + printf("[Server] Sending bindrequest for shared connection failed for server %s\n", server->addr); + return FALSE; + } + return TRUE; } static BOOL server_ensureSendBuffer(epoll_server_t * const s, const size_t len) -- cgit v1.2.3-55-g7522