Do not update payload length during generation, allows hooks override payload length
authorMartin Willi <martin@revosec.ch>
Mon, 15 Nov 2010 10:53:20 +0000 (11:53 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 5 Jan 2011 15:45:47 +0000 (16:45 +0100)
src/libcharon/encoding/payloads/ke_payload.c
src/libcharon/encoding/payloads/ke_payload.h
src/libcharon/encoding/payloads/nonce_payload.c
src/libcharon/encoding/payloads/notify_payload.c
src/libcharon/encoding/payloads/proposal_substructure.c
src/libcharon/encoding/payloads/sa_payload.c
src/libcharon/encoding/payloads/transform_substructure.c
src/libcharon/encoding/payloads/ts_payload.c

index 1bc79f0..5a9f67d 100644 (file)
@@ -146,7 +146,7 @@ static payload_type_t get_type(private_ke_payload_t *this)
  */
 static payload_type_t get_next_type(private_ke_payload_t *this)
 {
-       return (this->next_payload);
+       return this->next_payload;
 }
 
 /**
@@ -163,6 +163,7 @@ static void set_next_type(private_ke_payload_t *this,payload_type_t type)
 static void compute_length(private_ke_payload_t *this)
 {
        size_t length = KE_PAYLOAD_HEADER_LENGTH;
+
        if (this->key_exchange_data.ptr != NULL)
        {
                length += this->key_exchange_data.len;
@@ -175,7 +176,6 @@ static void compute_length(private_ke_payload_t *this)
  */
 static size_t get_length(private_ke_payload_t *this)
 {
-       compute_length(this);
        return this->payload_length;
 }
 
@@ -184,26 +184,7 @@ static size_t get_length(private_ke_payload_t *this)
  */
 static chunk_t get_key_exchange_data(private_ke_payload_t *this)
 {
-       return (this->key_exchange_data);
-}
-
-/**
- * Implementation of ke_payload_t.set_key_exchange_data.
- */
-static void set_key_exchange_data(private_ke_payload_t *this, chunk_t key_exchange_data)
-{
-       /* destroy existing data first */
-       if (this->key_exchange_data.ptr != NULL)
-       {
-               /* free existing value */
-               free(this->key_exchange_data.ptr);
-               this->key_exchange_data.ptr = NULL;
-               this->key_exchange_data.len = 0;
-
-       }
-
-       this->key_exchange_data = chunk_clone(key_exchange_data);
-       compute_length(this);
+       return this->key_exchange_data;
 }
 
 /**
@@ -240,7 +221,6 @@ ke_payload_t *ke_payload_create()
 
        /* public functions */
        this->public.get_key_exchange_data = (chunk_t (*) (ke_payload_t *)) get_key_exchange_data;
-       this->public.set_key_exchange_data = (void (*) (ke_payload_t *,chunk_t)) set_key_exchange_data;
        this->public.get_dh_group_number = (diffie_hellman_group_t (*) (ke_payload_t *)) get_dh_group_number;
        this->public.set_dh_group_number =(void (*) (ke_payload_t *,diffie_hellman_group_t)) set_dh_group_number;
        this->public.destroy = (void (*) (ke_payload_t *)) destroy;
index 3ca0500..92ed29b 100644 (file)
@@ -56,15 +56,6 @@ struct ke_payload_t {
        chunk_t (*get_key_exchange_data) (ke_payload_t *this);
 
        /**
-        * Sets the key exchange data of this KE payload.
-        *
-        * Value is getting copied.
-        *
-        * @param key_exchange_data chunk_t pointing to the value to set
-        */
-       void (*set_key_exchange_data) (ke_payload_t *this, chunk_t key_exchange_data);
-
-       /**
         * Gets the Diffie-Hellman Group Number of this KE payload.
         *
         * @return                                      DH Group Number of this payload
index 4ad5ce9..2351d1f 100644 (file)
@@ -78,7 +78,7 @@ encoding_rule_t nonce_payload_encodings[] = {
        /* Length of the whole nonce payload*/
        { PAYLOAD_LENGTH,       offsetof(private_nonce_payload_t, payload_length)       },
        /* some nonce bytes, lenth is defined in PAYLOAD_LENGTH */
-       { NONCE_DATA,                   offsetof(private_nonce_payload_t, nonce)                }
+       { NONCE_DATA,           offsetof(private_nonce_payload_t, nonce)                        },
 };
 
 /*                           1                   2                   3
@@ -97,12 +97,10 @@ encoding_rule_t nonce_payload_encodings[] = {
  */
 static status_t verify(private_nonce_payload_t *this)
 {
-       if ((this->nonce.len < 16) || ((this->nonce.len > 256)))
+       if (this->nonce.len < 16 || this->nonce.len > 256)
        {
-               /* nonce length is wrong */
                return FAILED;
        }
-
        return SUCCESS;
 }
 
@@ -111,8 +109,7 @@ static status_t verify(private_nonce_payload_t *this)
  */
 static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce)
 {
-       this->nonce.ptr = clalloc(nonce.ptr, nonce.len);
-       this->nonce.len = nonce.len;
+       this->nonce = chunk_clone(nonce);
        this->payload_length = NONCE_PAYLOAD_HEADER_LENGTH + nonce.len;
        return SUCCESS;
 }
@@ -122,10 +119,7 @@ static status_t set_nonce(private_nonce_payload_t *this, chunk_t nonce)
  */
 static chunk_t get_nonce(private_nonce_payload_t *this)
 {
-       chunk_t nonce;
-       nonce.ptr = clalloc(this->nonce.ptr,this->nonce.len);
-       nonce.len = this->nonce.len;
-       return nonce;
+       return chunk_clone(this->nonce);
 }
 
 /**
@@ -150,7 +144,7 @@ static payload_type_t get_type(private_nonce_payload_t *this)
  */
 static payload_type_t get_next_type(private_nonce_payload_t *this)
 {
-       return (this->next_payload);
+       return this->next_payload;
 }
 
 /**
@@ -162,19 +156,10 @@ static void set_next_type(private_nonce_payload_t *this,payload_type_t type)
 }
 
 /**
- * recompute the length of the payload.
- */
-static void compute_length(private_nonce_payload_t *this)
-{
-       this->payload_length = NONCE_PAYLOAD_HEADER_LENGTH + this->nonce.len;
-}
-
-/**
  * Implementation of payload_t.get_length.
  */
 static size_t get_length(private_nonce_payload_t *this)
 {
-       compute_length(this);
        return this->payload_length;
 }
 
@@ -187,7 +172,6 @@ static void destroy(private_nonce_payload_t *this)
        {
                free(this->nonce.ptr);
        }
-
        free(this);
 }
 
index a56fd18..f3283e4 100644 (file)
@@ -459,7 +459,6 @@ static void compute_length (private_notify_payload_t *this)
  */
 static size_t get_length(private_notify_payload_t *this)
 {
-       compute_length(this);
        return this->payload_length;
 }
 
index 985b032..b68f017 100644 (file)
@@ -234,7 +234,6 @@ static void compute_length(private_proposal_substructure_t *this)
 METHOD(payload_t, get_length, size_t,
        private_proposal_substructure_t *this)
 {
-       compute_length(this);
        return this->proposal_length;
 }
 
@@ -366,6 +365,7 @@ METHOD(proposal_substructure_t, clone_, proposal_substructure_t*,
                add_transform_substructure(clone, current);
        }
        enumerator->destroy(enumerator);
+       compute_length(clone);
 
        return &clone->public;
 }
@@ -409,6 +409,7 @@ proposal_substructure_t *proposal_substructure_create()
                        .destroy = _destroy,
                },
                .next_payload = NO_PAYLOAD,
+               .proposal_length = PROPOSAL_SUBSTRUCTURE_HEADER_LENGTH,
                .transforms = linked_list_create(),
        );
 
@@ -500,6 +501,7 @@ proposal_substructure_t *proposal_substructure_create_from_proposal(
        }
        this->proposal_number = proposal->get_number(proposal);
        this->protocol_id = proposal->get_protocol(proposal);
+       compute_length(this);
 
        return &this->public;
 }
index 4fbd4ca..08ecba8 100644 (file)
@@ -185,7 +185,6 @@ static void compute_length(private_sa_payload_t *this)
 METHOD(payload_t, get_length, size_t,
        private_sa_payload_t *this)
 {
-       compute_length(this);
        return this->payload_length;
 }
 
index c94f6c1..83d5794 100644 (file)
@@ -203,7 +203,6 @@ static void compute_length (private_transform_substructure_t *this)
  */
 static size_t get_length(private_transform_substructure_t *this)
 {
-       compute_length(this);
        return this->transform_length;
 }
 
index 6bf3e42..3f24d2f 100644 (file)
@@ -206,7 +206,6 @@ static void compute_length (private_ts_payload_t *this)
  */
 static size_t get_length(private_ts_payload_t *this)
 {
-       compute_length(this);
        return this->payload_length;
 }
 
@@ -233,6 +232,7 @@ static void add_traffic_selector_substructure (private_ts_payload_t *this,traffi
 {
        this->traffic_selectors->insert_last(this->traffic_selectors,traffic_selector);
        this->number_of_traffic_selectors = this->traffic_selectors->get_count(this->traffic_selectors);
+       compute_length(this);
 }
 
 /**