Deleted Added
full compact
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 ---