Changeset 8645c9d7 in rtems-libbsd for ipsec-tools/src/racoon/isakmp_frag.c


Ignore:
Timestamp:
Jun 6, 2018, 9:11:52 AM (17 months ago)
Author:
Christian Mauderer <christian.mauderer@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, 4a77611a223ea883fb548679b516d326a020d447
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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.