Skip to content

Commit 650ed22

Browse files
Merge pull request #8 from guruchandru/webcfg_db_corrupt
DB Corruption Fix
2 parents 961b1d4 + 899a06c commit 650ed22

File tree

2 files changed

+96
-39
lines changed

2 files changed

+96
-39
lines changed

src/webcfg_db.c

Lines changed: 95 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ int process_webcfgdbblobparams( blob_data_t *e, msgpack_object_map *map );
7373
//To initialize the DB when DB file is present
7474
WEBCFG_STATUS initDB(char * db_file_path )
7575
{
76-
FILE *fp;
77-
size_t sz;
78-
char *data;
79-
size_t len;
76+
FILE *fp = NULL;
77+
size_t sz = 0;
78+
char *data = NULL;
79+
size_t len = 0;
8080
int ch_count=0;
8181
webconfig_db_data_t* dm = NULL;
8282

@@ -92,13 +92,20 @@ WEBCFG_STATUS initDB(char * db_file_path )
9292
fseek(fp, 0, SEEK_END);
9393
ch_count = ftell(fp);
9494
if (ch_count == (int)-1)
95-
{
96-
WebcfgError("fread failed.\n");
97-
fclose(fp);
98-
return WEBCFG_FAILURE;
99-
}
95+
{
96+
WebcfgError("fread failed.\n");
97+
fclose(fp);
98+
return WEBCFG_FAILURE;
99+
}
100100
fseek(fp, 0, SEEK_SET);
101101
data = (char *) malloc(sizeof(char) * (ch_count + 1));
102+
if(NULL == data)
103+
{
104+
WebcfgError("Memory allocation for data failed.\n");
105+
fclose(fp);
106+
return WEBCFG_FAILURE;
107+
}
108+
memset(data,0,(ch_count + 1));
102109
sz = fread(data, 1, ch_count,fp);
103110
if (sz == (size_t)-1)
104111
{
@@ -111,7 +118,15 @@ WEBCFG_STATUS initDB(char * db_file_path )
111118
fclose(fp);
112119

113120
dm = decodeData((void *)data, len);
114-
webcfgdb_destroy (dm );
121+
if(NULL == dm)
122+
{
123+
WebcfgError("Msgpack decode failed\n");
124+
return WEBCFG_FAILURE;
125+
}
126+
else
127+
{
128+
webcfgdb_destroy (dm );
129+
}
115130
WEBCFG_FREE(data);
116131
generateBlob();
117132
return WEBCFG_SUCCESS;
@@ -126,9 +141,9 @@ WEBCFG_STATUS addNewDocEntry(size_t count)
126141

127142
WebcfgDebug("size of subdoc %ld\n", (size_t)count);
128143
webcfgdbPackSize = webcfgdb_pack(webcfgdb_data, &data, count);
129-
WebcfgDebug("size of webcfgdbPackSize %ld\n", webcfgdbPackSize);
144+
WebcfgInfo("size of webcfgdbPackSize %ld\n", webcfgdbPackSize);
130145
WebcfgInfo("writeToDBFile %s\n", WEBCFG_DB_FILE);
131-
writeToDBFile(WEBCFG_DB_FILE,(char *)data);
146+
writeToDBFile(WEBCFG_DB_FILE,(char *)data,webcfgdbPackSize);
132147
if(data)
133148
{
134149
WEBCFG_FREE(data);
@@ -154,12 +169,21 @@ WEBCFG_STATUS generateBlob()
154169
{
155170
webcfgdbBlobPackSize = webcfgdb_blob_pack(webcfgdb_data, g_head, &data);
156171
webcfgdb_blob = (blob_t *)malloc(sizeof(blob_t));
157-
webcfgdb_blob->data = (char *)data;
158-
webcfgdb_blob->len = webcfgdbBlobPackSize;
172+
if(webcfgdb_blob != NULL)
173+
{
174+
memset( webcfgdb_blob, 0, sizeof( blob_t ) );
159175

160-
WebcfgDebug("The webcfgdbBlobPackSize is : %ld\n",webcfgdb_blob->len);
161-
//WebcfgDebug("The value of blob is %s\n",webcfgdb_blob->data);
162-
return WEBCFG_SUCCESS;
176+
webcfgdb_blob->data = (char *)data;
177+
webcfgdb_blob->len = webcfgdbBlobPackSize;
178+
179+
WebcfgDebug("The webcfgdbBlobPackSize is : %ld\n",webcfgdb_blob->len);
180+
return WEBCFG_SUCCESS;
181+
}
182+
else
183+
{
184+
WebcfgError("Failed in memory allocation for webcfgdb_blob\n");
185+
return WEBCFG_FAILURE;
186+
}
163187
}
164188
else
165189
{
@@ -168,7 +192,7 @@ WEBCFG_STATUS generateBlob()
168192
}
169193
}
170194

171-
int writeToDBFile(char *db_file_path, char *data)
195+
int writeToDBFile(char *db_file_path, char *data, size_t size)
172196
{
173197
FILE *fp;
174198
fp = fopen(db_file_path , "w+");
@@ -179,7 +203,7 @@ int writeToDBFile(char *db_file_path, char *data)
179203
}
180204
if(data !=NULL)
181205
{
182-
fwrite(data, strlen(data), 1, fp);
206+
fwrite(data, size, 1, fp);
183207
fclose(fp);
184208
return 1;
185209
}
@@ -401,13 +425,21 @@ void checkDBList(char *docname, uint32_t version)
401425
{
402426
webconfig_db_data_t * webcfgdb = NULL;
403427
webcfgdb = (webconfig_db_data_t *) malloc (sizeof(webconfig_db_data_t));
428+
if(webcfgdb != NULL)
429+
{
430+
memset( webcfgdb, 0, sizeof( webconfig_db_data_t ) );
404431

405-
webcfgdb->name = strdup(docname);
406-
webcfgdb->version = version;
407-
webcfgdb->next = NULL;
432+
webcfgdb->name = strdup(docname);
433+
webcfgdb->version = version;
434+
webcfgdb->next = NULL;
408435

409-
addToDBList(webcfgdb);
410-
WebcfgInfo("webcfgdb->name added to DB %s webcfgdb->version %lu\n",webcfgdb->name, (long)webcfgdb->version);
436+
addToDBList(webcfgdb);
437+
WebcfgInfo("webcfgdb->name added to DB %s webcfgdb->version %lu\n",webcfgdb->name, (long)webcfgdb->version);
438+
}
439+
else
440+
{
441+
WebcfgError("Failed in memory allocation for webcfgdb\n");
442+
}
411443
}
412444
}
413445

@@ -603,6 +635,12 @@ int process_webcfgdbparams( webconfig_db_data_t *e, msgpack_object_map *map )
603635

604636
int process_webcfgdb( webconfig_db_data_t *wd, msgpack_object *obj )
605637
{
638+
if(NULL == obj)
639+
{
640+
WebcfgError("Msgpack decode obj NULL\n");
641+
return -1;
642+
}
643+
606644
msgpack_object_array *array = &obj->via.array;
607645
if( 0 < array->size )
608646
{
@@ -614,7 +652,15 @@ int process_webcfgdb( webconfig_db_data_t *wd, msgpack_object *obj )
614652
WebcfgDebug("entries_count %zu\n",entries_count);
615653
for( i = 0; i < entries_count; i++ )
616654
{
617-
wd = (webconfig_db_data_t *) malloc (sizeof(webconfig_db_data_t));
655+
wd = (webconfig_db_data_t *) malloc (sizeof(webconfig_db_data_t));
656+
if(NULL == wd)
657+
{
658+
WebcfgError("Failed in memory allocation for wd\n");
659+
return -1;
660+
}
661+
662+
memset( wd, 0, sizeof( webconfig_db_data_t ) );
663+
618664
if( MSGPACK_OBJECT_MAP != array->ptr[i].type )
619665
{
620666
errno = WD_INVALID_WD_OBJECT;
@@ -677,17 +723,22 @@ char * get_DB_BLOB_base64()
677723
encodeSize = b64_get_encoded_buffer_size( db_blob->len );
678724
WebcfgDebug("encodeSize is %zu\n", encodeSize);
679725
b64buffer = malloc(encodeSize + 1);
680-
b64_encode((uint8_t *)db_blob->data, db_blob->len, (uint8_t *)b64buffer);
681-
b64buffer[encodeSize] = '\0' ;
726+
if(b64buffer != NULL)
727+
{
728+
memset( b64buffer, 0, sizeof( encodeSize )+1 );
682729

683-
//Start of b64 decoding for debug purpose
684-
WebcfgDebug("----Start of b64 decoding----\n");
685-
decodeMsgSize = b64_get_decoded_buffer_size(strlen(b64buffer));
686-
WebcfgDebug("expected b64 decoded msg size : %ld bytes\n",decodeMsgSize);
730+
b64_encode((uint8_t *)db_blob->data, db_blob->len, (uint8_t *)b64buffer);
731+
b64buffer[encodeSize] = '\0' ;
687732

688-
decodeMsg = (char *) malloc(sizeof(char) * decodeMsgSize);
689-
if(decodeMsg)
690-
{
733+
//Start of b64 decoding for debug purpose
734+
WebcfgDebug("----Start of b64 decoding----\n");
735+
decodeMsgSize = b64_get_decoded_buffer_size(strlen(b64buffer));
736+
WebcfgDebug("expected b64 decoded msg size : %ld bytes\n",decodeMsgSize);
737+
738+
decodeMsg = (char *) malloc(sizeof(char) * decodeMsgSize);
739+
if(decodeMsg)
740+
{
741+
memset( decodeMsg, 0, sizeof(char) * decodeMsgSize );
691742
size = b64_decode( (const uint8_t *)b64buffer, strlen(b64buffer), (uint8_t *)decodeMsg );
692743

693744
WebcfgInfo("base64 decoded data containing %zu bytes\n",size);
@@ -705,9 +756,10 @@ char * get_DB_BLOB_base64()
705756
}
706757
webcfgdbblob_destroy(bd);
707758
WEBCFG_FREE(decodeMsg);
708-
}
759+
}
709760

710-
WebcfgDebug("---------- End of Base64 decode -------------\n");
761+
WebcfgDebug("---------- End of Base64 decode -------------\n");
762+
}
711763
}
712764
else
713765
{
@@ -828,8 +880,13 @@ char * base64blobencoder(char * blob_data, size_t blob_size )
828880
encodeSize = b64_get_encoded_buffer_size(blob_size);
829881
WebcfgDebug("encodeSize is %zu\n", encodeSize);
830882
b64buffer = malloc(encodeSize + 1);
831-
b64_encode((uint8_t *)blob_data, blob_size, (uint8_t *)b64buffer);
832-
b64buffer[encodeSize] = '\0' ;
883+
if(b64buffer != NULL)
884+
{
885+
memset( b64buffer, 0, sizeof( encodeSize )+1 );
886+
887+
b64_encode((uint8_t *)blob_data, blob_size, (uint8_t *)b64buffer);
888+
b64buffer[encodeSize] = '\0' ;
889+
}
833890
return b64buffer;
834891
}
835892

src/webcfg_db.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ WEBCFG_STATUS initDB(char * db_file_path);
8989

9090
WEBCFG_STATUS addNewDocEntry(size_t count);
9191

92-
int writeToDBFile(char * db_file_path, char * data);
92+
int writeToDBFile(char * db_file_path, char * data, size_t size);
9393

9494
WEBCFG_STATUS generateBlob();
9595

0 commit comments

Comments
 (0)