]> arthur.barton.de Git - ngircd.git/commitdiff
Merge branch 'move-connection-password' of git://arthur.barton.de/ngircd-alex
authorAlexander Barton <alex@barton.de>
Sun, 26 Aug 2012 17:14:29 +0000 (19:14 +0200)
committerAlexander Barton <alex@barton.de>
Sun, 26 Aug 2012 17:14:29 +0000 (19:14 +0200)
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.

src/ngircd/client.c
src/ngircd/client.h
src/ngircd/conn.c
src/ngircd/conn.h
src/ngircd/irc-login.c
src/ngircd/irc-server.c
src/ngircd/login.c
src/ngircd/pam.c

index f163f72c371e2a84121a84d178c3552530109b3d..0d2d4147345046b87f7f3c6e46fd018749f4da36 100644 (file)
@@ -440,18 +440,6 @@ Client_SetFlags( CLIENT *Client, const char *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
 Client_SetAway( CLIENT *Client, const char *Txt )
 {
@@ -714,14 +702,6 @@ Client_HostnameCloaked(CLIENT *Client)
 } /* Client_HostnameCloaked */
 
 
-GLOBAL char *
-Client_Password( CLIENT *Client )
-{
-       assert( Client != NULL );
-       return Client->pwd;
-} /* Client_Password */
-
-
 GLOBAL char *
 Client_Modes( CLIENT *Client )
 {
index 4dbcc7a072232eacfe7cf45020cd2136fb774eb2..16b2a61ab8564808ad6c58066898602e30431cab 100644 (file)
@@ -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, const char *Nick ));
 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 ));
index 28a0341e0a28e1485c077393671b51702b1e6141..e57aa2423a3eea2bbdacea0500fe9e3452ddb0bf 100644 (file)
@@ -918,6 +918,30 @@ va_dcl
        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 char *FwdMsg, bool InformClie
 
        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 );
index 4752ec1ede359ee4764066d0b80b578599ff6b74..7dcc8d9d590619c143276d93b003c0c565d3a4e4 100644 (file)
@@ -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 ));
index 3fb1b902412118e2cad5b58bcae8af0dacec6379..9e1abdd59e8b0349b535b9b1299989f994a3827c 100644 (file)
@@ -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) {
index cca295ac831dc486675f08778ec3d0de881a63ea..8526a573ec361b0851222314343e079b447114f6 100644 (file)
@@ -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] );
index 7f0299cb09088622b03787a7815950db772f02c7..460fcd1e4c1954e80d946d6ac1a08a0ba9e7722e 100644 (file)
@@ -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;
index 6382c594db0747f5872b7042cb553713d3abd4f1..88872c47c5f841d9b008da5fdc59a39281f4f2bb 100644 (file)
@@ -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);