Module: ngircd.git
Branch: master
Commit: bb8d207efa56b8dbdf366d980b848b0abd072a7d
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=bb8d207e…
Author: Federico G. Schwindt <fgsch(a)lodoss.net>
Date: Sun Aug 4 10:15:11 2013 +0100
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.
---
src/ngircd/client.c | 25 ++++++++++++++++---------
src/ngircd/client.h | 2 +-
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/src/ngircd/client.c b/src/ngircd/client.c
index 7821d3b..d70cfb4 100644
--- a/src/ngircd/client.c
+++ b/src/ngircd/client.c
@@ -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);
diff --git a/src/ngircd/client.h b/src/ngircd/client.h
index 94ca4dc..6d5298f 100644
--- a/src/ngircd/client.h
+++ b/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 */