NSIS-ka
A free C++ implementation of NSIS protocols

Changeset 4221


Ignore:
Timestamp:
Aug 11, 2009, 9:50:21 AM (8 years ago)
Author:
bless
Message:
  • hopefully a fix for ticket #123: AddressList::get_src_addr() did the wrong thing in case dest was an IPv4 mapped IPv6 address (an IPv4 address in IPv6 representation)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protlib/trunk/src/addresslist.cpp

    r4210 r4221  
    643643}
    644644
     645
    645646netaddress *
    646647AddressList::get_src_addr(const netaddress &dest, uint32_t *prefs)
     
    649650        int sfd;
    650651
    651         sfd = socket(dest.is_ipv4()?AF_INET:AF_INET6, SOCK_DGRAM, 0);
     652        netaddress canonical_dest(dest);
     653       
     654        // convert to canonical representation (do not use IPv4 mapped addresses!)
     655        // either plain IPv4 or plain IPv6
     656        canonical_dest.convert_to_ipv4();
     657
     658        sfd = socket(canonical_dest.is_ipv4() ? AF_INET : AF_INET6, SOCK_DGRAM, 0);
    652659        if (sfd == -1) {
    653660                err(1, "socket");
     
    658665        /* XXX: IPV6_PREFER_SRC_COA does not work */
    659666        if (prefs != NULL && (*prefs & IPV6_PREFER_SRC_COA)) {
    660                 res = get_first(HomeAddr_P, dest.is_ipv4());
     667                res = get_first(HomeAddr_P, canonical_dest.is_ipv4());
    661668                if (res != NULL) {
    662669                        addrlist_t *alist;
     
    666673                                for (it = alist->begin(); it != alist->end();
    667674                                    it++) {
    668                                         if ((*it).is_ipv4() == dest.is_ipv4() &&
     675                                        if ((*it).is_ipv4() == canonical_dest.is_ipv4() &&
    669676                                            !addr_is(*it, HomeAddr_P)) {
    670677                                                res = new netaddress(*it);
     
    677684        }
    678685#endif
    679         if (dest.is_ipv4()) {
     686        if (canonical_dest.is_ipv4()) {
    680687                struct sockaddr_in sin = {0};
    681688                socklen_t slen = sizeof(sin);
    682689                sin.sin_family = AF_INET;
    683690                sin.sin_port = htons(4);
    684                 dest.get_ip(sin.sin_addr);
     691                canonical_dest.get_ip(sin.sin_addr);
    685692                if (connect(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
    686693                        err(1, "connect");
     
    703710                sin6.sin6_family = AF_INET6;
    704711                sin6.sin6_port = htons(4);
    705                 dest.get_ip(sin6.sin6_addr);
     712                canonical_dest.get_ip(sin6.sin6_addr);
    706713                if (connect(sfd, (struct sockaddr *)&sin6,
    707714                    sizeof(sin6)) == -1) {
Note: See TracChangeset for help on using the changeset viewer.