return (0);
}
memset(d1, 0, sizeof *d1);
+
+ if(!DTLS_RECORD_LAYER_new(&s->rlayer)) {
+ OPENSSL_free(d1);
+ ssl3_free(s);
+ return 0;
+ }
/* d1->handshake_epoch=0; */
void dtls1_free(SSL *s)
{
+ DTLS_RECORD_LAYER_free(&s->rlayer);
+
ssl3_free(s);
dtls1_clear_queues(s);
unsigned int mtu;
unsigned int link_mtu;
+ DTLS_RECORD_LAYER_clear(&s->rlayer);
+
if (s->d1) {
unprocessed_rcds = s->d1->unprocessed_rcds.q;
processed_rcds = s->d1->processed_rcds.q;
#include <openssl/pqueue.h>
#include <openssl/rand.h>
+
+int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl)
+{
+ DTLS_RECORD_LAYER *d;
+
+ if ((d = OPENSSL_malloc(sizeof *d)) == NULL) {
+ return (0);
+ }
+
+ rl->d = d;
+ DTLS_RECORD_LAYER_clear(rl);
+
+ return 1;
+}
+
+void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl)
+{
+ OPENSSL_free(rl->d);
+ rl->d = NULL;
+}
+
+void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl)
+{
+ DTLS_RECORD_LAYER *d;
+
+ d = rl->d;
+ memset(d, 0, sizeof *d);
+}
+
/* mod 128 saturating subtract of two 64-bit values in big-endian order */
static int satsub64be(const unsigned char *v1, const unsigned char *v2)
{
# endif
} DTLS1_RECORD_DATA;
+typedef struct dtls_record_layer_st {
+ /* Temporary member to be removed by subsequent commits */
+ int dummy;
+} DTLS_RECORD_LAYER;
+
typedef struct record_layer_st {
/* The parent SSL structure */
SSL *s;
unsigned char read_sequence[8];
unsigned char write_sequence[8];
+
+ DTLS_RECORD_LAYER *d;
} RECORD_LAYER;
__owur int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
unsigned int len, int create_empty_fragment);
__owur int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
+int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl);
+void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl);
+void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl);
__owur int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
int dtls1_write_bytes(SSL *s, int type, const void *buf, int len);
__owur int do_dtls1_write(SSL *s, int type, const unsigned char *buf,