commit bb8d207efa56b8dbdf366d980b848b0abd072a7d from: Federico G. Schwindt date: Sun Aug 04 09:15:11 2013 UTC Change cloaked hostname to be malloc'd on demand This shaves a few bytes when cloaked hostnames are not used and restricts the cloakhost announcement iif there is something to send. 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 */