fixed modcmd privs parsing and extended merge_argv
[NeonServV5.git] / modcmd.c
index 7c1b0c5ec9a0f7b38afe0c8583143249e81c2c6e..dcf5cefc0097f3b44700a109057fa9ad21044f84 100644 (file)
--- a/modcmd.c
+++ b/modcmd.c
@@ -263,30 +263,28 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u
         int access_pos = 0;
         int access_count = 0;
         int minaccess = 0;
-        char *str_a, *str_b = cbind->func->channel_access;
+        char *str_a, *str_b = cbind->func->channel_access, *str_c;
         if(cbind->flags & CMDFLAG_OVERRIDE_CHANNEL_ACCESS)
             str_b = cbind->channel_access;
         if(str_b) {
-            while((str_a = strstr(str_b, ","))) {
-                *str_a = '\0';
-                if(*str_b == '#') {
+            str_c = strdup(str_b);
+            str_b = str_c;
+            while((str_a = str_b)) {
+                str_b = strstr(str_a, ",");
+                if(str_b) {
+                    *str_b = '\0';
                     str_b++;
-                    access_pos += sprintf(access_list+access_pos, ", `%s`", str_b);
+                }
+                if(*str_a == '#') {
+                    str_a++;
+                    access_pos += sprintf(access_list+access_pos, ", `%s`", str_a);
                     access_count++;
                 } else {
-                    if(atoi(str_b) > minaccess)
-                        minaccess = atoi(str_b);
+                    if(atoi(str_a) > minaccess)
+                        minaccess = atoi(str_a);
                 }
-                *str_a = ',';
-                str_b = str_a+1;
             }
-            if(*str_b == '#') {
-                str_b++;
-                access_pos += sprintf(access_list+access_pos, ", `%s`", str_b);
-                access_count++;
-            } else if(atoi(str_b) > minaccess)
-                minaccess = atoi(str_b);
-                
+            free(str_c);
         } else
             access_list[0] = '\0';
         if(!(chan->flags & CHANFLAG_REQUESTED_CHANINFO) || (sent_chan && sent_chan == chan) || access_count || minaccess) {