VirtualBox

Changeset 59219 in vbox


Ignore:
Timestamp:
Dec 24, 2015 10:45:49 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104847
Message:

NAT: Improve dns mapping in host resolver - pattern match should
ignore case; make literal match take priority over pattern match if
both are applicable.

Location:
trunk/src/VBox/Devices/Network
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r57850 r59219  
    12051205                                    N_("Unknown configuration in dns mapping"));
    12061206        char szHostNameOrPattern[255];
    1207         bool fMatch = false;    /* false used for equal matching, and true if wildcard pattern is used. */
     1207        bool fPattern = false;
    12081208        RT_ZERO(szHostNameOrPattern);
    12091209        GET_STRING(rc, pThis, pNode, "HostName", szHostNameOrPattern[0], sizeof(szHostNameOrPattern));
     
    12191219                continue;
    12201220            }
    1221             fMatch = true;
     1221            fPattern = true;
    12221222        }
    12231223        struct in_addr HostIP;
     
    12281228            continue;
    12291229        }
    1230         slirp_add_host_resolver_mapping(pThis->pNATState, fMatch ? NULL : szHostNameOrPattern, fMatch ? szHostNameOrPattern : NULL, HostIP.s_addr);
     1230        slirp_add_host_resolver_mapping(pThis->pNATState, szHostNameOrPattern, fPattern, HostIP.s_addr);
    12311231    }
    12321232    LogFlowFunc(("LEAVE: %Rrc\n", rc));
  • trunk/src/VBox/Devices/Network/slirp/hostres.c

    r59203 r59219  
    133133
    134134#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    135 static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *pHostent);
     135static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *h);
    136136#endif
    137137
     
    477477    }
    478478
     479    if (h->h_length != sizeof(RTNETADDRIPV4))
     480    {
     481        /* Log: what kind of address did we get?! */
     482        goto out;
     483    }
     484
     485    if (   h->h_addr_list == NULL
     486        || h->h_addr_list[0] == NULL)
     487    {
     488        /* Log: shouldn't happen */
     489        goto out;
     490    }
     491
    479492#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    480     if (!LIST_EMPTY(&pData->DNSMapHead))
    481         alterHostentWithDataFromDNSMap(pData, h);
     493    alterHostentWithDataFromDNSMap(pData, h);
    482494#endif
    483495
     
    11871199
    11881200#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    1189 static bool isDnsMappingEntryMatchOrEqual2Str(const PDNSMAPPINGENTRY pDNSMapingEntry, const char *pcszString)
    1190 {
    1191     return (    (   pDNSMapingEntry->pszCName
    1192                  && !strcmp(pDNSMapingEntry->pszCName, pcszString))
    1193             || (   pDNSMapingEntry->pszPattern
    1194                 && RTStrSimplePatternMultiMatch(pDNSMapingEntry->pszPattern, RTSTR_MAX, pcszString, RTSTR_MAX, NULL)));
    1195 }
    1196 
    1197 static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *pHostent)
     1201void
     1202slirp_add_host_resolver_mapping(PNATState pData,
     1203                                const char *pszHostName, bool fPattern,
     1204                                uint32_t u32HostIP)
     1205{
     1206    LogRel(("ENTER: pszHostName:%s%s, u32HostIP:%RTnaipv4\n",
     1207                 pszHostName ? pszHostName : "(null)",
     1208                 fPattern ? " (pattern)" : "",
     1209                 u32HostIP));
     1210
     1211    if (   pszHostName != NULL
     1212        && u32HostIP != INADDR_ANY
     1213        && u32HostIP != INADDR_BROADCAST)
     1214    {
     1215        PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY));
     1216        if (!pDnsMapping)
     1217        {
     1218            LogFunc(("Can't allocate DNSMAPPINGENTRY\n"));
     1219            LogFlowFuncLeave();
     1220            return;
     1221        }
     1222
     1223        pDnsMapping->u32IpAddress = u32HostIP;
     1224        pDnsMapping->fPattern = fPattern;
     1225        pDnsMapping->pszName = RTStrDup(pszHostName);
     1226
     1227        if (pDnsMapping->pszName == NULL)
     1228        {
     1229            LogFunc(("Can't allocate enough room for host name\n"));
     1230            RTMemFree(pDnsMapping);
     1231            LogFlowFuncLeave();
     1232            return;
     1233        }
     1234
     1235        if (fPattern) /* there's no case-insensitive pattern-match function */
     1236            RTStrToLower(pDnsMapping->pszName);
     1237
     1238        STAILQ_INSERT_TAIL(fPattern ? &pData->DNSMapPatterns : &pData->DNSMapNames,
     1239                           pDnsMapping, MapList);
     1240
     1241        LogRel(("NAT: User-defined mapping %s%s = %RTnaipv4 is registered\n",
     1242                pDnsMapping->pszName,
     1243                pDnsMapping->fPattern ? " (pattern)" : "",
     1244                pDnsMapping->u32IpAddress));
     1245    }
     1246    LogFlowFuncLeave();
     1247}
     1248
     1249
     1250static void
     1251alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *h)
    11981252{
    11991253    PDNSMAPPINGENTRY pDNSMapingEntry = NULL;
    1200     bool fMatch = false;
    1201     LIST_FOREACH(pDNSMapingEntry, &pData->DNSMapHead, MapList)
    1202     {
    1203         char **pszAlias = NULL;
    1204         if (isDnsMappingEntryMatchOrEqual2Str(pDNSMapingEntry, pHostent->h_name))
    1205         {
    1206             fMatch = true;
    1207             break;
    1208         }
    1209 
    1210         for (pszAlias = pHostent->h_aliases; *pszAlias && !fMatch; pszAlias++)
    1211         {
    1212             if (isDnsMappingEntryMatchOrEqual2Str(pDNSMapingEntry, *pszAlias))
    1213             {
    1214 
    1215                 PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY));
    1216                 fMatch = true;
    1217                 if (!pDnsMapping)
    1218                 {
    1219                     LogFunc(("Can't allocate DNSMAPPINGENTRY\n"));
    1220                     LogFlowFuncLeave();
    1221                     return;
    1222                 }
    1223                 pDnsMapping->u32IpAddress = pDNSMapingEntry->u32IpAddress;
    1224                 pDnsMapping->pszCName = RTStrDup(pHostent->h_name);
    1225                 if (!pDnsMapping->pszCName)
    1226                 {
    1227                     LogFunc(("Can't allocate enough room for %s\n", pHostent->h_name));
    1228                     RTMemFree(pDnsMapping);
    1229                     LogFlowFuncLeave();
    1230                     return;
    1231                 }
    1232                 LIST_INSERT_HEAD(&pData->DNSMapHead, pDnsMapping, MapList);
    1233                 LogRel(("NAT: User-defined mapping %s: %RTnaipv4 is registered\n",
    1234                         pDnsMapping->pszCName ? pDnsMapping->pszCName : pDnsMapping->pszPattern,
    1235                         pDnsMapping->u32IpAddress));
    1236             }
    1237         }
    1238         if (fMatch)
    1239             break;
    1240     }
    1241 
    1242     /* h_lenght is lenght of h_addr_list in bytes, so we check that we have enough space for IPv4 address */
    1243     if (   fMatch
    1244         && pHostent->h_length >= sizeof(uint32_t)
    1245         && pDNSMapingEntry)
    1246     {
    1247         pHostent->h_length = 1;
    1248         *(uint32_t *)pHostent->h_addr_list[0] = pDNSMapingEntry->u32IpAddress;
    1249     }
    1250 
     1254    char **pszAlias;
     1255
     1256    STAILQ_FOREACH(pDNSMapingEntry, &pData->DNSMapNames, MapList)
     1257    {
     1258        Assert(!pDNSMapingEntry->fPattern);
     1259
     1260        if (RTStrICmp(pDNSMapingEntry->pszName, h->h_name) == 0)
     1261            goto done;
     1262
     1263        for (pszAlias = h->h_aliases; *pszAlias != NULL; ++pszAlias)
     1264        {
     1265            if (RTStrICmp(pDNSMapingEntry->pszName, *pszAlias) == 0)
     1266                goto done;
     1267        }
     1268    }
     1269
     1270
     1271#   define MATCH(_pattern, _string) \
     1272        (RTStrSimplePatternMultiMatch((_pattern), RTSTR_MAX, (_string), RTSTR_MAX, NULL))
     1273
     1274    STAILQ_FOREACH(pDNSMapingEntry, &pData->DNSMapPatterns, MapList)
     1275    {
     1276        RTStrToLower(h->h_name);
     1277        if (MATCH(pDNSMapingEntry->pszName, h->h_name))
     1278            goto done;
     1279
     1280        for (pszAlias = h->h_aliases; *pszAlias != NULL; ++pszAlias)
     1281        {
     1282            RTStrToLower(*pszAlias);
     1283            if (MATCH(pDNSMapingEntry->pszName, h->h_name))
     1284                goto done;
     1285        }
     1286    }
     1287
     1288  done:
     1289    if (pDNSMapingEntry != NULL)
     1290    {
     1291        *(uint32_t *)h->h_addr_list[0] = pDNSMapingEntry->u32IpAddress;
     1292        h->h_addr_list[1] = NULL;
     1293    }
    12511294}
    12521295#endif
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r57784 r59219  
    171171
    172172#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    173 void  slirp_add_host_resolver_mapping(PNATState pData, const char *pszHostName, const char *pszHostNamePattern, uint32_t u32HostIP);
     173void slirp_add_host_resolver_mapping(PNATState pData,
     174                                     const char *pszHostName, bool fPattern,
     175                                     uint32_t u32HostIP);
    174176#endif
    175177
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r59063 r59219  
    419419#endif
    420420
     421#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
     422    STAILQ_INIT(&pData->DNSMapNames);
     423    STAILQ_INIT(&pData->DNSMapPatterns);
     424#endif
     425
    421426    slirp_link_up(pData);
    422427    return VINF_SUCCESS;
     
    519524    ftp_alias_unload(pData);
    520525    nbt_alias_unload(pData);
    521     if (pData->fUseHostResolver)
    522     {
     526
    523527#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    524         while (!LIST_EMPTY(&pData->DNSMapHead))
    525         {
    526             PDNSMAPPINGENTRY pDnsEntry = LIST_FIRST(&pData->DNSMapHead);
    527             LIST_REMOVE(pDnsEntry, MapList);
    528             RTStrFree(pDnsEntry->pszCName);
    529             RTMemFree(pDnsEntry);
    530         }
    531 #endif
    532     }
     528    {
     529        DNSMAPPINGHEAD *heads[2];
     530        int i;
     531
     532        heads[0] = &pData->DNSMapNames;
     533        heads[1] = &pData->DNSMapPatterns;
     534        for (i = 0; i < RT_ELEMENTS(heads); ++i)
     535        {
     536            while (!STAILQ_EMPTY(heads[i]))
     537            {
     538                PDNSMAPPINGENTRY pDnsEntry = STAILQ_FIRST(heads[i]);
     539                STAILQ_REMOVE_HEAD(heads[i], MapList);
     540                RTStrFree(pDnsEntry->pszName);
     541                RTMemFree(pDnsEntry);
     542            }
     543        }
     544    }
     545#endif
     546
    533547    while (!LIST_EMPTY(&instancehead))
    534548    {
     
    18551869    LogFlowFuncLeave();
    18561870}
    1857 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    1858 void  slirp_add_host_resolver_mapping(PNATState pData, const char *pszHostName, const char *pszHostNamePattern, uint32_t u32HostIP)
    1859 {
    1860     LogFlowFunc(("ENTER: pszHostName:%s, pszHostNamePattern:%s u32HostIP:%RTnaipv4\n",
    1861                 pszHostName ? pszHostName : "(null)",
    1862                 pszHostNamePattern ? pszHostNamePattern : "(null)",
    1863                 u32HostIP));
    1864     if (   (   pszHostName
    1865             || pszHostNamePattern)
    1866         && u32HostIP != INADDR_ANY
    1867         && u32HostIP != INADDR_BROADCAST)
    1868     {
    1869         PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY));
    1870         if (!pDnsMapping)
    1871         {
    1872             LogFunc(("Can't allocate DNSMAPPINGENTRY\n"));
    1873             LogFlowFuncLeave();
    1874             return;
    1875         }
    1876         pDnsMapping->u32IpAddress = u32HostIP;
    1877         if (pszHostName)
    1878             pDnsMapping->pszCName = RTStrDup(pszHostName);
    1879         else if (pszHostNamePattern)
    1880             pDnsMapping->pszPattern = RTStrDup(pszHostNamePattern);
    1881         if (   !pDnsMapping->pszCName
    1882             && !pDnsMapping->pszPattern)
    1883         {
    1884             LogFunc(("Can't allocate enough room for %s\n", pszHostName ? pszHostName : pszHostNamePattern));
    1885             RTMemFree(pDnsMapping);
    1886             LogFlowFuncLeave();
    1887             return;
    1888         }
    1889         LIST_INSERT_HEAD(&pData->DNSMapHead, pDnsMapping, MapList);
    1890         LogRel(("NAT: User-defined mapping %s: %RTnaipv4 is registered\n",
    1891                 pDnsMapping->pszCName ? pDnsMapping->pszCName : pDnsMapping->pszPattern,
    1892                 pDnsMapping->u32IpAddress));
    1893     }
    1894     LogFlowFuncLeave();
    1895 }
    1896 #endif
     1871
    18971872
    18981873/* updates the arp cache
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r59218 r59219  
    5858typedef struct DNSMAPPINGENTRY
    5959{
    60     /** host name to map.
    61      * @note If pszCName isn't null pszPattern won't be used (see alias_dns.c for
    62      *       details).
    63      */
    64     char        *pszCName;
    65     /** Pattern (simple) of hostnames to map to the specified IP. */
    66     char        *pszPattern;
     60    /** Literal or pattern. */
     61    bool        fPattern;
     62    /** Host name or pattern to map. */
     63    char        *pszName;
    6764    /** The IP Address. */
    6865    uint32_t    u32IpAddress;
    6966    /** List entry.  */
    70     LIST_ENTRY(DNSMAPPINGENTRY) MapList;
     67    STAILQ_ENTRY(DNSMAPPINGENTRY) MapList;
    7168} DNSMAPPINGENTRY, *PDNSMAPPINGENTRY;
    72 typedef LIST_HEAD(DNSMAPPINGLISTHEAD, DNSMAPPINGENTRY) DNSMAPPINGLISTHEAD;
     69typedef STAILQ_HEAD(DNSMAPPINGHEAD, DNSMAPPINGENTRY) DNSMAPPINGHEAD;
    7370#endif
    7471
     
    310307#endif
    311308#ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER
    312     DNSMAPPINGLISTHEAD DNSMapHead;
     309    DNSMAPPINGHEAD DNSMapNames;
     310    DNSMAPPINGHEAD DNSMapPatterns;
    313311#endif
    314312} NATState;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette