Diff for /embedaddon/dnsmasq/src/loop.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2021/03/17 00:56:46 version 1.1.1.3, 2023/09/27 11:02:07
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
   
    This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
Line 22  static ssize_t loop_make_probe(u32 uid); Line 22  static ssize_t loop_make_probe(u32 uid);
 void loop_send_probes()  void loop_send_probes()
 {  {
    struct server *serv;     struct server *serv;
      struct randfd_list *rfds = NULL;
         
    if (!option_bool(OPT_LOOP_DETECT))     if (!option_bool(OPT_LOOP_DETECT))
      return;       return;
Line 29  void loop_send_probes() Line 30  void loop_send_probes()
    /* Loop through all upstream servers not for particular domains, and send a query to that server which is     /* Loop through all upstream servers not for particular domains, and send a query to that server which is
       identifiable, via the uid. If we see that query back again, then the server is looping, and we should not use it. */        identifiable, via the uid. If we see that query back again, then the server is looping, and we should not use it. */
    for (serv = daemon->servers; serv; serv = serv->next)     for (serv = daemon->servers; serv; serv = serv->next)
     if (!(serv->flags &      if (strlen(serv->domain) == 0 &&
           (SERV_LITERAL_ADDRESS | SERV_NO_ADDR | SERV_USE_RESOLV | SERV_NO_REBIND | SERV_HAS_DOMAIN | SERV_FOR_NODOTS | SERV_LOOP)))         !(serv->flags & (SERV_FOR_NODOTS)))
        {         {
          ssize_t len = loop_make_probe(serv->uid);           ssize_t len = loop_make_probe(serv->uid);
          int fd;           int fd;
          struct randfd *rfd = NULL;  
                     
         if (serv->sfd)         serv->flags &= ~SERV_LOOP;
           fd = serv->sfd->fd; 
         else  
           { 
             if (!(rfd = allocate_rfd(serv->addr.sa.sa_family))) 
               continue; 
             fd = rfd->fd; 
           } 
   
            if ((fd = allocate_rfd(&rfds, serv)) == -1)
              continue;
            
          while (retry_send(sendto(fd, daemon->packet, len, 0,            while (retry_send(sendto(fd, daemon->packet, len, 0, 
                                   &serv->addr.sa, sa_len(&serv->addr))));                                    &serv->addr.sa, sa_len(&serv->addr))));
            
          free_rfd(rfd);  
        }         }
   
      free_rfds(&rfds);
 }  }
       
 static ssize_t loop_make_probe(u32 uid)  static ssize_t loop_make_probe(u32 uid)
 {  {
   struct dns_header *header = (struct dns_header *)daemon->packet;    struct dns_header *header = (struct dns_header *)daemon->packet;
   unsigned char *p = (unsigned char *)(header+1);    unsigned char *p = (unsigned char *)(header+1);
  
   /* packet buffer overwritten */    /* packet buffer overwritten */
   daemon->srv_save = NULL;    daemon->srv_save = NULL;
       
Line 96  int detect_loop(char *query, int type) Line 92  int detect_loop(char *query, int type)
     return 0;      return 0;
   
   for (i = 0; i < 8; i++)    for (i = 0; i < 8; i++)
    if (!isxdigit(query[i]))    if (!isxdigit((unsigned char)query[i]))
       return 0;        return 0;
   
   uid = strtol(query, NULL, 16);    uid = strtol(query, NULL, 16);
   
   for (serv = daemon->servers; serv; serv = serv->next)    for (serv = daemon->servers; serv; serv = serv->next)
     if (!(serv->flags &     if (strlen(serv->domain) == 0 &&
           (SERV_LITERAL_ADDRESS | SERV_NO_ADDR | SERV_USE_RESOLV | SERV_NO_REBIND | SERV_HAS_DOMAIN | SERV_FOR_NODOTS | SERV_LOOP)) &&        !(serv->flags & SERV_LOOP) &&
         uid == serv->uid)        uid == serv->uid)
       {      {
         serv->flags |= SERV_LOOP;        serv->flags |= SERV_LOOP;
         check_servers(); /* log new state */        check_servers(1); /* log new state - don't send more probes. */
         return 1;        return 1;
       }      }
  
   return 0;    return 0;
 }  }
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>