Fix /uping on IPv6-enabled FreeBSD builds (#1435373).
[ircu2.10.12-pk.git] / ircd / s_auth.c
index 15ccb1335b649a133a626301c9fcc12b8fcd9ee7..a233f9bd7b45a985584aa4a61c364a1a5f3cb9e2 100644 (file)
@@ -178,13 +178,13 @@ struct IAuth {
 };
 
 /** Return whether flag \a flag is set on \a iauth. */
-#define IAuthHas(iauth, flag) FlagHas(&iauth->i_flags, flag)
+#define IAuthHas(iauth, flag) ((iauth) && FlagHas(&(iauth)->i_flags, flag))
 /** Set flag \a flag on \a iauth. */
-#define IAuthSet(iauth, flag) FlagSet(&iauth->i_flags, flag)
+#define IAuthSet(iauth, flag) FlagSet(&(iauth)->i_flags, flag)
 /** Clear flag \a flag from \a iauth. */
-#define IAuthClr(iauth, flag) FlagClr(&iauth->i_flags, flag)
+#define IAuthClr(iauth, flag) FlagClr(&(iauth)->i_flags, flag)
 /** Get connected flag for \a iauth. */
-#define i_GetConnected(iauth) (s_fd(i_socket(iauth)) > -1)
+#define i_GetConnected(iauth) ((iauth) && s_fd(i_socket(iauth)) > -1)
 
 /** Return socket event generator for \a iauth. */
 #define i_socket(iauth) (&(iauth)->i_socket)
@@ -193,7 +193,7 @@ struct IAuth {
 /** Return outbound message queue for \a iauth. */
 #define i_sendQ(iauth) (&(iauth)->i_sendQ)
 /** Return debug level for \a iauth. */
-#define i_debug(iauth) (iauth->i_debug)
+#define i_debug(iauth) ((iauth)->i_debug)
 
 /** Active instance of IAuth. */
 struct IAuth *iauth;
@@ -322,7 +322,7 @@ static int auth_set_username(struct AuthRequest *auth)
     if (!lower && !upper)
       goto badid;
     /* Final character must not be punctuation. */
-    if (!IsAlnum(ch))
+    if (!IsAlnum(last))
       goto badid;
   }
 
@@ -370,6 +370,12 @@ static int check_auth_finished(struct AuthRequest *auth, int send_reports)
       return 0;
     }
 
+  /* If appropriate, do preliminary assignment to connection class. */
+  if (IsUserPort(auth->client)
+      && !FlagHas(&auth->flags, AR_IAUTH_HURRY)
+      && preregister_user(auth->client))
+    return CPTR_KILLED;
+
   /* Check if iauth is done. */
   if (FlagHas(&auth->flags, AR_IAUTH_PENDING))
   {
@@ -381,10 +387,6 @@ static int check_auth_finished(struct AuthRequest *auth, int send_reports)
       /* Set "hurry" flag in auth request. */
       FlagSet(&auth->flags, AR_IAUTH_HURRY);
 
-      /* Do preliminary assignment to connection class. */
-      if (preregister_user(auth->client))
-        return CPTR_KILLED;
-
       /* Check password now (to avoid challenge/response conflicts). */
       aconf = cli_confs(auth->client)->value.aconf;
       if (!EmptyString(aconf->passwd)
@@ -408,6 +410,9 @@ static int check_auth_finished(struct AuthRequest *auth, int send_reports)
            cli_fd(auth->client), AR_IAUTH_PENDING));
     return 0;
   }
+  else
+    FlagSet(&auth->flags, AR_IAUTH_HURRY);
+
 
   destroy_auth_request(auth, send_reports);
   if (!IsUserPort(auth->client))
@@ -821,7 +826,7 @@ static void start_auth_query(struct AuthRequest* auth)
   local_addr.port = 0;
   memcpy(&remote_addr.addr, &cli_ip(auth->client), sizeof(remote_addr.addr));
   remote_addr.port = 113;
-  fd = os_socket(&local_addr, SOCK_STREAM, "auth query");
+  fd = os_socket(&local_addr, SOCK_STREAM, "auth query", 0);
   if (fd < 0) {
     ++ServerStats->is_abad;
     if (IsUserPort(auth->client))
@@ -1263,7 +1268,7 @@ static void iauth_disconnect(struct IAuth *iauth)
 /** Close all %IAuth connections marked as closing. */
 void auth_close_unused(void)
 {
-  if (iauth && IAuthHas(iauth, IAUTH_CLOSING)) {
+  if (IAuthHas(iauth, IAUTH_CLOSING)) {
     int ii;
     iauth_disconnect(iauth);
     if (iauth->i_argv) {
@@ -2018,7 +2023,7 @@ void report_iauth_conf(struct Client *cptr, const struct StatDesc *sd, char *par
 {
     struct SLink *link;
 
-    for (link = iauth->i_config; link; link = link->next)
+    if (iauth) for (link = iauth->i_config; link; link = link->next)
     {
         send_reply(cptr, SND_EXPLICIT | RPL_STATSDEBUG, ":%s",
                    link->value.cp);
@@ -2035,7 +2040,7 @@ void report_iauth_conf(struct Client *cptr, const struct StatDesc *sd, char *par
 {
     struct SLink *link;
 
-    for (link = iauth->i_stats; link; link = link->next)
+    if (iauth) for (link = iauth->i_stats; link; link = link->next)
     {
         send_reply(cptr, SND_EXPLICIT | RPL_STATSDEBUG, ":%s",
                    link->value.cp);