d1_both.c (194206) | d1_both.c (196474) |
---|---|
1/* ssl/d1_both.c */ 2/* 3 * DTLS implementation written by Nagendra Modadugu 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5 */ 6/* ==================================================================== 7 * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. 8 * --- 505 unchanged lines hidden (view full) --- 514 item = pqueue_peek(s->d1->buffered_messages); 515 if ( item == NULL) 516 return 0; 517 518 frag = (hm_fragment *)item->data; 519 520 if ( s->d1->handshake_read_seq == frag->msg_header.seq) 521 { | 1/* ssl/d1_both.c */ 2/* 3 * DTLS implementation written by Nagendra Modadugu 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5 */ 6/* ==================================================================== 7 * Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. 8 * --- 505 unchanged lines hidden (view full) --- 514 item = pqueue_peek(s->d1->buffered_messages); 515 if ( item == NULL) 516 return 0; 517 518 frag = (hm_fragment *)item->data; 519 520 if ( s->d1->handshake_read_seq == frag->msg_header.seq) 521 { |
522 unsigned long frag_len = frag->msg_header.frag_len; |
|
522 pqueue_pop(s->d1->buffered_messages); 523 524 al=dtls1_preprocess_fragment(s,&frag->msg_header,max); 525 526 if (al==0) /* no alert */ 527 { 528 unsigned char *p = (unsigned char *)s->init_buf->data+DTLS1_HM_HEADER_LENGTH; 529 memcpy(&p[frag->msg_header.frag_off], 530 frag->fragment,frag->msg_header.frag_len); 531 } 532 533 dtls1_hm_fragment_free(frag); 534 pitem_free(item); 535 536 if (al==0) 537 { 538 *ok = 1; | 523 pqueue_pop(s->d1->buffered_messages); 524 525 al=dtls1_preprocess_fragment(s,&frag->msg_header,max); 526 527 if (al==0) /* no alert */ 528 { 529 unsigned char *p = (unsigned char *)s->init_buf->data+DTLS1_HM_HEADER_LENGTH; 530 memcpy(&p[frag->msg_header.frag_off], 531 frag->fragment,frag->msg_header.frag_len); 532 } 533 534 dtls1_hm_fragment_free(frag); 535 pitem_free(item); 536 537 if (al==0) 538 { 539 *ok = 1; |
539 return frag->msg_header.frag_len; | 540 return frag_len; |
540 } 541 542 ssl3_send_alert(s,SSL3_AL_FATAL,al); 543 s->init_num = 0; 544 *ok = 0; 545 return -1; 546 } 547 else --- 8 unchanged lines hidden (view full) --- 556 hm_fragment *frag = NULL; 557 pitem *item = NULL; 558 PQ_64BIT seq64; 559 unsigned long frag_len = msg_hdr->frag_len; 560 561 if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len) 562 goto err; 563 | 541 } 542 543 ssl3_send_alert(s,SSL3_AL_FATAL,al); 544 s->init_num = 0; 545 *ok = 0; 546 return -1; 547 } 548 else --- 8 unchanged lines hidden (view full) --- 557 hm_fragment *frag = NULL; 558 pitem *item = NULL; 559 PQ_64BIT seq64; 560 unsigned long frag_len = msg_hdr->frag_len; 561 562 if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len) 563 goto err; 564 |
564 if (msg_hdr->seq <= s->d1->handshake_read_seq) | 565 /* Try to find item in queue, to prevent duplicate entries */ 566 pq_64bit_init(&seq64); 567 pq_64bit_assign_word(&seq64, msg_hdr->seq); 568 item = pqueue_find(s->d1->buffered_messages, seq64); 569 pq_64bit_free(&seq64); 570 571 /* Discard the message if sequence number was already there, is 572 * too far in the future or the fragment is already in the queue */ 573 if (msg_hdr->seq <= s->d1->handshake_read_seq || 574 msg_hdr->seq > s->d1->handshake_read_seq + 10 || item != NULL) |
565 { 566 unsigned char devnull [256]; 567 568 while (frag_len) 569 { 570 i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, 571 devnull, 572 frag_len>sizeof(devnull)?sizeof(devnull):frag_len,0); 573 if (i<=0) goto err; 574 frag_len -= i; 575 } 576 } 577 | 575 { 576 unsigned char devnull [256]; 577 578 while (frag_len) 579 { 580 i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, 581 devnull, 582 frag_len>sizeof(devnull)?sizeof(devnull):frag_len,0); 583 if (i<=0) goto err; 584 frag_len -= i; 585 } 586 } 587 |
578 frag = dtls1_hm_fragment_new(frag_len); 579 if ( frag == NULL) 580 goto err; | 588 if (frag_len) 589 { 590 frag = dtls1_hm_fragment_new(frag_len); 591 if ( frag == NULL) 592 goto err; |
581 | 593 |
582 memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr)); | 594 memcpy(&(frag->msg_header), msg_hdr, sizeof(*msg_hdr)); |
583 | 595 |
584 if (frag_len) 585 { 586 /* read the body of the fragment (header has already been read */ | 596 /* read the body of the fragment (header has already been read) */ |
587 i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, 588 frag->fragment,frag_len,0); 589 if (i<=0 || (unsigned long)i!=frag_len) 590 goto err; | 597 i = s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE, 598 frag->fragment,frag_len,0); 599 if (i<=0 || (unsigned long)i!=frag_len) 600 goto err; |
591 } | |
592 | 601 |
593 pq_64bit_init(&seq64); 594 pq_64bit_assign_word(&seq64, msg_hdr->seq); | 602 pq_64bit_init(&seq64); 603 pq_64bit_assign_word(&seq64, msg_hdr->seq); |
595 | 604 |
596 item = pitem_new(seq64, frag); 597 pq_64bit_free(&seq64); 598 if ( item == NULL) 599 goto err; | 605 item = pitem_new(seq64, frag); 606 pq_64bit_free(&seq64); 607 if ( item == NULL) 608 goto err; |
600 | 609 |
601 pqueue_insert(s->d1->buffered_messages, item); | 610 pqueue_insert(s->d1->buffered_messages, item); 611 } 612 |
602 return DTLS1_HM_FRAGMENT_RETRY; 603 604err: 605 if ( frag != NULL) dtls1_hm_fragment_free(frag); 606 if ( item != NULL) OPENSSL_free(item); 607 *ok = 0; 608 return i; 609 } --- 584 unchanged lines hidden --- | 613 return DTLS1_HM_FRAGMENT_RETRY; 614 615err: 616 if ( frag != NULL) dtls1_hm_fragment_free(frag); 617 if ( item != NULL) OPENSSL_free(item); 618 *ok = 0; 619 return i; 620 } --- 584 unchanged lines hidden --- |