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

* Use and validate dns_id for dcc/dnsing

svn: 1481
Bryan Drewery 21 лет назад
Родитель
Сommit
d84cfe2606
7 измененных файлов с 53 добавлено и 28 удалено
  1. 15 8
      src/adns.c
  2. 2 1
      src/adns.h
  3. 12 6
      src/botnet.c
  4. 5 1
      src/cmds.c
  5. 12 9
      src/dcc.c
  6. 1 0
      src/dcc.h
  7. 6 3
      src/mod/server.mod/servmsg.c

+ 15 - 8
src/adns.c

@@ -316,7 +316,7 @@ int egg_dns_lookup(const char *host, int timeout, dns_callback_t callback, void
 
 		answer_init(&answer);
 		answer_add(&answer, host);
-		callback(client_data, host, answer.list);
+		callback(-1, client_data, host, answer.list);
 		answer_free(&answer);
 		return(-1);
 	}
@@ -328,7 +328,7 @@ int egg_dns_lookup(const char *host, int timeout, dns_callback_t callback, void
 
 			answer_init(&answer);
 			answer_add(&answer, hosts[i].ip);
-			callback(client_data, host, answer.list);
+			callback(-1, client_data, host, answer.list);
 			answer_free(&answer);
 			return(-1);
 		}
@@ -337,7 +337,7 @@ int egg_dns_lookup(const char *host, int timeout, dns_callback_t callback, void
 	cache_id = cache_find(host);
 	if (cache_id >= 0) {
 		shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len);
-		callback(client_data, host, cache[cache_id].answer.list);
+		callback(-1, client_data, host, cache[cache_id].answer.list);
 		return(-1);
 	}
 
@@ -369,7 +369,7 @@ int egg_dns_reverse(const char *ip, int timeout, dns_callback_t callback, void *
 
 	if (!is_dotted_ip(ip)) {
 		/* If it's not a valid ip, don't even make the request. */
-		callback(client_data, ip, NULL);
+		callback(-1, client_data, ip, NULL);
 		return(-1);
 	}
 
@@ -380,7 +380,7 @@ int egg_dns_reverse(const char *ip, int timeout, dns_callback_t callback, void *
 
 			answer_init(&answer);
 			answer_add(&answer, hosts[i].host);
-			callback(client_data, ip, answer.list);
+			callback(-1, client_data, ip, answer.list);
 			answer_free(&answer);
 			return(-1);
 		}
@@ -389,7 +389,7 @@ int egg_dns_reverse(const char *ip, int timeout, dns_callback_t callback, void *
 	cache_id = cache_find(ip);
         if (cache_id >= 0) {
 		shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len);
-		callback(client_data, ip, cache[cache_id].answer.list);
+		callback(-1, client_data, ip, cache[cache_id].answer.list);
 		return(-1);
 	}
 
@@ -677,7 +677,7 @@ int egg_dns_cancel(int id, int issue_callback)
 	if (prev) prev->next = q->next;
 	else query_head = q->next;
 	sdprintf("Cancelling query: %s", q->query);
-	if (issue_callback) q->callback(q->client_data, q->query, NULL);
+	if (issue_callback) q->callback(q->id, q->client_data, q->query, NULL);
 	free(q);
 	return(0);
 }
@@ -797,7 +797,7 @@ static void parse_reply(char *response, int nbytes)
 
 	cache_add(q->query, &q->answer);
 
-	q->callback(q->client_data, q->query, q->answer.list);
+	q->callback(q->id, q->client_data, q->query, q->answer.list);
 	answer_free(&q->answer);
 	free(q->query);
 	free(q);
@@ -898,3 +898,10 @@ int egg_dns_init()
 	return(0);
 }
 
+
+bool valid_dns_id(int idx, int id)
+{
+  if (valid_idx(idx) && dcc[idx].dns_id == id)
+    return 1;
+  return 0;
+}

+ 2 - 1
src/adns.h

@@ -7,7 +7,7 @@
 
 #define DNS_PORT 53
 
-typedef void (*dns_callback_t)(void *client_data, const char *query, char **result);
+typedef void (*dns_callback_t)(int id, void *client_data, const char *query, char **result);
 
 int egg_dns_init(void);
 //int egg_dns_shutdown(void);
@@ -18,6 +18,7 @@ int egg_dns_reverse(const char *ip, int timeout, dns_callback_t callback, void *
 int egg_dns_cancel(int id, int issue_callback);
 void tell_dnsdebug(int);
 void dns_cache_flush();
+bool valid_dns_id(int, int);
 
 extern int		dns_sock, dns_idx;
 extern const char	*dns_ip;

+ 12 - 6
src/botnet.c

@@ -892,7 +892,7 @@ int botunlink(int idx, char *nick, char *reason)
   return 0;
 }
 
-static void botlink_dns_callback(void *, const char *, char **);
+static void botlink_dns_callback(int id, void *, const char *, char **);
 
 /* Link to another bot
  */
@@ -950,7 +950,7 @@ int botlink(char *linker, int idx, char *nick)
       strcpy(dcc[i].u.bot->linker, linker);
       dcc[i].u.bot->numver = idx;
 
-      egg_dns_lookup(bi->address, 20, botlink_dns_callback, (void *) i);
+      dcc[i].dns_id = egg_dns_lookup(bi->address, 20, botlink_dns_callback, (void *) i);
      
       return 1;
       /* wait for async reply */
@@ -959,10 +959,13 @@ int botlink(char *linker, int idx, char *nick)
   return 0;
 }
 
-static void botlink_dns_callback(void *client_data, const char *host, char **ips)
+static void botlink_dns_callback(int id, void *client_data, const char *host, char **ips)
 {
   int i = (int) client_data;
 
+  if (!valid_dns_id(i, id))
+    return;
+
   if (!ips) {
     lostdcc(i);
     return;
@@ -1050,7 +1053,7 @@ static void failed_tandem_relay(int idx)
     failed_tandem_relay(idx);
 }
 
-static void tandem_relay_dns_callback(void *, const char *, char **);
+static void tandem_relay_dns_callback(int, void *, const char *, char **);
 
 /* Relay to another tandembot
  */
@@ -1108,16 +1111,19 @@ void tandem_relay(int idx, char *nick, register int i)
   dcc[i].u.relay->sock = dcc[idx].sock;
   dcc[i].u.relay->idx = idx;
 
-  egg_dns_lookup(bi->address, 20, tandem_relay_dns_callback, (void *) i);
+  dcc[i].dns_id = egg_dns_lookup(bi->address, 20, tandem_relay_dns_callback, (void *) i);
 
   return;
   /* wait for async reply */
 }
 
-static void tandem_relay_dns_callback(void *client_data, const char *host, char **ips)
+static void tandem_relay_dns_callback(int id, void *client_data, const char *host, char **ips)
 {
   int i = (int) client_data, idx = -1;
 
+  if (!valid_dns_id(i, id))
+    return;
+
   if (dcc[i].type)
     idx = dcc[i].u.relay->idx;
   

+ 5 - 1
src/cmds.c

@@ -3925,9 +3925,13 @@ static void cmd_crontab(int idx, char *par) {
 }
 #endif /* !CYGWIN_HACKS */
 
-static void my_dns_callback(void *client_data, const char *host, char **ips)
+static void my_dns_callback(int id, void *client_data, const char *host, char **ips)
 {
   int idx = (int) client_data;
+
+  if (!valid_dns_id(idx, id))
+    return;
+
 if (ips)
 sdprintf("CALLBACK WITH IDX: %d and ip[0]: %s (msgc: %d)", idx, ips[0], dcc[idx].msgc);
   if (ips)

+ 12 - 9
src/dcc.c

@@ -1193,7 +1193,7 @@ detect_telnet_flood(char *floodhost)
   return 0;
 }
 
-static void dcc_telnet_dns_callback(void *, const char *, char **);
+static void dcc_telnet_dns_callback(int id, void *, const char *, char **);
 
 static void
 dcc_telnet(int idx, char *buf, int ii)
@@ -1256,20 +1256,23 @@ dcc_telnet(int idx, char *buf, int ii)
   dcc[i].timeval = now;
   strcpy(dcc[i].nick, "*");
   dcc[i].u.other = (void *) idx;
-sdprintf("setting dcc[%d].u.other = %d", i, idx);
-  egg_dns_reverse(s, 20, dcc_telnet_dns_callback, (void *) i);
+  dcc[i].dns_id = egg_dns_reverse(s, 20, dcc_telnet_dns_callback, (void *) i);
 }
 
-static void dcc_telnet_dns_callback(void *client_data, const char *ip, char **hosts)
+static void dcc_telnet_dns_callback(int id, void *client_data, const char *ip, char **hosts)
 {
   int idx = -1, i = (int) client_data;
+
+  if (!valid_dns_id(i, id))
+    return;
+
   int j = 0, sock;
   char s2[UHOSTLEN + 20] = "";
 
   if (dcc[i].type)
     idx = (int) dcc[i].u.other;
-sdprintf("dcc[%d].u.other = %d", i, idx);
-  dcc[i].u.other = NULL;
+
+  dcc[i].u.other = 0;
 
   strncpyz(dcc[i].host, hosts ? hosts[0] : ip, UHOSTLEN);
 
@@ -1729,7 +1732,7 @@ dcc_ident(int idx, char *buf, int len)
       simple_sprintf(buf1, "%s@%s", uid, dcc[idx].host);
       dcc_telnet_got_ident(i, buf1);
     }
-  dcc[idx].u.other = NULL;
+  dcc[idx].u.other = 0;
   killsock(dcc[idx].sock);
   lostdcc(idx);
 }
@@ -1746,7 +1749,7 @@ eof_dcc_ident(int idx)
       dcc_telnet_got_ident(i, buf);
     }
   killsock(dcc[idx].sock);
-  dcc[idx].u.other = NULL;
+  dcc[idx].u.other = 0;
   lostdcc(idx);
 }
 
@@ -1778,7 +1781,7 @@ dcc_telnet_got_ident(int i, char *host)
     if (dcc[i].type && (dcc[idx].type == &DCC_TELNET) && (dcc[idx].sock == dcc[i].u.ident_sock))
       break;
 
-  dcc[i].u.other = NULL;
+  dcc[i].u.other = 0;
 
   if (!dcc[idx].type) {
     putlog(LOG_MISC, "*", DCC_LOSTIDENT);

+ 1 - 0
src/dcc.h

@@ -51,6 +51,7 @@ struct dcc_t {
   int simul;                    /* this will hold the idx on the remote bot to return result. */
   int msgc;			/* forward the output back to irc? */
   int whowas;
+  int dns_id;
   port_t port;
   char simulbot[NICKLEN];       /* used for hub->leaf cmd simulation, holds bot that results should be sent to */
   char hash[MD5_HASH_LENGTH + 1];                /* used for dcc authing */

+ 6 - 3
src/mod/server.mod/servmsg.c

@@ -1321,7 +1321,7 @@ static cmd_t my_raw_binds[] =
   {NULL,	NULL,	NULL,				NULL}
 };
 
-static void server_dns_callback(void *, const char *, char **);
+static void server_dns_callback(int, void *, const char *, char **);
 
 /* Hook up to a server
  */
@@ -1381,17 +1381,20 @@ static void connect_server(void)
     /* I'm resolving... don't start another server connect request */
     resolvserv = 1;
     /* Resolve the hostname. */
-    egg_dns_lookup(botserver, 20, server_dns_callback, (void *) newidx);
+    dcc[newidx].dns_id = egg_dns_lookup(botserver, 20, server_dns_callback, (void *) newidx);
     /* wait for async reply */
   }
 }
 
-static void server_dns_callback(void *client_data, const char *host, char **ips)
+static void server_dns_callback(int id, void *client_data, const char *host, char **ips)
 {
   int idx = (int) client_data;
 
   resolvserv = 0;
 
+  if (!valid_dns_id(idx, id))
+    return;
+
   if (!ips) {
     putlog(LOG_SERV, "*", "Failed connect to %s (DNS lookup failed)", host);
     trying_server = 0;