Просмотр исходного кода

* Ported [2869] to 1.2.10
* Fixed a flaw in relay handling


svn: 2870

Bryan Drewery 20 лет назад
Родитель
Сommit
4a8e8100be
1 измененных файлов с 5 добавлено и 6 удалено
  1. 5 6
      src/botnet.c

+ 5 - 6
src/botnet.c

@@ -1154,6 +1154,7 @@ void tandem_relay(int idx, char *nick, register int i)
   dcc[idx].u.relay = (struct relay_info *) my_calloc(1, sizeof(struct relay_info));
   dcc[idx].u.relay = (struct relay_info *) my_calloc(1, sizeof(struct relay_info));
   dcc[idx].u.relay->chat = ci;
   dcc[idx].u.relay->chat = ci;
   dcc[idx].u.relay->old_status = dcc[idx].status;
   dcc[idx].u.relay->old_status = dcc[idx].status;
+  dcc[idx].u.relay->idx = i;
   dcc[idx].u.relay->sock = -1;
   dcc[idx].u.relay->sock = -1;
 
 
   dcc[i].timeval = now;
   dcc[i].timeval = now;
@@ -1210,14 +1211,12 @@ static void tandem_relay_dns_callback(int id, void *client_data, const char *hos
 
 
   dcc[idx].u.relay->sock = dcc[i].sock;
   dcc[idx].u.relay->sock = dcc[i].sock;
 
 
-  int sock = dcc[idx].u.dns->ibuf;
-
   changeover_dcc(i, &DCC_FORK_RELAY, sizeof(struct relay_info));
   changeover_dcc(i, &DCC_FORK_RELAY, sizeof(struct relay_info));
 
 
   dcc[i].addr = inet_addr(ips[0]);
   dcc[i].addr = inet_addr(ips[0]);
 
 
   dcc[i].u.relay->chat = (struct chat_info *) my_calloc(1, sizeof(struct chat_info));
   dcc[i].u.relay->chat = (struct chat_info *) my_calloc(1, sizeof(struct chat_info));
-  dcc[i].u.relay->sock = sock;
+  dcc[i].u.relay->sock = dcc[idx].sock;
   dcc[i].u.relay->port = dcc[i].port;
   dcc[i].u.relay->port = dcc[i].port;
 #ifdef USE_IPV6
 #ifdef USE_IPV6
   dcc[i].u.relay->af = af;
   dcc[i].u.relay->af = af;
@@ -1242,7 +1241,7 @@ static void pre_relay(int idx, char *buf, register int len)
   register int tidx = (-1), i;
   register int tidx = (-1), i;
 
 
   for (i = 0; i < dcc_total; i++) {
   for (i = 0; i < dcc_total; i++) {
-    if (dcc[i].type && dcc[i].type == &DCC_FORK_RELAY && !dcc[i].addr && (dcc[i].u.relay->sock == dcc[idx].sock)) {
+    if (dcc[i].type && dcc[i].type == &DCC_FORK_RELAY && (dcc[i].u.relay->sock == dcc[idx].sock)) {
       tidx = i;
       tidx = i;
       break;
       break;
     }
     }
@@ -1250,7 +1249,7 @@ static void pre_relay(int idx, char *buf, register int len)
   if (tidx < 0) {
   if (tidx < 0) {
     /* Now try to find it among the DNSWAIT sockets instead. */
     /* Now try to find it among the DNSWAIT sockets instead. */
     for (i = 0; i < dcc_total; i++) {
     for (i = 0; i < dcc_total; i++) {
-      if (dcc[i].type && (dcc[i].type == &DCC_DNSWAIT && (dcc[i].sock == dcc[idx].u.relay->sock))) {
+      if (dcc[i].type && (dcc[i].type == &DCC_DNSWAIT && (dcc[idx].u.relay->idx == i))) {
 	tidx = i;
 	tidx = i;
 	break;
 	break;
       }
       }
@@ -1296,7 +1295,7 @@ static void failed_pre_relay(int idx)
   if (tidx < 0) {
   if (tidx < 0) {
     /* Now try to find it among the DNSWAIT sockets instead. */
     /* Now try to find it among the DNSWAIT sockets instead. */
     for (i = 0; i < dcc_total; i++) {
     for (i = 0; i < dcc_total; i++) {
-      if (dcc[i].type && (dcc[i].type == &DCC_DNSWAIT && (dcc[i].sock == dcc[idx].u.relay->sock))) {
+      if (dcc[i].type && (dcc[i].type == &DCC_DNSWAIT && (dcc[idx].u.relay->idx == i))) {
 	tidx = i;
 	tidx = i;
 	break;
 	break;
       }
       }