]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Stopped the ban code from modifying sstrings.
authorsplidge <redacted>
Fri, 4 Apr 2008 18:28:23 +0000 (19:28 +0100)
committersplidge <redacted>
Fri, 4 Apr 2008 18:28:23 +0000 (19:28 +0100)
bans/bans.c

index b98f7ae79eef44be92433e08af32d98f8f37f235..b7fc500e300c90f998e3ab41d198cc7517a6cb24 100644 (file)
@@ -73,6 +73,7 @@ chanban *makeban(const char *mask) {
   int i;
   int checklen;
   chanban *cbp;
+  char tmpbuf[512];
   
   cbp=getchanban();  
   len=strlen(mask);
@@ -94,8 +95,10 @@ chanban *makeban(const char *mask) {
       /* Got @ sign: everything after here is host */
       if ((len-i)-1 > HOSTLEN) {
         /* This is too long, we need to truncate it */
-        cbp->host=getsstring(&mask[len-HOSTLEN],HOSTLEN);
-        cbp->host->content[0]='*';
+        strncpy(tmpbuf,&mask[len-HOSTLEN],HOSTLEN);
+        tmpbuf[HOSTLEN]='\0';
+        tmpbuf[0]='*';
+        cbp->host=getsstring(tmpbuf,HOSTLEN);
         cbp->flags |= CHANBAN_HOSTMASK;
       } else if (i==(len-1)) {
         /* Ban ending with @, just mark it invalid */
@@ -264,8 +267,10 @@ chanban *makeban(const char *mask) {
       cbp->user=NULL;
     } else if (foundat - foundbang - 1 > USERLEN) {
       /* It's too long.. */
-      cbp->user=getsstring(&mask[foundat-USERLEN],USERLEN);
-      cbp->user->content[0]='*';
+      strncpy(tmpbuf,&mask[foundat-USERLEN],USERLEN);
+      tmpbuf[USERLEN]='\0';
+      tmpbuf[0]='*';
+      cbp->user=getsstring(tmpbuf,USERLEN);
       cbp->flags |= CHANBAN_USERMASK;
     } else if ((foundat - foundbang - 1 == 1) && mask[foundbang+1]=='*') {
       cbp->user=NULL;
@@ -277,6 +282,10 @@ chanban *makeban(const char *mask) {
       else
         cbp->flags |= CHANBAN_USEREXACT;
     }
+    /* Username part can't contain an @ */
+    if (cbp->user && strchr(cbp->user->content,'@')) {
+      cbp->flags |= CHANBAN_INVALID;
+    }
   }
 
   assert(cbp->flags & (CHANBAN_USEREXACT | CHANBAN_USERMASK | CHANBAN_USERANY | CHANBAN_USERNULL));