commit bcefdef1eaed14d3156b7fb5b9ad6d3b7078efcf from: Alexander Barton date: Sun Aug 26 17:14:29 2012 UTC Merge branch 'move-connection-password' of git://arthur.barton.de/ngircd-alex This patch series converts the statically allocated password buffer in the CLIENT structure into a dynamically (and only when needed) allocated buffer which is referenced by the CONNECTION structure. This a) saves memory for clients not using passwords at all and b) allows for "arbitrarily" long passwords. By Brett Smith (5) and Alexander Barton (2). * 'move-connection-password' of git://arthur.barton.de/ngircd-alex: Login_User(): use "conn" insted of calling Client_Conn(Client) Free already saved password when storing a new one Indentation and style fixes. Connection password is not constant. Implementation clean-ups. Dynamically allocate memory for connection password. Move client password from the Client to the Connection struct. commit - 360a254be0e55e975998d0f3a5ff301ac3346f72 commit + bcefdef1eaed14d3156b7fb5b9ad6d3b7078efcf blob - f163f72c371e2a84121a84d178c3552530109b3d blob + 0d2d4147345046b87f7f3c6e46fd018749f4da36 --- src/ngircd/client.c +++ src/ngircd/client.c @@ -438,18 +438,6 @@ Client_SetFlags( CLIENT *Client, const char *Flags ) strlcpy(Client->flags, Flags, sizeof(Client->flags)); } /* Client_SetFlags */ - - -GLOBAL void -Client_SetPassword( CLIENT *Client, const char *Pwd ) -{ - /* set password sent by client */ - - assert( Client != NULL ); - assert( Pwd != NULL ); - - strlcpy(Client->pwd, Pwd, sizeof(Client->pwd)); -} /* Client_SetPassword */ GLOBAL void @@ -715,14 +703,6 @@ Client_HostnameCloaked(CLIENT *Client) GLOBAL char * -Client_Password( CLIENT *Client ) -{ - assert( Client != NULL ); - return Client->pwd; -} /* Client_Password */ - - -GLOBAL char * Client_Modes( CLIENT *Client ) { assert( Client != NULL ); blob - 4dbcc7a072232eacfe7cf45020cd2136fb774eb2 blob + 16b2a61ab8564808ad6c58066898602e30431cab --- src/ngircd/client.h +++ src/ngircd/client.h @@ -47,7 +47,6 @@ typedef struct _CLIENT CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */ 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 pwd[CLIENT_PASS_LEN]; /* password received of the client */ char host[CLIENT_HOST_LEN]; /* hostname of the client */ char user[CLIENT_USER_LEN]; /* user name ("login") */ #if defined(PAM) && defined(IDENTAUTH) @@ -109,7 +108,6 @@ GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ) #endif GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client )); GLOBAL char *Client_HostnameCloaked PARAMS(( CLIENT *Client )); -GLOBAL char *Client_Password PARAMS(( CLIENT *Client )); GLOBAL char *Client_Modes PARAMS(( CLIENT *Client )); GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client )); @@ -129,7 +127,6 @@ GLOBAL void Client_SetID PARAMS(( CLIENT *Client, cons GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented )); GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User )); GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, const char *Info )); -GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, const char *Pwd )); GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type )); GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops )); GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token )); blob - 28a0341e0a28e1485c077393671b51702b1e6141 blob + e57aa2423a3eea2bbdacea0500fe9e3452ddb0bf --- src/ngircd/conn.c +++ src/ngircd/conn.c @@ -917,7 +917,31 @@ va_dcl va_end( ap ); return ok; } /* Conn_WriteStr */ + +GLOBAL char* +Conn_Password( CONN_ID Idx ) +{ + assert( Idx > NONE ); + if (My_Connections[Idx].pwd == NULL) + return (char*)"\0"; + else + return My_Connections[Idx].pwd; +} /* Conn_Password */ + +GLOBAL void +Conn_SetPassword( CONN_ID Idx, const char *Pwd ) +{ + assert( Idx > NONE ); + if (My_Connections[Idx].pwd) + free(My_Connections[Idx].pwd); + + My_Connections[Idx].pwd = strdup(Pwd); + if (My_Connections[Idx].pwd == NULL) { + Log(LOG_EMERG, "Can't allocate memory! [Conn_SetPassword]"); + exit(1); + } +} /* Conn_SetPassword */ /** * Append Data to the outbound write buffer of a connection. @@ -1146,6 +1170,8 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const cha array_free(&My_Connections[Idx].rbuf); array_free(&My_Connections[Idx].wbuf); + if (My_Connections[Idx].pwd != NULL) + free(My_Connections[Idx].pwd); /* Clean up connection structure (=free it) */ Init_Conn_Struct( Idx ); blob - 4752ec1ede359ee4764066d0b80b578599ff6b74 blob + 7dcc8d9d590619c143276d93b003c0c565d3a4e4 --- src/ngircd/conn.h +++ src/ngircd/conn.h @@ -72,6 +72,7 @@ typedef struct _Connection ng_ipaddr_t addr; /* Client address */ PROC_STAT proc_stat; /* Status of resolver process */ char host[HOST_LEN]; /* Hostname */ + char *pwd; /* password received of the client */ array rbuf; /* Read buffer */ array wbuf; /* Write buffer */ time_t signon; /* Signon ("connect") time */ @@ -115,6 +116,9 @@ GLOBAL void Conn_Handler PARAMS(( void )); GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, const char *Format, ... )); +GLOBAL char* Conn_Password PARAMS(( CONN_ID Idx )); +GLOBAL void Conn_SetPassword PARAMS(( CONN_ID Idx, const char *Pwd )); + GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient )); GLOBAL void Conn_SyncServerStruct PARAMS(( void )); blob - 3fb1b902412118e2cad5b58bcae8af0dacec6379 blob + 9e1abdd59e8b0349b535b9b1299989f994a3827c --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -87,7 +87,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) Client_ID(Client)); } - Client_SetPassword(Client, Req->argv[0]); + Conn_SetPassword(Client_Conn(Client), Req->argv[0]); /* Protocol version */ if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) { blob - cca295ac831dc486675f08778ec3d0de881a63ea blob + 8526a573ec361b0851222314343e079b447114f6 --- src/ngircd/irc-server.c +++ src/ngircd/irc-server.c @@ -80,7 +80,8 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true); return DISCONNECTED; } - if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 ) + if( strcmp( Conn_Password( Client_Conn( Client ) ), + Conf_Server[i].pwd_in ) != 0 ) { /* wrong password */ Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] ); blob - 7f0299cb09088622b03787a7815950db772f02c7 blob + 460fcd1e4c1954e80d946d6ac1a08a0ba9e7722e --- src/ngircd/login.c +++ src/ngircd/login.c @@ -93,13 +93,14 @@ Login_User(CLIENT * Client) * the beahiour of the daemon compiled without PAM support: * because there can't be any "server password", all * passwords supplied are classified as "wrong". */ - if(Client_Password(Client)[0] == '\0') + if(Conn_Password(conn)[0] == '\0') return Login_User_PostAuth(Client); Client_Reject(Client, "Non-empty password", false); return DISCONNECTED; } - if (Conf_PAMIsOptional && strcmp(Client_Password(Client), "") == 0) { + if (Conf_PAMIsOptional && + strcmp(Conn_Password(conn), "") == 0) { /* Clients are not required to send a password and to be PAM- * authenticated at all. If not, they won't become "identified" * and keep the "~" in their supplied user name. @@ -129,7 +130,7 @@ Login_User(CLIENT * Client) } #else /* Check global server password ... */ - if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) { + if (strcmp(Conn_Password(conn), Conf_ServerPwd) != 0) { /* Bad password! */ Client_Reject(Client, "Bad server password", false); return DISCONNECTED; blob - 6382c594db0747f5872b7042cb553713d3abd4f1 blob + 88872c47c5f841d9b008da5fdc59a39281f4f2bb --- src/ngircd/pam.c +++ src/ngircd/pam.c @@ -102,8 +102,8 @@ PAM_Authenticate(CLIENT *Client) { /* Set supplied client password */ if (password) free(password); - password = strdup(Client_Password(Client)); - conv.appdata_ptr = Client_Password(Client); + password = strdup(Conn_Password(Client_Conn(Client))); + conv.appdata_ptr = Conn_Password(Client_Conn(Client)); /* Initialize PAM */ retval = pam_start("ngircd", Client_OrigUser(Client), &conv, &pam);