]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Fix problem with ORGN setting IP with links value
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 17 Jul 2025 15:17:49 +0000 (11:17 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Thu, 17 Jul 2025 15:17:49 +0000 (11:17 -0400)
lib/lvleml.c
lib/modrec.c

index 7e2a3b0cad2ab165fab0c7875c26b60d098bea02..cafa50d703e399b2fb17027774f771ca665919e3 100644 (file)
@@ -1357,35 +1357,74 @@ static _Bool set_orgn_rmtip(CONTYP *contact,char *rmtip)
 
 _Bool isok;
 AFNTYP *afn;
+int phase;
+_Bool proceed;
 
 isok=false;
-if ((afn=afn_getoneipnum(rmtip))!=(AFNTYP *)0) {
-  char *reverse;
+afn=(AFNTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //is the new IP valide
+      if ((afn=afn_getoneipnum(rmtip))==(AFNTYP *)0) {
+        (void) rou_alert(0,"%s <%s> is not a good ip (Testing?)",OPEP,rmtip);
+        phase=999;
+        }
+      break;
+    case 1      :       //we have good ip, lets disconnect previous
+      if (sql_newconnect(contact->sqlptr,contact->peerip,-1)==false) {
+        (void) rou_alert(0,"%s Unable to update database remotes table (system?)"
+                           OPEP);
+        phase=999;
+        }
+      break;
+    case 2      :  {    //ready to change IP'
+      char *reverse;
 
-  reverse=afn_reversipnum(afn);
-  contact->peerip=rou_freestr(contact->peerip);
-  contact->peerip=strdup(rmtip);
-  contact->peername=rou_freestr(contact->peername);
-  contact->peername=dns_get_reverse_addr(reverse);
-  switch (contact->privilege) {
-    case rel_authentic  :
+      contact->peerip=rou_freestr(contact->peerip);
+      contact->peerip=strdup(rmtip);
+      reverse=afn_reversipnum(afn);
+      contact->peername=rou_freestr(contact->peername);
+      contact->peername=dns_get_reverse_addr(reverse);
+      reverse=rou_freestr(reverse);
+      }
       break;
-    case rel_isrelay    :
-      //NO BREAK;
-    case rel_plain      :
-      if (afn_is_ip_relayable(contact->peerip,contact->relayok)==true)
-        contact->privilege=rel_isrelay;     //IP is relayable
+    case 3      :       //adjust privilege according new IP
+      switch (contact->privilege) {
+        case rel_authentic  :
+          break;
+        case rel_isrelay    :
+          //NO BREAK;
+        case rel_plain      :
+          if (afn_is_ip_relayable(contact->peerip,contact->relayok)==true)
+            contact->privilege=rel_isrelay;     //IP is relayable
+          break;
+        default             :
+          (void) rou_alert(0,"%s unexpected privilege '%d' (Bug?)",
+                              OPEP,contact->privilege);
+          phase=999;
+          break;
+        }
       break;
-    default             :
-      (void) rou_alert(0,"%s unexpeced privilege '%d' (Bug?)",
-                          OPEP,contact->privilege);
+    case 4      :       //let update links
+      if (sql_newconnect(contact->sqlptr,rmtip,1)==false) {
+        (void) rou_alert(0,"%s <%s> Unable to increase links number! (Testing?)",
+                            OPEP,rmtip);
+        phase=999;
+        }
+      break;
+    case 5      :       //everything is now fine
+      (void) signon(contact);
+      isok=true;
+      break;
+    default     :       //SAFE Guard
+      afn=afn_freeipnum(afn);
+      proceed=false;
       break;
     }
-  reverse=rou_freestr(reverse);
-  afn=afn_freeipnum(afn);
-  isok=true;
+  phase++;
   }
-(void) signon(contact);
 return isok;
 
 #undef  OPEP
index b72bea2d9f0d396cf61594dbfc09163868a8ca45..6152b97afcb78b6fae862a44d89888ef06166ecb 100644 (file)
@@ -163,12 +163,14 @@ static void docontact(SOCPTR *socptr,int pos)
 #define OPEP    "modrec.c:docontact"
 
 CONTYP *contact;
+int delta;
 int intstat;
 int phase;
 _Bool proceed;
 
 contact=(CONTYP *)0;
 intstat=0;
+delta=0;
 phase=0;
 proceed=true;
 while (proceed==true) {
@@ -184,10 +186,14 @@ while (proceed==true) {
                            contact->locname,contact->locserv);
       break;
     case 2      :       //check if remote link is acceptable
-      if (sql_newconnect(contact->sqlptr,contact->peerip,1)==false)
+      delta=1;
+      if (sql_newconnect(contact->sqlptr,contact->peerip,delta)==false) {
         phase=999;      //connection rejected
+        }
+      delta=0;
       break;
     case 3      :       //do contact
+      delta=-1;
       intstat=eml_docontact(contact);
       switch (intstat) {
         case  1 :       //command 'quit' recieved
@@ -207,11 +213,12 @@ while (proceed==true) {
         }
       break;
     case 4      :       //connection terminated
-      (void) sql_newconnect(contact->sqlptr,contact->peerip,-1);
       break;
     default     :       //SAFE guard
-      if (contact!=(CONTYP *)0) 
+      if (contact!=(CONTYP *)0) {
+        (void) sql_newconnect(contact->sqlptr,contact->peerip,delta);
         contact=eml_dropcontact(contact);
+        }
       proceed=false;
       break;
     }