aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorJan Hutter <jhutter@hsr.ch>2005-11-10 09:31:07 +0000
committerJan Hutter <jhutter@hsr.ch>2005-11-10 09:31:07 +0000
commitc7748338f2f83bdc0b19894366de668c22f74e7c (patch)
tree4ad26632e5b4c7cf56be9964bfaf5ebfad8533f4 /Source
parent67a57dc6f4f0eaec37e9e4b71be91595d1c5d2ac (diff)
downloadstrongswan-c7748338f2f83bdc0b19894366de668c22f74e7c.tar.bz2
strongswan-c7748338f2f83bdc0b19894366de668c22f74e7c.tar.xz
- fixed bug in memory reallocation
Diffstat (limited to 'Source')
-rw-r--r--Source/charon/allocator.c52
-rw-r--r--Source/charon/generator.c21
-rw-r--r--Source/charon/generator.h7
-rw-r--r--Source/charon/tests.c4
-rw-r--r--Source/charon/tests/generator_test.c4
5 files changed, 63 insertions, 25 deletions
diff --git a/Source/charon/allocator.c b/Source/charon/allocator.c
index 2fe5fc6a6..5ad9ac9ab 100644
--- a/Source/charon/allocator.c
+++ b/Source/charon/allocator.c
@@ -33,6 +33,7 @@
#endif
#include "allocator.h"
+#include "types.h"
#ifdef LEAK_DETECTIVE
@@ -93,16 +94,29 @@ struct private_allocator_s
* Mutex used to make sure, all functions are thread-save
*/
pthread_mutex_t mutex;
+
+ /**
+ * Allocates memory with LEAK_DETECTION and
+ * returns an empty data area filled with zeros.
+ *
+ * @param this private_allocator_t object
+ * @param bytes number of bytes to allocate
+ * @param file filename from which the memory is allocated
+ * @param line line number in specific file
+ * @param use_mutex If FALSE no mutex is used for allocation
+ * @return
+ * - pointer to allocated memory area if successful
+ * - NULL otherwise
+ */
+ void * (*allocate_special) (private_allocator_t *this,size_t bytes, char * file,int line, bool use_mutex);
};
-
/**
- * Implements allocator_t's function allocate.
- * See #allocator_s.allocate for description.
+ * Implements private_allocator_t's function allocate_special.
+ * See #private_allocator_s.allocate_special for description.
*/
-static void * allocate(allocator_t *allocator,size_t bytes, char * file,int line)
+static void *allocate_special(private_allocator_t *this,size_t bytes, char * file,int line, bool use_mutex)
{
- private_allocator_t *this = (private_allocator_t *) allocator;
memory_hdr_t *allocated_memory = malloc(sizeof(memory_hdr_t) + bytes);
if (allocated_memory == NULL)
@@ -110,7 +124,10 @@ static void * allocate(allocator_t *allocator,size_t bytes, char * file,int line
return allocated_memory;
}
- pthread_mutex_lock( &(this->mutex));
+ if (use_mutex)
+ {
+ pthread_mutex_lock( &(this->mutex));
+ }
allocated_memory->info.line = line;
allocated_memory->info.filename = file;
@@ -125,11 +142,25 @@ static void * allocate(allocator_t *allocator,size_t bytes, char * file,int line
/* fill memory with zero's */
memset(allocated_memory+1, '\0', bytes);
- pthread_mutex_unlock(&(this->mutex));
+ if (use_mutex)
+ {
+ pthread_mutex_unlock(&(this->mutex));
+ }
+
/* real memory starts after header */
return (allocated_memory+1);
}
+/**
+ * Implements allocator_t's function allocate.
+ * See #allocator_s.allocate for description.
+ */
+static void * allocate(allocator_t *allocator,size_t bytes, char * file,int line)
+{
+ private_allocator_t *this = (private_allocator_t *) allocator;
+ return (allocate_special(this,bytes, file,line,TRUE));
+}
+
/*
* Implements allocator_t's free_pointer allocate.
* See #allocator_s.free_pointer for description.
@@ -178,14 +209,16 @@ static void * reallocate(allocator_t *allocator, void * old, size_t bytes, char
{
return NULL;
}
+
pthread_mutex_lock( &(this->mutex));
allocated_memory = ((memory_hdr_t *)old) - 1;
- void *new_space = this->public.allocate(&(this->public),bytes,file,line);
+ void *new_space = this->allocate_special(this,bytes,file,line,FALSE);
+
if (new_space == NULL)
{
- this->public.free_pointer(&(this->public),old);
pthread_mutex_unlock(&(this->mutex));
+ this->public.free_pointer(&(this->public),old);
return NULL;
}
@@ -237,6 +270,7 @@ static private_allocator_t allocator = {
reallocate: reallocate,
report_memory_leaks: allocator_report_memory_leaks},
allocations: NULL,
+ allocate_special : allocate_special,
mutex: PTHREAD_MUTEX_INITIALIZER
};
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;
}
diff --git a/Source/charon/generator.h b/Source/charon/generator.h
index 38fe06546..edbe1e7fb 100644
--- a/Source/charon/generator.h
+++ b/Source/charon/generator.h
@@ -1,7 +1,7 @@
/**
* @file generator.h
*
- * @brief Generic generator class used to generate IKEv2-Header and Payload
+ * @brief Generic generator class used to generate IKEv2-header and payloads.
*
*/
@@ -27,12 +27,13 @@
#include "encodings.h"
/**
- * Data Buffer for generating has start size of 3000 Bytes
+ * Generating is done in a data buffer.
+ * This is thehe start size of this buffer in Bytes.
*/
#define GENERATOR_DATA_BUFFER_SIZE 3000
/**
- * Number of Bytes to increase the buffer if it is to small
+ * Number of bytes to increase the buffer, if it is to small.
*/
#define GENERATOR_DATA_BUFFER_INCREASE_VALUE 1000
diff --git a/Source/charon/tests.c b/Source/charon/tests.c
index cb64da799..fb7f1cc9d 100644
--- a/Source/charon/tests.c
+++ b/Source/charon/tests.c
@@ -180,8 +180,8 @@ socket_t *global_socket;
tester_t *tester = tester_create(test_output, FALSE);
- tester->perform_tests(tester,all_tests);
-/* tester->perform_test(tester,&generator_test2); */
+/* tester->perform_tests(tester,all_tests);*/
+ tester->perform_test(tester,&generator_test2);
tester->destroy(tester);
diff --git a/Source/charon/tests/generator_test.c b/Source/charon/tests/generator_test.c
index 2f6fa47f9..ac1dafcf2 100644
--- a/Source/charon/tests/generator_test.c
+++ b/Source/charon/tests/generator_test.c
@@ -84,7 +84,9 @@ void test_generator_with_header_payload(tester_t *tester)
0x00,0x00,0x00,0x07,
0x00,0x00,0x00,0x08,
};
-
+
+ tester->assert_true(tester,(generated_data.len == sizeof(expected_generation)), "compare generated data length");
+
tester->assert_true(tester,(memcmp(expected_generation,generated_data.ptr,sizeof(expected_generation)) == 0), "compare generated data");
allocator_free_chunk(generated_data);