From 2ecd7229ee642ee7c6fc53caaf7053fe21c7e06a Mon Sep 17 00:00:00 2001 From: Kiran Kumar Arsam Date: Fri, 7 Mar 2025 19:23:46 +0530 Subject: [PATCH 1/2] Memory leak fix for dataBase and callbackList --- datenbasis.c | 48 +++++++++++++++++++++++++++++++++++++++--------- datenbasis.h | 4 ++-- main.c | 15 ++++++++++++--- processFrame.c | 18 ++++++++++++++++++ processFrame.h | 6 ++++-- 5 files changed, 75 insertions(+), 16 deletions(-) diff --git a/datenbasis.c b/datenbasis.c index 773be0e..a8a3c35 100644 --- a/datenbasis.c +++ b/datenbasis.c @@ -8,7 +8,7 @@ void add_frame(struct frame_struct **db, canid_t canID, char *frameName) { s->canID = canID; s->signals = NULL; strcpy(s->name, frameName); - s->isMultiplexed = 0; + s->isMultiplexed = 0; HASH_ADD_INT( *db, canID, s ); } @@ -60,7 +60,7 @@ void add_signal(struct frame_struct *db, int frameId, char *signalName, int star struct signal_struct *newSignal; frame = find_frame(db, frameId); - + newSignal = malloc(sizeof(struct signal_struct)); strcpy(newSignal->name, signalName); newSignal->startBit = startBit; @@ -71,15 +71,15 @@ void add_signal(struct frame_struct *db, int frameId, char *signalName, int star newSignal->offset = offset; newSignal->min = min; newSignal->max = max; - - + + if(isMultiplexer > 0) { frame->isMultiplexed = 1; } newSignal->isMultiplexer = isMultiplexer; newSignal->muxId = muxId; - + strcpy(newSignal->unit, unit); strcpy(newSignal->receiverList, receiverList); @@ -110,7 +110,7 @@ int readInDatabase(struct frame_struct **db, char *Filename) { if(sscanf(line," BO_ %d %s %d %s",&frameId,frameName,&len,sender) == 4) { - frameName[strlen(frameName)-1] = 0; + frameName[strlen(frameName)-1] = 0; add_frame(db, frameId, frameName); } else if(sscanf(line," SG_ %s : %d|%d@%d%c (%f,%f) [%f|%f] %s %s",signalName, &startBit, &signalLength,&byteOrder, &signedState, &factor, &offset, &min, &max, unit, receiverList ) > 5) @@ -131,7 +131,7 @@ int readInDatabase(struct frame_struct **db, char *Filename) startBit = cpos + (bytes * 8) + (int)(startBit/8) * 8; } } - add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 0,0); + add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 0,0); } else if(sscanf(line," SG_ %s %s : %d|%d@%d%c (%f,%f) [%f|%f] %s %s",signalName, mux, &startBit, &signalLength,&byteOrder, &signedState, &factor, &offset, &min, &max, unit, receiverList ) > 5) { @@ -159,10 +159,40 @@ int readInDatabase(struct frame_struct **db, char *Filename) { sscanf(mux, "m%d", &muxId); add_signal(*db, frameId, signalName, startBit, signalLength, byteOrder == 0, signedState == '-', factor, offset, min, max, unit, receiverList, 2, muxId); - + } - + } } return 0; } + +void releaseResource(struct frame_struct **db) +{ + struct frame_struct *frame; + struct signal_struct *signals; + for (frame = *db; frame != NULL;) + { + struct frame_struct *temp = frame; + frame = (struct frame_struct *)frame->hh.next; + // free or delete + for (signals = temp->signals; signals != NULL;) + { + struct signal_struct *signal_temp = signals; + signals = (struct signal_struct *)signals->hh.next; + + HASH_DEL(temp->signals, signal_temp); + free(signal_temp); + signal_temp = NULL; + } + + HASH_DEL(*db, temp); + free(temp->signals); + temp->signals = NULL; + free(temp); + temp = NULL; + } + + free(*db); + *db = NULL; +} diff --git a/datenbasis.h b/datenbasis.h index 1cf0f6b..1713fef 100644 --- a/datenbasis.h +++ b/datenbasis.h @@ -22,7 +22,7 @@ struct signal_struct { char receiverList[512]; __u8 isMultiplexer; __u8 muxId; - + __u8 number; UT_hash_handle hh; }; @@ -46,4 +46,4 @@ struct signal_struct *find_signal_by_name(struct frame_struct *frame, char *name struct frame_struct *find_frame_by_signalname(struct frame_struct *db, char *name); void add_signal(struct frame_struct *db, int frameId, char *signalName, int startBit, int signalLength, int byteOrder, int signedState, float factor, float offset, float min, float max, char *unit, char *receiverList, unsigned char isMultiplexer, unsigned char muxId); int readInDatabase(struct frame_struct **db, char *Filename); - +void releaseResource(struct frame_struct **db); diff --git a/main.c b/main.c index 90b648d..f00b484 100644 --- a/main.c +++ b/main.c @@ -26,6 +26,8 @@ int main(int argc, char **argv) struct frame_struct *myFrame; struct timeval tv; + int res = 0; + if (argc < 2) { fprintf(stderr, "Usage:\n"); @@ -64,6 +66,7 @@ int main(int argc, char **argv) if (!myFrame) { fprintf(stderr, "Error finding Frame %s\n", frameName); + releaseResource(&dataBase); exit(1); } @@ -73,6 +76,7 @@ int main(int argc, char **argv) if (!mySignal) { fprintf(stderr, "Error finding Signal %s\n", signalName); + releaseResource(&dataBase); exit(1); } } @@ -98,15 +102,20 @@ int main(int argc, char **argv) ascframe) != 4) { fprintf(stderr, "incorrect line format in logfile\n"); - return 1; + res = 1; + goto err; } if (parse_canframe(ascframe, &cf)) { - return 1; + res = 1; + goto err; } processFrame(callbackList, &cf, tv, device); } - return 0; + err: + releaseSignalCallbackResource(&callbackList); + releaseResource(&dataBase); + return res; } diff --git a/processFrame.c b/processFrame.c index e9c41d3..f9d00f3 100644 --- a/processFrame.c +++ b/processFrame.c @@ -105,4 +105,22 @@ void processFrame(struct signal_callback_list *callbackList, struct can_frame *c } } +void releaseSignalCallbackResource(struct signal_callback_list **cb_list) +{ + struct signal_callback_list *signal_cb; + for (signal_cb = *cb_list; signal_cb != NULL;) + { + struct signal_callback_list *signal_cb_temp = signal_cb; + signal_cb = (struct signal_callback_list *)signal_cb->hh.next; + + signal_cb_temp->frame = NULL; + signal_cb_temp->signal = NULL; + signal_cb_temp->callback = 0; + signal_cb_temp->rawValue = 0; + signal_cb_temp->onChange = 0; + HASH_DEL(*cb_list, signal_cb_temp); + free(signal_cb_temp); + signal_cb_temp = NULL; + } +} diff --git a/processFrame.h b/processFrame.h index 18b4ddd..0e188ec 100644 --- a/processFrame.h +++ b/processFrame.h @@ -13,10 +13,12 @@ struct signal_callback_list { UT_hash_handle hh; }; -void add_callback(struct signal_callback_list **callbackList, +void add_callback(struct signal_callback_list **callbackList, struct frame_struct *frame, struct signal_struct *signal, void (*callback)(char *, __u64, double, struct timeval, char *device), __u8 onChange); - + void processFrame(struct signal_callback_list *callbackList, struct can_frame *cf, struct timeval tv, char *device); +void releaseSignalCallbackResource(struct signal_callback_list **cb_list); + #endif From 10f17839ff43ae0db5ac2e59180e7167add51881 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Arsam Date: Fri, 7 Mar 2025 19:40:23 +0530 Subject: [PATCH 2/2] Memory leak fix with indentation aligned --- main.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index f00b484..f1ac287 100644 --- a/main.c +++ b/main.c @@ -66,7 +66,7 @@ int main(int argc, char **argv) if (!myFrame) { fprintf(stderr, "Error finding Frame %s\n", frameName); - releaseResource(&dataBase); + releaseResource(&dataBase); exit(1); } @@ -76,7 +76,7 @@ int main(int argc, char **argv) if (!mySignal) { fprintf(stderr, "Error finding Signal %s\n", signalName); - releaseResource(&dataBase); + releaseResource(&dataBase); exit(1); } } @@ -102,20 +102,20 @@ int main(int argc, char **argv) ascframe) != 4) { fprintf(stderr, "incorrect line format in logfile\n"); - res = 1; - goto err; + res = 1; + goto err; } if (parse_canframe(ascframe, &cf)) { - res = 1; - goto err; + res = 1; + goto err; } processFrame(callbackList, &cf, tv, device); } - err: - releaseSignalCallbackResource(&callbackList); - releaseResource(&dataBase); + err: + releaseSignalCallbackResource(&callbackList); + releaseResource(&dataBase); return res; }