]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Change cloaked hostname to be malloc'd on demand
authorFederico G. Schwindt <fgsch@lodoss.net>
Sun, 4 Aug 2013 09:15:11 +0000 (10:15 +0100)
committerFederico G. Schwindt <fgsch@lodoss.net>
Sun, 4 Aug 2013 09:15:11 +0000 (10:15 +0100)
This shaves a few bytes when cloaked hostnames are not used and
restricts the cloakhost announcement iif there is something to
send.

src/ngircd/client.c
src/ngircd/client.h

index 7821d3bd6b7ae29d679bedbeb97dfb96285c3978..d70cfb4e3b307bf7b13f2be2e3939aa0f4f5f543 100644 (file)
@@ -318,6 +318,8 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
                                }
                        }
 
+                       if (c->cloaked)
+                               free(c->cloaked);
                        free( c );
                        break;
                }
@@ -744,8 +746,6 @@ Client_HostnameCloaked(CLIENT *Client)
  * Get (potentially cloaked) hostname of a client to display it to other users.
  *
  * If the client has not enabled cloaking, the real hostname is used.
- * Please note that this function uses a global static buffer, so you can't
- * nest invocations without overwriting earlier results!
  *
  * @param Client Pointer to client structure
  * @return Pointer to client hostname
@@ -760,7 +760,7 @@ Client_HostnameDisplayed(CLIENT *Client)
                return Client_Hostname(Client);
 
        /* Use an already saved cloaked hostname, if there is one */
-       if (Client->cloaked[0])
+       if (Client->cloaked)
                return Client->cloaked;
 
        Client_UpdateCloakedHostname(Client, NULL, NULL);
@@ -781,25 +781,32 @@ GLOBAL void
 Client_UpdateCloakedHostname(CLIENT *Client, CLIENT *Origin,
                             const char *Hostname)
 {
-       static char Cloak_Buffer[CLIENT_HOST_LEN];
+       char Cloak_Buffer[CLIENT_HOST_LEN];
 
        assert(Client != NULL);
        if (!Origin)
                Origin = Client_ThisServer();
 
+       if (!Client->cloaked) {
+               Client->cloaked = malloc(CLIENT_HOST_LEN);
+               if (!Client->cloaked)
+                       return;
+       }
+
        if (!Hostname) {
                /* Generate new cloaked hostname */
                if (*Conf_CloakHostModeX) {
-                       strlcpy(Cloak_Buffer, Client->host, CLIENT_HOST_LEN);
+                       strlcpy(Cloak_Buffer, Client->host,
+                               sizeof(Cloak_Buffer));
                        strlcat(Cloak_Buffer, Conf_CloakHostSalt,
-                               CLIENT_HOST_LEN);
-                       snprintf(Client->cloaked, sizeof(Client->cloaked),
+                               sizeof(Cloak_Buffer));
+                       snprintf(Client->cloaked, CLIENT_HOST_LEN,
                                 Conf_CloakHostModeX, Hash(Cloak_Buffer));
                } else
                        strlcpy(Client->cloaked, Client_ID(Client->introducer),
-                               sizeof(Client->cloaked));
+                               CLIENT_HOST_LEN);
        } else
-               strlcpy(Client->cloaked, Hostname, sizeof(Client->cloaked));
+               strlcpy(Client->cloaked, Hostname, CLIENT_HOST_LEN);
        LogDebug("Cloaked hostname of \"%s\" updated to \"%s\"",
                 Client_ID(Client), Client->cloaked);
 
index 94ca4dc5fdbf1018ebb3a95563524f60cf582334..6d5298fc174453af18cc59381b5c6926ed94b37b 100644 (file)
@@ -48,7 +48,7 @@ typedef struct _CLIENT
        struct _CLIENT *introducer;     /* ID of the servers which the client is connected to */
        struct _CLIENT *topserver;      /* toplevel servers (only valid if client is a server) */
        char host[CLIENT_HOST_LEN];     /* hostname of the client */
-       char cloaked[CLIENT_HOST_LEN];  /* cloaked hostname of the client */
+       char *cloaked;                  /* cloaked hostname of the client */
        char user[CLIENT_USER_LEN];     /* user name ("login") */
 #if defined(PAM) && defined(IDENTAUTH)
        char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */