Skip to content

Commit

Permalink
Merge pull request #17 from adamblack1/bufferOverflowBranch
Browse files Browse the repository at this point in the history
Fix "Potential buffer overflow #14" (SlimList_ToString), Performance improvements
  • Loading branch information
dougbradbury committed Mar 13, 2015
2 parents 85ca4d6 + 11a7ce7 commit 1a70a5b
Show file tree
Hide file tree
Showing 12 changed files with 437 additions and 97 deletions.
4 changes: 2 additions & 2 deletions Makefile
Expand Up @@ -22,8 +22,8 @@ CPP_PLATFORM = Gcc
# set OS_PLATFROM to win to build with winsock
# OS_PLATFORM = win

#CFLAGS are set to override malloc and free to get memory leak detection in C programs
CPPUTEST_CFLAGS = -Dmalloc=cpputest_malloc -Dfree=cpputest_free
#CFLAGS are set to override malloc, free, etc to get memory leak detection in C programs
CPPUTEST_CFLAGS = -Dmalloc=cpputest_malloc -Dfree=cpputest_free -Drealloc=cpputest_realloc
CPPFLAGS = -Wall
#GCOVFLAGS = -fprofile-arcs -ftest-coverage

Expand Down
15 changes: 14 additions & 1 deletion include/CSlim/SlimList.h
Expand Up @@ -6,11 +6,23 @@ extern "C" {
#endif

typedef struct SlimList SlimList;
typedef struct Node SlimListIterator;

SlimList* SlimList_Create(void);
void SlimList_Destroy(SlimList*);

SlimListIterator* SlimList_CreateIterator(SlimList*);
int SlimList_Iterator_HasItem(SlimListIterator*);
void SlimList_Iterator_Advance(SlimListIterator**);
void SlimList_Iterator_AdvanceBy(SlimListIterator**, int);

char* SlimList_Iterator_GetString(SlimListIterator*);
SlimList* SlimList_Iterator_GetList(SlimListIterator*);
void SlimList_Iterator_Replace(SlimListIterator*, const char*);

extern void SlimList_AddString(SlimList*, char const *);
void SlimList_AddList(SlimList* self, SlimList* element);
void SlimList_PopHead(SlimList* self);
int SlimList_GetLength(SlimList*);
int SlimList_Equals(SlimList* self, SlimList* other);
SlimList * SlimList_GetListAt(SlimList* self, int index);
Expand All @@ -20,7 +32,8 @@ SlimList* SlimList_GetHashAt(SlimList* self, int index);
void SlimList_ReplaceAt(SlimList* self, int index, char const * replacementString);
void SlimList_AddBuffer(SlimList* self, char const* buffer, int length);
SlimList* SlimList_GetTailAt(SlimList*, int index);
char* SlimList_ToString(SlimList*);
char* SlimList_ToString(SlimList*); /// Use CSlim_DestroyString to deallocate the string

#ifdef __cplusplus
}
#endif
Expand Down
14 changes: 14 additions & 0 deletions include/CSlim/SlimUtil.h
@@ -1,8 +1,17 @@
#ifndef SLIMUTILS_H
#define SLIMUTILS_H

#ifdef __cplusplus
extern "C" {
#endif

char * CSlim_BuyBuf(char const*, int);
char * CSlim_BuyString(char const*);

char* CSlim_CreateEmptyString(void);
void CSlim_ConcatenateString(char**, const char*);
void CSlim_DestroyString(char*);

typedef struct MapStringInt
{
const char* string;
Expand All @@ -12,4 +21,9 @@ typedef struct MapStringInt
int CSlim_MapToIntFrom(MapStringInt*, const char*);
const char* CSlim_MapToStringFrom(MapStringInt*, int);
int CSlim_IsCharacter(unsigned char const* byte);

#ifdef __cplusplus
}
#endif

#endif
19 changes: 12 additions & 7 deletions src/CSlim/ListExecutor.c
Expand Up @@ -43,7 +43,11 @@ char* InvalidCommand(SlimList* instruction) {

char* MalformedInstruction(SlimList* instruction) {
static char msg[128];
snprintf(msg, (size_t)128, "__EXCEPTION__:message:<<MALFORMED_INSTRUCTION %s.>>", SlimList_ToString(instruction));

char* listAsAString = SlimList_ToString(instruction);
snprintf(msg, (size_t)128, "__EXCEPTION__:message:<<MALFORMED_INSTRUCTION %s.>>", listAsAString);
CSlim_DestroyString(listAsAString);

return CSlim_BuyString(msg);
}

Expand Down Expand Up @@ -105,15 +109,16 @@ char* Dispatch(ListExecutor* self, SlimList* instruction) {
SlimList* ListExecutor_Execute(ListExecutor* self, SlimList* instructions)
{
SlimList* results = SlimList_Create();
int numberOfInstructions = SlimList_GetLength(instructions);
int n;
for (n=0; n<numberOfInstructions; n++) {
SlimList* instruction = SlimList_GetListAt(instructions, n);

SlimListIterator* iterator = SlimList_CreateIterator(instructions);
while (SlimList_Iterator_HasItem(iterator)) {
SlimList* instruction = SlimList_Iterator_GetList(iterator);
char* id = SlimList_GetStringAt(instruction, 0);
char* result = Dispatch(self, instruction);
AddResult(results, id, result);
if (result)
free(result);

free(result);
SlimList_Iterator_Advance(&iterator);
}

return results;
Expand Down
19 changes: 12 additions & 7 deletions src/CSlim/SlimConnectionHandler.c
Expand Up @@ -39,41 +39,43 @@ void SlimConnectionHandler_RegisterSlimMessageHandler(SlimConnectionHandler* sel
int read_size(SlimConnectionHandler* self)
{
char size[7];
size_t size_i = 0;
int size_i = 0;
char colon;
memset(size, (size_t)0, (size_t)7);

if (self->recvFunc(self->comLink, size, 6) == 6)
int receiveResult = self->recvFunc(self->comLink, size, 6);
if (receiveResult == 6)
{
if ((self->recvFunc(self->comLink, &colon, 1)) == 1 && colon == ':')
{
size_i = atoi(size);
}
} else if (receiveResult == -1) {
size_i = -1;;
}
return (int)size_i;
return size_i;
}


int SlimConnectionHandler_Run(SlimConnectionHandler* self)
{
char * message = (char*)malloc((size_t)3);
message[0] = 0;
int numbytes;

if (self->sendFunc(self->comLink, "Slim -- V0.0\n", 13) == -1)
{
return -1;
}

char* message = NULL;
while(1)
{
int size_i = read_size(self);

if (size_i > 0)
{
free(message);
message = (char*)malloc(size_i + (size_t)1);
memset(message, 0, (size_t)size_i + (size_t)1);
numbytes = self->recvFunc(self->comLink, message, size_i);
int numbytes = self->recvFunc(self->comLink, message, size_i);
if (numbytes != size_i)
{
printf("did not receive right number of bytes. %d expected but received %d\n", size_i, numbytes);
Expand All @@ -92,6 +94,9 @@ int SlimConnectionHandler_Run(SlimConnectionHandler* self)
free(length_buffer);
send_result = self->sendFunc(self->comLink, response_message, response_length);
SlimList_Release(response_message);
} else if (size_i == -1)
{
break;
}
}
free(message);
Expand Down

0 comments on commit 1a70a5b

Please sign in to comment.