Merge pull request #54 from fmorgner/master
authorFelix Morgner <felix.morgner@gmail.com>
Fri, 6 Feb 2015 13:03:56 +0000 (14:03 +0100)
committerFelix Morgner <felix.morgner@gmail.com>
Fri, 6 Feb 2015 13:03:56 +0000 (14:03 +0100)
Fixes for issue #52

src/ban.c
src/client.c
src/log.c
src/server.c
src/ssli_polarssl.c

index c8b868809f0090a78465785ad6cdf2e097f523bc..47f02edab1c1d3ae3a9e277918499b67b41cb415 100644 (file)
--- a/src/ban.c
+++ b/src/ban.c
@@ -90,8 +90,12 @@ void Ban_UserBan(client_t *client, char *reason)
 
        SSLi_hash2hex(ban->hash, hexhash);
 
+       char *clientAddressString = Util_clientAddressToString(client);
+
        Log_info_client(client, "User kickbanned. Reason: '%s' Hash: %s IP: %s Banned for: %d seconds",
-               ban->reason, hexhash, Util_clientAddressToString(client), ban->duration);
+               ban->reason, hexhash, clientAddressString, ban->duration);
+
+       free(clientAddressString);
 }
 
 
@@ -103,10 +107,13 @@ void Ban_pruneBanned()
        list_iterate(itr, &banlist) {
                ban = list_get_entry(itr, ban_t, node);
 #ifdef DEBUG
+               char hexhash[41];
                SSLi_hash2hex(ban->hash, hexhash);
+               char *addressString = Util_addressToString(&ban->address);
                Log_debug("BL: User %s Reason: '%s' Hash: %s IP: %s Time left: %d",
-                       ban->name, ban->reason, hexhash, Util_addressToString(&ban->address)),
+                       ban->name, ban->reason, hexhash, addressString,
                        ban->time + ban->duration - time(NULL));
+               free(addressString);
 #endif
                /* Duration of 0 = forever */
                if (ban->duration != 0 && ban->time + ban->duration - time(NULL) <= 0) {
@@ -302,7 +309,9 @@ static void Ban_saveBanFile(void)
                ban = list_get_entry(itr, ban_t, node);
                SSLi_hash2hex(ban->hash, hexhash);
 
-               fprintf(file, "%s,%s,%d,%ld,%d,%s,%s\n", hexhash, Util_addressToString(&ban->address),ban->mask, (long int)ban->time, ban->duration, ban->name, ban->reason);
+               char *addressString = Util_addressToString(&ban->address);
+               fprintf(file, "%s,%s,%d,%ld,%d,%s,%s\n", hexhash, addressString,ban->mask, (long int)ban->time, ban->duration, ban->name, ban->reason);
+               free(addressString);
        }
        fclose(file);
        banlist_changed = false;
index ae495008ff73bca29b4c2e9249c0dcaae1977f2a..1c5972b688e6e741c07be4161c85dcf8289a9656 100644 (file)
@@ -323,9 +323,12 @@ int Client_add(int fd, struct sockaddr_storage *remote)
 {
        client_t* newclient;
        message_t *sendmsg;
+       char* addressString = NULL;
 
        if (Ban_isBannedAddr(remote)) {
-               Log_info("Address %s banned. Disconnecting", Util_addressToString(remote));
+               addressString = Util_addressToString(remote);
+               Log_info("Address %s banned. Disconnecting", addressString);
+               free(addressString);
                return -1;
        }
 
@@ -336,7 +339,9 @@ int Client_add(int fd, struct sockaddr_storage *remote)
        memcpy(&newclient->remote_tcp, remote, sizeof(struct sockaddr_storage));
        newclient->ssl = SSLi_newconnection(&newclient->tcpfd, &newclient->SSLready);
        if (newclient->ssl == NULL) {
-               Log_warn("SSL negotiation failed with %s on port %d", Util_addressToString(remote), Util_addressToPort(remote));
+               addressString = Util_addressToString(remote);
+               Log_warn("SSL negotiation failed with %s on port %d", addressString, Util_addressToPort(remote));
+               free(addressString);
                free(newclient);
                return -1;
        }
@@ -834,7 +839,9 @@ int Client_read_udp(int udpsock)
                        if (memcmp(itraddress, fromaddress, addresslength) == 0) {
                                if (checkDecrypt(itr, encrypted, buffer, len)) {
                                        memcpy(itr->key, key, KEY_LENGTH);
-                                       Log_info_client(itr, "New UDP connection from %s on port %d", Util_clientAddressToString(itr), fromport);
+                                       char* clientAddressString = Util_clientAddressToString(itr);
+                                       Log_info_client(itr, "New UDP connection from %s on port %d", clientAddressString, fromport);
+                                       free(clientAddressString);
                                        memcpy(&itr->remote_udp, &from, sizeof(struct sockaddr_storage));
                                        break;
                                }
@@ -848,6 +855,9 @@ int Client_read_udp(int udpsock)
        itr->bUDP = true;
        len -= 4; /* Adjust for crypt header */
        msgType = (UDPMessageType_t)((buffer[0] >> 5) & 0x7);
+
+       char *clientAddressString = NULL;
+
        switch (msgType) {
                case UDPVoiceSpeex:
                case UDPVoiceCELTAlpha:
@@ -862,7 +872,9 @@ int Client_read_udp(int udpsock)
                        Client_send_udp(itr, buffer, len);
                        break;
                default:
-                       Log_debug("Unknown UDP message type from %s port %d", Util_clientAddressToString(itr), fromport);
+                       clientAddressString = Util_clientAddressToString(itr);
+                       Log_debug("Unknown UDP message type from %s port %d", clientAddressString, fromport);
+                       free(clientAddressString);
                        break;
        }
 
index 61a92d24994109f34c06f23a1b165a9440ebc096..91ec5b023ed40e0de5d8e407553114fc0f9d78f7 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -191,11 +191,13 @@ void Log_info_client(client_t *client, const char *logstring, ...)
        offset += vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp);
        va_end(argp);
 
+       char *clientAddressString = Util_clientAddressToString(client);
        offset += snprintf(&buf[offset], STRSIZE - offset, " - [%d] %s@%s:%d",
                client->sessionId,
                client->username == NULL ? "" : client->username,
-               Util_clientAddressToString(client),
+               clientAddressString,
                Util_clientAddressToPortTCP(client));
+       free(clientAddressString);
 
        if (termprint)
                fprintf(stderr, "%s\n", buf);
index 4b90734c60a386b4fc63a037b47a9ef02437bea2..9bb6ccb801e44294ca872145f99b5b30a56de4fc 100644 (file)
@@ -141,7 +141,7 @@ void Server_runLoop(struct pollfd* pollfds)
        while (!shutdown_server) {
                struct sockaddr_storage remote;
                int i;
-               
+
 #ifdef USE_SHAREDMEMORY_API
     Sharedmemory_alivetick();
 #endif
@@ -180,7 +180,9 @@ void Server_runLoop(struct pollfd* pollfds)
                                tcpfd = accept(pollfds[i].fd, (struct sockaddr *)&remote, &addrlen);
                                fcntl(tcpfd, F_SETFL, O_NONBLOCK);
                                setsockopt(tcpfd, IPPROTO_TCP, TCP_NODELAY, (char *) &on, sizeof(int));
-                               Log_debug("Connection from %s port %d\n", Util_addressToString(&remote), Util_addressToPort(&remote));
+                               char *addressString = Util_addressToString(&remote);
+                               Log_debug("Connection from %s port %d\n", addressString, Util_addressToPort(&remote));
+                               free(addressString);
                                if (Client_add(tcpfd, &remote) < 0)
                                        close(tcpfd);
                        }
@@ -198,9 +200,9 @@ void Server_runLoop(struct pollfd* pollfds)
                        if (pollfds[nofServerSocks + i].revents & POLLOUT)
                                Client_write_fd(pollfds[nofServerSocks + i].fd);
                }
-#ifdef USE_SHAREDMEMORY_API    
+#ifdef USE_SHAREDMEMORY_API
     Sharedmemory_update();
-#endif    
+#endif
        }
 }
 
@@ -216,8 +218,11 @@ void Server_setupTCPSockets(struct sockaddr_storage* addresses[2], struct pollfd
                        Log_fatal("socket IPv4");
                if (setsockopt(sockets[0], SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
                        Log_fatal("setsockopt IPv4: %s", strerror(errno));
-               if (bind(sockets[0], (struct sockaddr *)addresses[0], sizeof (struct sockaddr_in)) < 0)
-                       Log_fatal("bind %s %d: %s", Util_addressToString(addresses[0]), Util_addressToPort(addresses[0]), strerror(errno));
+               if (bind(sockets[0], (struct sockaddr *)addresses[0], sizeof (struct sockaddr_in)) < 0) {
+                       char *addressString = Util_addressToString(addresses[0]);
+                       Log_fatal("bind %s %d: %s", addressString, Util_addressToPort(addresses[0]), strerror(errno));
+                       free(addressString);
+               }
                if (listen(sockets[0], 3) < 0)
                        Log_fatal("listen IPv4");
                fcntl(sockets[0], F_SETFL, O_NONBLOCK);
@@ -235,8 +240,11 @@ void Server_setupTCPSockets(struct sockaddr_storage* addresses[2], struct pollfd
                        Log_fatal("setsockopt IPv6: %s", strerror(errno));
                if (setsockopt(sockets[1], IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(int)) != 0)
                        Log_fatal("setsockopt IPv6: %s", strerror(errno));
-               if (bind(sockets[1], (struct sockaddr *)addresses[1], sizeof (struct sockaddr_in6)) < 0)
-                       Log_fatal("bind %s %d: %s", Util_addressToString(addresses[1]), Util_addressToPort(addresses[1]), strerror(errno));
+               if (bind(sockets[1], (struct sockaddr *)addresses[1], sizeof (struct sockaddr_in6)) < 0) {
+                       char *addressString = Util_addressToString(addresses[1]);
+                       Log_fatal("bind %s %d: %s", addressString, Util_addressToPort(addresses[1]), strerror(errno));
+                       free(addressString);
+               }
                if (listen(sockets[1], 3) < 0)
                        Log_fatal("listen IPv6");
                fcntl(sockets[1], F_SETFL, O_NONBLOCK);
@@ -258,8 +266,11 @@ void Server_setupUDPSockets(struct sockaddr_storage* addresses[2], struct pollfd
 
        if (hasv4) {
                sockets[0] = socket(PF_INET, SOCK_DGRAM, 0);
-               if (bind(sockets[0], (struct sockaddr *) addresses[0], sizeof (struct sockaddr_in)) < 0)
-                       Log_fatal("bind %s %d: %s", Util_addressToString(addresses[0]), Util_addressToPort(addresses[0]), strerror(errno));
+               if (bind(sockets[0], (struct sockaddr *) addresses[0], sizeof (struct sockaddr_in)) < 0) {
+                       char *addressString = Util_addressToString(addresses[0]);
+                       Log_fatal("bind %s %d: %s", addressString, Util_addressToPort(addresses[0]), strerror(errno));
+                       free(addressString);
+               }
                val = 0xe0;
                if (setsockopt(sockets[0], IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0)
                        Log_warn("Server: Failed to set TOS for UDP Socket");
@@ -277,8 +288,11 @@ void Server_setupUDPSockets(struct sockaddr_storage* addresses[2], struct pollfd
                sockets[1] = socket(PF_INET6, SOCK_DGRAM, 0);
                if (setsockopt(sockets[1], IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(int)) != 0)
                        Log_fatal("setsockopt IPv6: %s", strerror(errno));
-               if (bind(sockets[1], (struct sockaddr *) addresses[1], sizeof (struct sockaddr_in6)) < 0)
-                       Log_fatal("bind %s %d: %s", Util_addressToString(addresses[1]), Util_addressToPort(addresses[1]), strerror(errno));
+               if (bind(sockets[1], (struct sockaddr *) addresses[1], sizeof (struct sockaddr_in6)) < 0) {
+                       char *addressString = Util_addressToString(addresses[1]);
+                       Log_fatal("bind %s %d: %s", addressString, Util_addressToPort(addresses[1]), strerror(errno));
+                       free(addressString);
+               }
                val = 0xe0;
                if (setsockopt(sockets[1], IPPROTO_IPV6, IPV6_TCLASS, &val, sizeof(val)) < 0)
                        Log_warn("Server: Failed to set TOS for UDP Socket");
index df7c0070dcfbbfdd1a2192e1a402ba5ee7ef8665..a36ccb6157aeb13a4d0624410abd932f79ae25e2 100644 (file)
@@ -265,12 +265,10 @@ SSL_handle_t *SSLi_newconnection(int *fd, bool_t *SSLready)
        ssl_session *ssn;
        int rc;
 
-       ssl = malloc(sizeof(ssl_context));
-       ssn = malloc(sizeof(ssl_session));
+       ssl = calloc(1, sizeof(ssl_context));
+       ssn = calloc(1, sizeof(ssl_session));
        if (!ssl || !ssn)
                Log_fatal("Out of memory");
-       memset(ssl, 0, sizeof(ssl_context));
-       memset(ssn, 0, sizeof(ssl_session));
 
        rc = ssl_init(ssl);
        if (rc != 0 )