Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/reass.c

    r34c1bba r8ef1c1e  
    129129        assert(fibril_mutex_is_locked(&reass_dgram_map_lock));
    130130
    131         list_foreach(reass_dgram_map, link) {
    132                 reass_dgram_t *rdg = list_get_instance(link, reass_dgram_t,
    133                     map_link);
    134 
     131        list_foreach(reass_dgram_map, map_link, reass_dgram_t, rdg) {
    135132                link_t *f1_link = list_first(&rdg->frags);
    136133                assert(f1_link != NULL);
     
    196193
    197194        data_copy = malloc(packet->size);
    198         if (data_copy == NULL)
     195        if (data_copy == NULL) {
     196                free(frag);
    199197                return ENOMEM;
     198        }
     199
     200        memcpy(data_copy, packet->data, packet->size);
    200201
    201202        frag->packet = *packet;
     
    219220                        break;
    220221
    221                 link = link->next;
     222                link = list_next(link, &rdg->frags);
    222223        }
    223224
     
    243244        assert(!list_empty(&rdg->frags));
    244245
     246        link = list_first(&rdg->frags);
     247        assert(link != NULL);
     248
     249        frag = list_get_instance(link, reass_frag_t,
     250            dgram_link);
     251
    245252        /* First fragment must be at offset zero */
    246         frag = list_get_instance(list_first(&rdg->frags), reass_frag_t,
    247             dgram_link);
    248253        if (frag->packet.offs != 0)
    249254                return false;
    250255
    251256        prev = frag;
     257
    252258        while (true) {
    253                 link = frag->dgram_link.next;
     259                link = list_next(link, &rdg->frags);
    254260                if (link == NULL)
    255                         return false;
     261                        break;
    256262
    257263                /* Each next fragment must follow immediately or overlap */
     
    289295        size_t fragoff_limit;
    290296        inet_dgram_t dgram;
     297        uint8_t proto;
    291298        reass_frag_t *frag;
    292         uint8_t proto;
     299        int rc;
    293300
    294301        /*
     
    297304         */
    298305        frag = NULL;
    299         list_foreach(rdg->frags, link) {
    300                 frag = list_get_instance(link, reass_frag_t, dgram_link);
    301 
    302                 if (!frag->packet.mf)
     306        list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) {
     307                if (!cfrag->packet.mf) {
     308                        frag = cfrag;
    303309                        break;
     310                }
    304311        }
    305312
     
    310317
    311318        /* Upper bound for fragment offset field */
    312         fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);
     319        fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l + 1);
    313320
    314321        /* Verify that total size of datagram is within reasonable bounds */
     
    320327                return ENOMEM;
    321328
     329        /* XXX What if different fragments came from different link? */
     330        dgram.iplink = frag->packet.link_id;
    322331        dgram.size = dgram_size;
    323332        dgram.src = frag->packet.src;
     
    330339        size_t doffs = 0;
    331340
    332         frag = NULL;
    333         list_foreach(rdg->frags, link) {
    334                 frag = list_get_instance(link, reass_frag_t, dgram_link);
    335 
     341        list_foreach(rdg->frags, dgram_link, reass_frag_t, cfrag) {
    336342                size_t cb, ce;
    337343
    338                 cb = max(doffs, frag->packet.offs);
    339                 ce = min(dgram_size, frag->packet.offs + frag->packet.size);
     344                cb = max(doffs, cfrag->packet.offs);
     345                ce = min(dgram_size, cfrag->packet.offs + cfrag->packet.size);
    340346
    341347                if (ce > cb) {
    342348                        memcpy(dgram.data + cb,
    343                             frag->packet.data + cb - frag->packet.offs,
     349                            cfrag->packet.data + cb - cfrag->packet.offs,
    344350                            ce - cb);
    345351                }
    346352
    347                 if (!frag->packet.mf)
     353                if (!cfrag->packet.mf)
    348354                        break;
    349355        }
    350356
    351         return inet_recv_dgram_local(&dgram, proto);
     357        rc = inet_recv_dgram_local(&dgram, proto);
     358        free(dgram.data);
     359        return rc;
    352360}
    353361
Note: See TracChangeset for help on using the changeset viewer.