Ignore:
Timestamp:
Mar 25, 2015, 11:55:11 PM (10 years ago)
Author:
katerina
Message:

Fix for ticket #368 (IPv6 interfaces in portcheck).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_portcheck.c

    r439 r468  
    9797#define SH_PORT_IGN 3
    9898#define SH_PORT_BLACKLIST 4
     99
     100static char * sh_port_type2str (int type)
     101{
     102  if (type == 0) return _("not");
     103  if (type == 1) return _("req");
     104  if (type == 2) return _("opt");
     105  if (type == 3) return _("ign");
     106  if (type == 4) return _("blc");
     107  return _("???");
     108}
    99109
    100110#define SH_PORT_MISS 0
     
    755765          char   saddr[SH_IP_BUF];
    756766
     767          if (portchk_debug)
     768            fprintf(stderr, _("call to  sh_ipvx_ntoa (port %d)\n"), port);
     769 
    757770          sh_ipvx_ntoa(saddr, sizeof(saddr), paddr);
    758771
     
    9911004        {
    9921005          sh_ipvx_ntoa(ipbuf, sizeof(ipbuf), paddr);
    993           fprintf(stderr, _("check port_tcp: %5d on %15s established/time_wait\n"),
     1006          fprintf(stderr, _("check port_tcp: %5d on %15s closed\n"),
    9941007                  port, ipbuf);
    9951008        }
     
    11141127static int sh_portchk_init_internal (void)
    11151128{
    1116   volatile int     i; /* might be clobbered by ‘longjmp’ or ‘vfork’*/
     1129  volatile int     i, j; /* might be clobbered by ‘longjmp’ or ‘vfork’*/
    11171130  char errbuf[256];
    11181131#if defined(USE_IPVX)
     
    11471160    {
    11481161      struct sockaddr_in sin;
     1162      struct sh_sockaddr iface_tmp;
    11491163
    11501164      memcpy(&(sin.sin_addr.s_addr), hent->h_addr_list[i], sizeof(in_addr_t));
     1165      sh_ipvx_save(&iface_tmp, AF_INET, (struct sockaddr *)&sin);
     1166
     1167      for (j = 0; j < iface_list.used; ++j)
     1168        {
     1169          if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list.iface[j])))
     1170            {
     1171              goto next_iface;
     1172            }
     1173        }
     1174
    11511175      sh_ipvx_save(&(iface_list.iface[iface_list.used]),
    11521176                   AF_INET, (struct sockaddr *)&sin);
     
    11561180          char buf[256];
    11571181          sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list.iface[iface_list.used]));
    1158           fprintf(stderr, _("interface[%d]: %s\n"), i, buf);
     1182          fprintf(stderr, _("added interface[%d]: %s\n"), i, buf);
    11591183        }
    11601184      ++iface_list.used;
     1185
     1186    next_iface:
    11611187      ++i;
    11621188    }
     
    11701196    {
    11711197      struct addrinfo *p = res;
     1198      struct sh_sockaddr iface_tmp;
    11721199
    11731200      while ((p != NULL) && (iface_list.used < SH_IFACE_MAX))
    11741201        {
     1202          sh_ipvx_save(&iface_tmp, p->ai_family, p->ai_addr);
     1203
     1204          for (j = 0; j < iface_list.used; ++j)
     1205            {
     1206              if (portchk_debug)
     1207                {
     1208                  char buf1[256], buf2[256];
     1209                  sh_ipvx_ntoa(buf1, sizeof(buf1), &(iface_list.iface[j]));
     1210                  sh_ipvx_ntoa(buf2, sizeof(buf2), &iface_tmp);
     1211                  fprintf(stderr, _("check interface[%d]: %s vs %s\n"), j, buf1, buf2);
     1212                }
     1213              if (0 == sh_ipvx_cmp(&iface_tmp, &(iface_list.iface[j])))
     1214                {
     1215                  if (portchk_debug)
     1216                    fprintf(stderr, _("skipping interface[%d]\n"), j);
     1217                  goto next_iface;
     1218                }
     1219            }
    11751220          sh_ipvx_save(&(iface_list.iface[iface_list.used]),
    11761221                       p->ai_family, p->ai_addr);
     1222
     1223          if (portchk_debug)
     1224            {
     1225              char buf[256];
     1226              sh_ipvx_ntoa(buf, sizeof(buf), &(iface_list.iface[iface_list.used]));
     1227              fprintf(stderr, _("added interface[%d]: %s\n"), iface_list.used, buf);
     1228            }
     1229
    11771230          ++iface_list.used;
     1231
     1232        next_iface:
    11781233          p = p->ai_next;
    11791234        }
     
    11851240    {
    11861241      sh_ipvx_ntoa(ipbuf, sizeof(ipbuf), &(iface_list.iface[i]));
    1187       sl_snprintf(errbuf, sizeof(errbuf), _("interface: %s"), ipbuf);
     1242      sl_snprintf(errbuf, sizeof(errbuf), _("added interface: %s"), ipbuf);
    11881243
    11891244      SH_MUTEX_LOCK(mutex_thread_nolog);
     
    13901445    max_port = 65535;
    13911446
     1447  if (portchk_debug)
     1448    fprintf(stderr, _("scan_ports_generic %d-%d %s %s\n"),
     1449            min_port, max_port, (domain == AF_INET6) ? _("AF_INET6") : _("AF_INET"),
     1450            (protocol == IPPROTO_TCP) ? _("tcp") : _("udp"));
     1451           
    13921452  for (port = min_port; port <= max_port; ++port)
    13931453    {
     
    16121672  else
    16131673    blacklist_udp = black;
     1674
     1675  if (portchk_debug)
     1676    {
     1677      int checkit = sh_portchk_is_blacklisted(port, saddr, proto);
     1678      fprintf(stderr, _("port blacklisted: %d %s\n"), port,
     1679              (checkit == 1) ? _("ok") : _("fail"));
     1680    }
    16141681  return 0;
    16151682}
     
    16471714  port = strtoul(buf, &endptr, 0);
    16481715
     1716  if (portchk_debug)
     1717    {
     1718      char buf[SH_IP_BUF];
     1719      sh_ipvx_ntoa(buf, sizeof(buf), &saddr);
     1720      fprintf(stderr, _("add_port_generic: %s (%s) %d %s (%s)\n"),
     1721              interface, buf, (int) port, (proto == IPPROTO_TCP) ? _("tcp") : _("udp"),
     1722              sh_port_type2str(type));
     1723    }
     1724
    16491725  /* Blacklisted ports
    16501726   */
     
    17071783static int sh_portchk_add_required_generic (const char * str, int type)
    17081784{
    1709   size_t len;
    17101785  size_t ll = 0;
    17111786  int    status;
     
    17231798  if (strchr(str, ':'))
    17241799    {
    1725       len = strlen(str);
    1726       for (ll = 0; ll < len; ++ll)
    1727         {
    1728           if (str[ll] == ':' || str[ll] == ' ' || str[ll] == '\t')
    1729             {
    1730               interface = SH_ALLOC(ll+1);
    1731               sl_strlcpy(interface, str, ll+1);
    1732               interface[ll] = '\0';
    1733               while (str[ll] == ':' || str[ll] == ' ' || str[ll] == '\t')
    1734                 ++ll;
    1735               break;
    1736             }
     1800      char *last = strrchr(str, ':');
     1801      if (last != NULL)
     1802        {
     1803          size_t tolast = (last - str);
     1804          interface = SH_ALLOC(tolast+1);
     1805          sl_strlcpy(interface, str, tolast+1);
     1806          interface[tolast] = '\0';
     1807
     1808          ll = tolast;
     1809
     1810          while (str[ll] == ':' || str[ll] == ' ' || str[ll] == '\t')
     1811            ++ll;
    17371812        }
    17381813    }
     
    17561831
    17571832  if (portchk_debug)
    1758     fprintf(stderr, "add ports for interface: %s\n", interface);
     1833    fprintf(stderr, "add ports for interface: %s (%s)\n", interface, sh_port_type2str(type));
    17591834
    17601835  list = sh_util_strdup(&str[ll]);
Note: See TracChangeset for help on using the changeset viewer.