Changes in uspace/srv/net/inetsrv/reass.c [34c1bba:8ef1c1e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/reass.c
r34c1bba r8ef1c1e 129 129 assert(fibril_mutex_is_locked(&reass_dgram_map_lock)); 130 130 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) { 135 132 link_t *f1_link = list_first(&rdg->frags); 136 133 assert(f1_link != NULL); … … 196 193 197 194 data_copy = malloc(packet->size); 198 if (data_copy == NULL) 195 if (data_copy == NULL) { 196 free(frag); 199 197 return ENOMEM; 198 } 199 200 memcpy(data_copy, packet->data, packet->size); 200 201 201 202 frag->packet = *packet; … … 219 220 break; 220 221 221 link = li nk->next;222 link = list_next(link, &rdg->frags); 222 223 } 223 224 … … 243 244 assert(!list_empty(&rdg->frags)); 244 245 246 link = list_first(&rdg->frags); 247 assert(link != NULL); 248 249 frag = list_get_instance(link, reass_frag_t, 250 dgram_link); 251 245 252 /* First fragment must be at offset zero */ 246 frag = list_get_instance(list_first(&rdg->frags), reass_frag_t,247 dgram_link);248 253 if (frag->packet.offs != 0) 249 254 return false; 250 255 251 256 prev = frag; 257 252 258 while (true) { 253 link = frag->dgram_link.next;259 link = list_next(link, &rdg->frags); 254 260 if (link == NULL) 255 return false;261 break; 256 262 257 263 /* Each next fragment must follow immediately or overlap */ … … 289 295 size_t fragoff_limit; 290 296 inet_dgram_t dgram; 297 uint8_t proto; 291 298 reass_frag_t *frag; 292 uint8_t proto;299 int rc; 293 300 294 301 /* … … 297 304 */ 298 305 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; 303 309 break; 310 } 304 311 } 305 312 … … 310 317 311 318 /* 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); 313 320 314 321 /* Verify that total size of datagram is within reasonable bounds */ … … 320 327 return ENOMEM; 321 328 329 /* XXX What if different fragments came from different link? */ 330 dgram.iplink = frag->packet.link_id; 322 331 dgram.size = dgram_size; 323 332 dgram.src = frag->packet.src; … … 330 339 size_t doffs = 0; 331 340 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) { 336 342 size_t cb, ce; 337 343 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); 340 346 341 347 if (ce > cb) { 342 348 memcpy(dgram.data + cb, 343 frag->packet.data + cb -frag->packet.offs,349 cfrag->packet.data + cb - cfrag->packet.offs, 344 350 ce - cb); 345 351 } 346 352 347 if (! frag->packet.mf)353 if (!cfrag->packet.mf) 348 354 break; 349 355 } 350 356 351 return inet_recv_dgram_local(&dgram, proto); 357 rc = inet_recv_dgram_local(&dgram, proto); 358 free(dgram.data); 359 return rc; 352 360 } 353 361
Note:
See TracChangeset
for help on using the changeset viewer.