Changeset 8645c9d7 in rtems-libbsd


Ignore:
Timestamp:
Jun 6, 2018, 9:11:52 AM (11 months ago)
Author:
Christian Mauderer <christian.mauderer@…>
Branches:
647dd08ae2aa69b935c2847ea450fb824322ecae, c6261f97870562d4c797cfb1ff1ba0affb85a916
Children:
b376ae1
Parents:
ff36f5e
git-author:
Christian Mauderer <christian.mauderer@…> (06/06/18 09:11:52)
git-committer:
Christian Mauderer <christian.mauderer@…> (08/01/18 07:55:27)
Message:

ipsec-tools: Apply patches from FreeBSD ports.

Source: https://svnweb.freebsd.org/ports/head/security/ipsec-tools/files/ revision 468617.

Location:
ipsec-tools/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • ipsec-tools/src/libipsec/libpfkey.h

    rff36f5e r8645c9d7  
    8686        u_int8_t        l_natt_type;
    8787        u_int16_t       l_natt_sport, l_natt_dport;
    88         struct sockaddr *l_natt_oa;
     88        struct sockaddr *l_natt_oai, *l_natt_oar;
    8989        u_int16_t       l_natt_frag;
    9090        u_int8_t ctxdoi, ctxalg;        /* Security context DOI and algorithm */
  • ipsec-tools/src/libipsec/pfkey.c

    rff36f5e r8645c9d7  
    13361336                len += sizeof(struct sadb_x_nat_t_port);
    13371337                len += sizeof(struct sadb_x_nat_t_port);
    1338                 if (sa_parms->l_natt_oa)
     1338                if (sa_parms->l_natt_oai)
    13391339                        len += sizeof(struct sadb_address) +
    1340                           PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oa));
     1340                          PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oai));
     1341                if (sa_parms->l_natt_oar)
     1342                        len += sizeof(struct sadb_address) +
     1343                          PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oar));
    13411344#ifdef SADB_X_EXT_NAT_T_FRAG
    13421345                if (sa_parms->l_natt_frag)
     
    14531456                }
    14541457
    1455                 if (sa_parms->l_natt_oa) {
    1456                         p = pfkey_setsadbaddr(p, ep, SADB_X_EXT_NAT_T_OA,
    1457                                               sa_parms->l_natt_oa,
    1458                                               (u_int)PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oa)),
     1458                if (sa_parms->l_natt_oai) {
     1459                        p = pfkey_setsadbaddr(p, ep, SADB_X_EXT_NAT_T_OAI,
     1460                                              sa_parms->l_natt_oai,
     1461                                              (u_int)PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oai)),
     1462                                              IPSEC_ULPROTO_ANY);
     1463                        if (!p) {
     1464                                free(newmsg);
     1465                                return -1;
     1466                        }
     1467                }
     1468
     1469                if (sa_parms->l_natt_oar) {
     1470                        p = pfkey_setsadbaddr(p, ep, SADB_X_EXT_NAT_T_OAR,
     1471                                              sa_parms->l_natt_oar,
     1472                                              (u_int)PFKEY_ALIGN8(sysdep_sa_len(sa_parms->l_natt_oar)),
    14591473                                              IPSEC_ULPROTO_ANY);
    14601474                        if (!p) {
     
    20352049                case SADB_X_EXT_NAT_T_SPORT:
    20362050                case SADB_X_EXT_NAT_T_DPORT:
    2037                 case SADB_X_EXT_NAT_T_OA:
     2051                case SADB_X_EXT_NAT_T_OAI:
     2052                case SADB_X_EXT_NAT_T_OAR:
    20382053#endif
    20392054#ifdef SADB_X_EXT_TAG
     
    25932608        psaa.l_natt_sport = l_natt_sport;
    25942609        psaa.l_natt_dport = l_natt_dport;
    2595         psaa.l_natt_oa = l_natt_oa;
     2610        psaa.l_natt_oar = l_natt_oa;
    25962611        psaa.l_natt_frag = l_natt_frag;
    25972612
     
    26682683        psaa.l_natt_sport = l_natt_sport;
    26692684        psaa.l_natt_dport = l_natt_dport;
    2670         psaa.l_natt_oa = l_natt_oa;
     2685        psaa.l_natt_oai = l_natt_oa;
    26712686        psaa.l_natt_frag = l_natt_frag;
    26722687
  • ipsec-tools/src/racoon/gssapi.c

    rff36f5e r8645c9d7  
    193193        OM_uint32 maj_stat, min_stat;
    194194
     195        if (iph1->rmconf == NULL) {
     196                plog(LLV_ERROR, LOCATION, NULL, "no remote config\n");
     197                return -1;
     198        }
     199
    195200        gps = racoon_calloc(1, sizeof (struct gssapi_ph1_state));
    196201        if (gps == NULL) {
  • ipsec-tools/src/racoon/handler.h

    rff36f5e r8645c9d7  
    1 /*      $NetBSD: handler.h,v 1.25 2010/11/17 10:40:41 tteras Exp $      */
     1/*      $NetBSD: handler.h,v 1.26 2017/01/24 19:23:56 christos Exp $    */
    22
    33/* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */
     
    142142#ifdef ENABLE_FRAG
    143143        int frag;                       /* IKE phase 1 fragmentation */
     144        int frag_last_index;
    144145        struct isakmp_frag_item *frag_chain;    /* Received fragments */
    145146#endif
  • ipsec-tools/src/racoon/isakmp.c

    rff36f5e r8645c9d7  
    10701070        else
    10711071                iph1->frag = 0;
     1072        iph1->frag_last_index = 0;
    10721073        iph1->frag_chain = NULL;
    10731074#endif
     
    11741175#ifdef ENABLE_FRAG
    11751176        iph1->frag = 0;
     1177        iph1->frag_last_index = 0;
    11761178        iph1->frag_chain = NULL;
    11771179#endif
  • ipsec-tools/src/racoon/isakmp_cfg.c

    rff36f5e r8645c9d7  
    3939#include <sys/queue.h>
    4040
     41#if __FreeBSD_version >= 900007
    4142#include <utmpx.h>
     43#endif
    4244#if defined(__APPLE__) && defined(__MACH__)
    4345#include <util.h>
     
    16641666        int inout;
    16651667{
     1668#if __FreeBSD_version >= 900007
    16661669        int error = 0;
    16671670        struct utmpx ut;
     
    17071710                break;
    17081711        }
     1712#endif
    17091713
    17101714        return 0;
  • ipsec-tools/src/racoon/isakmp_frag.c

    rff36f5e r8645c9d7  
    1 /*      $NetBSD: isakmp_frag.c,v 1.5 2009/04/22 11:24:20 tteras Exp $   */
     1/*      $NetBSD: isakmp_frag.c,v 1.7 2017/07/23 05:40:27 christos Exp $ */
    22
    33/* Id: isakmp_frag.c,v 1.4 2004/11/13 17:31:36 manubsd Exp */
     
    174174}
    175175
     176static int
     177isakmp_frag_insert(struct ph1handle *iph1, struct isakmp_frag_item *item)
     178{
     179        struct isakmp_frag_item *pitem = NULL;
     180        struct isakmp_frag_item *citem = iph1->frag_chain;
     181
     182        /* no frag yet, just insert at beginning of list */
     183        if (iph1->frag_chain == NULL) {
     184                iph1->frag_chain = item;
     185                return 0;
     186        }
     187
     188        do {
     189                /* duplicate fragment number, abort (CVE-2016-10396) */
     190                if (citem->frag_num == item->frag_num)
     191                        return -1;
     192
     193                /* need to insert before current item */
     194                if (citem->frag_num > item->frag_num) {
     195                        if (pitem != NULL)
     196                                pitem->frag_next = item;
     197                        else
     198                                /* insert at the beginning of the list  */
     199                                iph1->frag_chain = item;
     200                        item->frag_next = citem;
     201                        return 0;
     202                }
     203
     204                pitem = citem;
     205                citem = citem->frag_next;
     206        } while (citem != NULL);
     207
     208        /* we reached the end of the list, insert */
     209        pitem->frag_next = item;
     210        return 0;
     211}
     212
    176213int
    177214isakmp_frag_extract(iph1, msg)
     
    225262        item->frag_packet = buf;
    226263
    227         /* Look for the last frag while inserting the new item in the chain */
    228         if (item->frag_last)
    229                 last_frag = item->frag_num;
    230 
    231         if (iph1->frag_chain == NULL) {
    232                 iph1->frag_chain = item;
    233         } else {
    234                 struct isakmp_frag_item *current;
    235 
    236                 current = iph1->frag_chain;
    237                 while (current->frag_next) {
    238                         if (current->frag_last)
    239                                 last_frag = item->frag_num;
    240                         current = current->frag_next;
    241                 }
    242                 current->frag_next = item;
    243         }
    244 
    245         /* If we saw the last frag, check if the chain is complete */
     264        /* Check for the last frag before inserting the new item in the chain */
     265        if (item->frag_last) {
     266                /* if we have the last fragment, indices must match */
     267                if (iph1->frag_last_index != 0 &&
     268                    item->frag_last != iph1->frag_last_index) {
     269                        plog(LLV_ERROR, LOCATION, NULL,
     270                             "Repeated last fragment index mismatch\n");
     271                        racoon_free(item);
     272                        vfree(buf);
     273                        return -1;
     274                }
     275
     276                last_frag = iph1->frag_last_index = item->frag_num;
     277        }
     278
     279        /* insert fragment into chain */
     280        if (isakmp_frag_insert(iph1, item) == -1) {
     281                plog(LLV_ERROR, LOCATION, NULL,
     282                    "Repeated fragment index mismatch\n");
     283                racoon_free(item);
     284                vfree(buf);
     285                return -1;
     286        }
     287
     288        /* If we saw the last frag, check if the chain is complete
     289         * we have a sorted list now, so just walk through */
    246290        if (last_frag != 0) {
     291                item = iph1->frag_chain;
    247292                for (i = 1; i <= last_frag; i++) {
    248                         item = iph1->frag_chain;
    249                         do {
    250                                 if (item->frag_num == i)
    251                                         break;
    252                                 item = item->frag_next;
    253                         } while (item != NULL);
    254 
     293                        if (item->frag_num != i)
     294                                break;
     295                        item = item->frag_next;
    255296                        if (item == NULL) /* Not found */
    256297                                break;
    257298                }
    258299
    259                 if (item != NULL) /* It is complete */
     300                if (i > last_frag) /* It is complete */
    260301                        return 1;
    261302        }
     
    292333        data = buf->v;
    293334
     335        item = iph1->frag_chain;
    294336        for (i = 1; i <= frag_count; i++) {
    295                 item = iph1->frag_chain;
    296                 do {
    297                         if (item->frag_num == i)
    298                                 break;
    299                         item = item->frag_next;
    300                 } while (item != NULL);
    301 
    302                 if (item == NULL) {
     337                if (item->frag_num != i) {
    303338                        plog(LLV_ERROR, LOCATION, NULL,
    304339                            "Missing fragment #%d\n", i);
     
    309344                memcpy(data, item->frag_packet->v, item->frag_packet->l);
    310345                data += item->frag_packet->l;
     346                item = item->frag_next;
    311347        }
    312348
  • ipsec-tools/src/racoon/isakmp_inf.c

    rff36f5e r8645c9d7  
    722722#ifdef ENABLE_FRAG
    723723        iph1->frag = 0;
     724        iph1->frag_last_index = 0;
    724725        iph1->frag_chain = NULL;
    725726#endif
  • ipsec-tools/src/racoon/isakmp_quick.c

    rff36f5e r8645c9d7  
    23922392                             _XIDT(iph2->id_p),idi2type);
    23932393                }
     2394#ifdef ENABLE_NATT
     2395                if (iph2->ph1->natt_flags & NAT_DETECTED_PEER) {
     2396                        u_int16_t port;
     2397
     2398                        port = extract_port(&spidx.src);
     2399                        memcpy(&spidx.src, iph2->ph1->remote,
     2400                            sysdep_sa_len(iph2->ph1->remote));
     2401                        set_port(&spidx.src, port);
     2402                        switch (spidx.src.ss_family) {
     2403                        case AF_INET:
     2404                                spidx.prefs = sizeof(struct in_addr) << 3;
     2405                                break;
     2406#ifdef INET6
     2407                        case AF_INET6:
     2408                                spidx.prefs = sizeof(struct in6_addr) << 3;
     2409                                break;
     2410#endif
     2411                        default:
     2412                                spidx.prefs = 0;
     2413                                break;
     2414                        }
     2415                        plog(LLV_DEBUG, LOCATION,
     2416                                NULL, "use NAT address %s as src\n",
     2417                                saddr2str((struct sockaddr *)&spidx.src));
     2418                }
     2419#endif
    23942420        } else {
    23952421                plog(LLV_DEBUG, LOCATION, NULL,
  • ipsec-tools/src/racoon/localconf.c

    rff36f5e r8645c9d7  
    208208                        continue;       /* no 2nd parameter */
    209209                p--;
    210                 if (strncmp(buf, str, len) == 0 && buf[len] == '\0') {
     210                if (strcmp(buf, "*") == 0
     211                 || (strncmp(buf, str, len) == 0 && buf[len] == '\0')) {
    211212                        p++;
    212213                        keylen = 0;
  • ipsec-tools/src/racoon/nattraversal.c

    rff36f5e r8645c9d7  
    437437  int ret = 0;
    438438 
    439   /* Should only the NATed host send keepalives?
    440      If yes, add '(iph1->natt_flags & NAT_DETECTED_ME)'
    441      to the following condition. */
    442   if (iph1->natt_flags & NAT_DETECTED &&
     439  if (iph1->natt_flags & NAT_DETECTED_ME &&
    443440      ! (iph1->natt_flags & NAT_KA_QUEUED)) {
    444441    ret = natt_keepalive_add (iph1->local, iph1->remote);
  • ipsec-tools/src/racoon/pfkey.c

    rff36f5e r8645c9d7  
    11911191                        sa_args.l_natt_sport = extract_port(iph2->ph1->remote);
    11921192                        sa_args.l_natt_dport = extract_port(iph2->ph1->local);
    1193                         sa_args.l_natt_oa = iph2->natoa_src;
     1193                        /* if (iph2->ph1->natt_flags & NAT_DETECTED_PEER) */
     1194                                sa_args.l_natt_oai = iph2->natoa_dst;
     1195                        /* if (iph2->ph1->natt_flags & NAT_DETECTED_ME) */
     1196                                sa_args.l_natt_oar = iph2->natoa_src;
    11941197#ifdef SADB_X_EXT_NAT_T_FRAG
    11951198                        sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag;
     
    14781481                        sa_args.l_natt_sport = extract_port(iph2->ph1->local);
    14791482                        sa_args.l_natt_dport = extract_port(iph2->ph1->remote);
    1480                         sa_args.l_natt_oa = iph2->natoa_dst;
    14811483#ifdef SADB_X_EXT_NAT_T_FRAG
    14821484                        sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag;
Note: See TracChangeset for help on using the changeset viewer.