diff options
author | Jan Hutter <jhutter@hsr.ch> | 2005-11-10 09:31:07 +0000 |
---|---|---|
committer | Jan Hutter <jhutter@hsr.ch> | 2005-11-10 09:31:07 +0000 |
commit | c7748338f2f83bdc0b19894366de668c22f74e7c (patch) | |
tree | 4ad26632e5b4c7cf56be9964bfaf5ebfad8533f4 /Source/charon/generator.c | |
parent | 67a57dc6f4f0eaec37e9e4b71be91595d1c5d2ac (diff) | |
download | strongswan-c7748338f2f83bdc0b19894366de668c22f74e7c.tar.bz2 strongswan-c7748338f2f83bdc0b19894366de668c22f74e7c.tar.xz |
- fixed bug in memory reallocation
Diffstat (limited to 'Source/charon/generator.c')
-rw-r--r-- | Source/charon/generator.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/Source/charon/generator.c b/Source/charon/generator.c index 5d852c50b..14419ff43 100644 --- a/Source/charon/generator.c +++ b/Source/charon/generator.c @@ -1,7 +1,7 @@ /** * @file generator.c * - * @brief Generic generator class used to generate IKEv2-Header and Payload + * @brief Generic generator class used to generate IKEv2-header and payloads. * */ @@ -22,6 +22,7 @@ #include <stdlib.h> #include <string.h> +#include <arpa/inet.h> #include "allocator.h" #include "types.h" @@ -29,7 +30,7 @@ /** - * buffer_t: used for geneartor operations + * Uused for geneartor operations */ typedef struct generator_infos_s generator_infos_t; @@ -88,15 +89,13 @@ struct generator_infos_s { */ static status_t generator_info_make_space_available (generator_infos_t *this, size_t bits) { - size_t free_bits = ((this->roof_position - this->out_position) * 8) - this->current_bit; - - while (free_bits < bits) + while ((((this->roof_position - this->out_position) * 8) - this->current_bit) < bits) { size_t old_buffer_size = ((this->roof_position) - ( this->buffer)); size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; size_t out_position_offset = ((this->out_position) - (this->buffer)); u_int8_t *new_buffer; - + new_buffer = allocator_realloc(this->buffer,new_buffer_size); if (new_buffer == NULL) { @@ -107,8 +106,9 @@ static status_t generator_info_make_space_available (generator_infos_t *this, si this->out_position = (this->buffer + out_position_offset); this->roof_position = (this->buffer + new_buffer_size); + } - + return SUCCESS; } @@ -383,22 +383,23 @@ static status_t generate (private_generator_t *this,void * data_struct,encoding_ break; case RESERVED_BIT: { + status = infos->make_space_available(infos,1); u_int8_t reserved_bit = ~(1 << (7 - infos->current_bit)); - + *(infos->out_position) = *(infos->out_position) & reserved_bit; infos->current_bit++; if (infos->current_bit >= 8) { infos->current_bit = infos->current_bit % 8; - status = infos->make_space_available(infos,8); infos->out_position++; } break; } case RESERVED_BYTE: { - if (infos->current_bit > 0) + status = infos->make_space_available(infos,8); + if ((status != SUCCESS) || (infos->current_bit > 0)) { return FAILED; } |