VirtualBox

Changeset 25353 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Dec 14, 2009 10:08:50 AM (15 years ago)
Author:
vboxsync
Message:

NAT: libalias: consider '_' and '-' in host names (xtracker 4537); Sun header; coding style; overflow check in string conversion functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/libalias/alias_dns.c

    r25301 r25353  
     1/* $Id$ */
     2/** @file
     3 * libalias helper for using the host resolver instead of dnsproxy.
     4 */
     5
     6/*
     7 * Copyright (C) 2009 Sun Microsystems, Inc.
     8 *
     9 * This file is part of VirtualBox Open Source Edition (OSE), as
     10 * available from http://www.virtualbox.org. This file is free software;
     11 * you can redistribute it and/or modify it under the terms of the GNU
     12 * General Public License (GPL) as published by the Free Software
     13 * Foundation, in version 2 as it comes in the "COPYING" file of the
     14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
     15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
     16 *
     17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
     18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
     19 * additional information or have any questions.
     20 */
     21
    122#ifndef RT_OS_WINDOWS
    223# include <netdb.h>
    324#endif
    4 # include <iprt/ctype.h>
    5 # include <iprt/assert.h>
    6 # include <slirp.h>
    7 # include "alias.h"
    8 # include "alias_local.h"
    9 # include "alias_mod.h"
    10 # define isdigit(ch)    RT_C_IS_DIGIT(ch)
    11 # define isalpha(ch)    RT_C_IS_ALPHA(ch)
     25#include <iprt/ctype.h>
     26#include <iprt/assert.h>
     27#include <slirp.h>
     28#include "alias.h"
     29#include "alias_local.h"
     30#include "alias_mod.h"
     31#define isdigit(ch)    RT_C_IS_DIGIT(ch)
     32#define isalpha(ch)    RT_C_IS_ALPHA(ch)
    1233
    1334#define DNS_CONTROL_PORT_NUMBER 53
     
    1536union dnsmsg_header
    1637{
    17     struct {
    18 #ifndef VBOX
    19         uint16_t id;
    20         uint16_t rd:1;
    21         uint16_t tc:1;
    22         uint16_t aa:1;
    23         uint16_t opcode:4;
    24         uint16_t qr:1;
    25         uint16_t rcode:4;
    26         uint16_t Z:3;
    27         uint16_t ra:1;
    28 #else
     38    struct
     39    {
    2940        unsigned id:16;
    3041        unsigned rd:1;
     
    3647        unsigned Z:3;
    3748        unsigned ra:1;
    38 #endif
    3949        uint16_t qdcount;
    4050        uint16_t ancount;
     
    4252        uint16_t arcount;
    4353    } X;
    44     uint16_t raw[5];
     54    uint16_t raw[6];
    4555};
    4656AssertCompileSize(union dnsmsg_header, 12);
     
    5363    uint16_t ttl[2];
    5464    uint16_t rdata_len;
    55     uint8_t rdata[1];  /*depends on value at rdata_len */
     65    uint8_t  rdata[1];  /* depends on value at rdata_len */
    5666};
    5767
    5868/* see RFC 1035(4.1) */
    5969static int dns_alias_handler(PNATState pData, int type);
    60 static void cstr2qstr(char *cstr, char *qstr);
    61 static void qstr2cstr(char *qstr, char *cstr);
     70static void CStr2QStr(const char *pcszStr, char *pszQStr, size_t cQStr);
     71static void QStr2CStr(const char *pcszQStr, char *pszStr, size_t cStr);
    6272
    6373static int
     
    6575{
    6676
    67     if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL)
    68         return (-1);
     77    if (!ah->dport || !ah->sport || !ah->lnk)
     78        return -1;
     79
    6980    fprintf(stderr, "NAT:%s: ah(dport: %hd, sport: %hd) oaddr:%R[IP4] aaddr:%R[IP4]\n",
    7081        __FUNCTION__, ntohs(*ah->dport), ntohs(*ah->sport),
    7182        &ah->oaddr, &ah->aaddr);
     83
    7284    if (   (ntohs(*ah->dport) == DNS_CONTROL_PORT_NUMBER
    7385        || ntohs(*ah->sport) == DNS_CONTROL_PORT_NUMBER)
    7486        && (ah->oaddr->s_addr == htonl(ntohl(la->pData->special_addr.s_addr)|CTL_DNS)))
    75         return (0);
    76     return (-1);
     87        return 0;
     88
     89    return -1;
    7790}
    7891
     
    8093{
    8194    int i;
    82     if (h == NULL)
    83     {
    84         hdr->X.qr = 1; /*response*/
     95
     96    if (!h)
     97    {
     98        hdr->X.qr = 1; /* response */
    8599        hdr->X.aa = 1;
    86100        hdr->X.rd = 1;
     
    98112       
    99113#if 0
    100         /*here is no compressed names+answers + new query*/
     114        /* here is no compressed names+answers + new query */
    101115        m_inc(m, h->h_length * sizeof(struct dnsmsg_answer) + strlen(qname) + 2 * sizeof(uint16_t));
    102116#endif
    103         packet_len = (pip->ip_hl << 2) + sizeof(struct udphdr) + sizeof(union dnsmsg_header)
    104             + strlen(qname) +  2 * sizeof(uint16_t); /* ip + udp + header + query */
     117        packet_len = (pip->ip_hl << 2)
     118                   + sizeof(struct udphdr)
     119                   + sizeof(union dnsmsg_header)
     120                   + strlen(qname)
     121                   + 2 * sizeof(uint16_t); /* ip + udp + header + query */
    105122        query = (char *)&hdr[1];
    106123
    107124        strcpy(query, qname);
    108         query += strlen(qname);
    109         query ++;
    110        
     125        query += strlen(qname) + 1;
     126
    111127        *(uint16_t *)query = htons(1);
    112128        ((uint16_t *)query)[1] = htons(1);
     
    115131        off = (char *)&hdr[1] - (char *)hdr;
    116132        off |= (0x3 << 14);
    117         /*add aliases */
    118         cstr = h->h_aliases;
    119         while(*cstr)
     133
     134        /* add aliases */
     135        for (cstr = h->h_aliases; *cstr; cstr++)
    120136        {
    121137            uint16_t len;
    122138            struct dnsmsg_answer *ans = (struct dnsmsg_answer *)answers;
    123139            ans->name = htons(off);
    124             ans->type = htons(5); /*CNAME*/
     140            ans->type = htons(5); /* CNAME */
    125141            ans->class = htons(1);
    126142            *(uint32_t *)ans->ttl = htonl(3600); /* 1h */
    127             c = (addr_off == (uint16_t)~0?h->h_name : *cstr);
     143            c = (addr_off == (uint16_t)~0 ? h->h_name : *cstr);
    128144            len = strlen(c) + 2;
    129145            ans->rdata_len = htons(len);
    130146            ans->rdata[len - 1] = 0;
    131             cstr2qstr(c, (char *)ans->rdata);
     147            CStr2QStr(c, (char *)ans->rdata, len);
    132148            off = (char *)&ans->rdata - (char *)hdr;
    133149            off |= (0x3 << 14);
     
    137153            packet_len += sizeof(struct dnsmsg_answer) + len - 2;
    138154            hdr->X.ancount++;
    139             cstr++;
    140         }
    141         /*add addresses */
     155        }
     156        /* add addresses */
    142157
    143158        for(i = 0; i < h->h_length && h->h_addr_list[i] != NULL; ++i)
     
    155170            hdr->X.ancount++;
    156171        }
    157         hdr->X.qr = 1; /*response*/
     172        hdr->X.qr = 1; /* response */
    158173        hdr->X.aa = 1;
    159174        hdr->X.rd = 1;
     
    161176        hdr->X.rcode = 0;
    162177        HTONS(hdr->X.ancount);
    163         /*don't forget update m_len*/
     178        /* don't forget update m_len */
    164179        pip->ip_len = htons(packet_len);
    165180    }
     
    169184{
    170185    int i;
    171     /*Parse dns request */
     186    /* Parse dns request */
    172187    char *qw_qname = NULL;
    173188    uint16_t *qw_qtype = NULL;
    174189    uint16_t *qw_qclass = NULL;
    175190    struct hostent *h = NULL;
    176     char *cname[255]; /* ??? */
     191    char cname[255];
    177192
    178193    struct udphdr *udp = NULL;
     
    182197
    183198    if (hdr->X.qr == 1)
    184         return 0; /* this is respose*/
     199        return 0; /* this is respose */
    185200
    186201    qw_qname = (char *)&hdr[1];
     
    194209            qw_qname, ntohs(*qw_qtype), ntohs(*qw_qclass));
    195210    }
    196     qstr2cstr(qw_qname, (char *)cname);
    197     h = gethostbyname((char *)cname);
     211
     212    QStr2CStr(qw_qname, cname, sizeof(cname));
     213    h = gethostbyname(cname);
    198214    fprintf(stderr, "cname:%s\n", cname);
    199215    doanswer(la, hdr, qw_qname, pip, h);
    200     /*we've chenged size and conten of udp, to avoid double csum calcualtion
    201      *will assign to zero
     216
     217    /*
     218     * We have changed the size and the content of udp, to avoid double csum calculation
     219     * will assign to zero
    202220     */
    203221    udp->uh_sum = 0;
     
    205223    pip->ip_sum = 0;
    206224    pip->ip_sum = LibAliasInternetChecksum(la, (uint16_t *)pip, pip->ip_hl << 2);
    207     return (0);
    208 }
     225    return 0;
     226}
     227
    209228/*
    210229 * qstr is z-string with -dot- replaced with \count to next -dot-
     
    212231 * Note: it's assumed that caller allocates buffer for cstr
    213232 */
    214 static void qstr2cstr(char *qname, char *cname)
    215 {
    216     char *q = qname;
    217     char *c = cname;
    218     while(*q != 0)
    219     {
    220         if (isalpha(*q) || isdigit(*q))
     233static void QStr2CStr(const char *pcszQStr, char *pszStr, size_t cStr)
     234{
     235    const char *q;
     236    char *c;
     237    size_t cLen = 0;
     238
     239    Assert(cStr > 0);
     240    for (q = pcszQStr, c = pszStr; *q != '\0' && cLen < cStr-1; q++, cLen++)
     241    {
     242        if (   isalpha(*q)
     243            || isdigit(*q)
     244            || *q == '-'
     245            || *q == '_')
    221246        {
    222247           *c = *q;
    223248            c++;
    224249        }
    225         else if (c != &cname[0])
     250        else if (c != &pszStr[0])
    226251        {
    227252            *c = '.';
    228253            c++;
    229254        }
    230         q++;
    231     }
    232     q = 0;
    233 }
     255    }
     256    *c = '\0';
     257}
     258
    234259/*
    235260 *
    236261 */
    237 static void cstr2qstr(char *cstr, char *qstr)
    238 {
    239     char *c, *pc, *q;
    240     c = cstr;
    241     q = qstr;
    242     while(*c != 0)
    243     {
    244         /* a the begining or at -dot- position */
    245         if (*c == '.' || (c == cstr && q == qstr))
    246         {
    247             if (c != cstr) c++;
     262static void CStr2QStr(const char *pcszStr, char *pszQStr, size_t cQStr)
     263{
     264    const char *c;
     265    const char *pc;
     266    char *q;
     267    size_t cLen = 0;
     268
     269    Assert(cQStr > 0);
     270    for (c = pcszStr, q = pszQStr; *c != '\0' && cLen < cQStr-1; q++, cLen++)
     271    {
     272        /* at the begining or at -dot- position */
     273        if (*c == '.' || (c == pcszStr && q == pszQStr))
     274        {
     275            if (c != pcszStr)
     276                c++;
    248277            pc = strchr(c, '.');
    249             *q = pc != NULL ? (pc - c) : strlen(c);
    250             q++;
    251             continue;
    252         }
    253         (*q) = (*c); /*direct copy*/
    254         q++;
    255         c++;
    256     }
    257     q = 0;
     278            *q = pc ? (pc - c) : strlen(c);
     279        }
     280        else
     281        {
     282            *q = *c;
     283            c++;
     284        }
     285    }
     286    *q = '\0';
    258287}
    259288
     
    276305{
    277306    int error;
    278     if (handlers == NULL)
     307
     308    if (!handlers)
    279309        handlers = RTMemAllocZ(2 * sizeof(struct proto_handler));
     310
    280311    handlers[0].pri = 20;
    281312    handlers[0].dir = IN;
     
    285316    handlers[1].pri = EOH;
    286317
    287     switch (type) {   
    288     case MOD_LOAD:
    289         error = 0;
    290         LibAliasAttachHandlers(pData, handlers);
    291         break;
    292     case MOD_UNLOAD:
    293         error = 0;
    294         LibAliasDetachHandlers(pData, handlers);
    295         RTMemFree(handlers);
    296         handlers = NULL;
    297         break;
    298     default:
    299         error = EINVAL;
    300     }
    301     return (error);
    302 }
     318    switch (type)
     319    {
     320        case MOD_LOAD:
     321            error = 0;
     322            LibAliasAttachHandlers(pData, handlers);
     323            break;
     324
     325        case MOD_UNLOAD:
     326            error = 0;
     327            LibAliasDetachHandlers(pData, handlers);
     328            RTMemFree(handlers);
     329            handlers = NULL;
     330            break;
     331
     332        default:
     333            error = EINVAL;
     334    }
     335    return error;
     336}
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