From 977567c95153f5a51d55f6153c6987067b76ea1d Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Thu, 17 Jul 2025 11:17:49 -0400 Subject: [PATCH] Fix problem with ORGN setting IP with links value --- lib/lvleml.c | 81 ++++++++++++++++++++++++++++++++++++++-------------- lib/modrec.c | 13 +++++++-- 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/lib/lvleml.c b/lib/lvleml.c index 7e2a3b0..cafa50d 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -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 diff --git a/lib/modrec.c b/lib/modrec.c index b72bea2..6152b97 100644 --- a/lib/modrec.c +++ b/lib/modrec.c @@ -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; } -- 2.47.3