Commit Diff


commit - e03d8eb7284147f7d44ff192cec18ad9716fedff
commit + bb8d207efa56b8dbdf366d980b848b0abd072a7d
blob - 7821d3bd6b7ae29d679bedbeb97dfb96285c3978
blob + d70cfb4e3b307bf7b13f2be2e3939aa0f4f5f543
--- src/ngircd/client.c
+++ src/ngircd/client.c
@@ -318,6 +318,8 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, co
 				}
 			}
 
+			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);
 
blob - 94ca4dc5fdbf1018ebb3a95563524f60cf582334
blob + 6d5298fc174453af18cc59381b5c6926ed94b37b
--- src/ngircd/client.h
+++ src/ngircd/client.h
@@ -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 */