From 4f28ba8c8fd9032763eac42ed3591a6b2751f84c Mon Sep 17 00:00:00 2001 From: Sadrul Habib Chowdhury Date: Fri, 26 Feb 2010 11:31:19 -0500 Subject: [PATCH] Some more fixes for the list management. Make sure the allocated memory is always freed. Also, do not reference freed memory. Thank you valgrind. --- src/display.c | 3 ++- src/help.c | 12 ++++++++---- src/input.c | 3 ++- src/layer.c | 6 +++++- src/layer.h | 3 +++ src/list_generic.c | 22 +++++++++++++++------- src/list_window.c | 3 ++- src/mark.c | 3 ++- src/window.c | 3 ++- 9 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/display.c b/src/display.c index 0707805..9f596c5 100644 --- a/src/display.c +++ b/src/display.c @@ -200,7 +200,8 @@ struct LayFuncs BlankLf = DefClearLine, DefRewrite, BlankResize, - DefRestore + DefRestore, + 0 }; /*ARGSUSED*/ diff --git a/src/help.c b/src/help.c index d818ea4..a624941 100644 --- a/src/help.c +++ b/src/help.c @@ -148,7 +148,8 @@ static struct LayFuncs HelpLf = DefClearLine, DefRewrite, DefResize, - DefRestore + DefRestore, + 0 }; @@ -504,7 +505,8 @@ static struct LayFuncs CopyrightLf = DefClearLine, DefRewrite, DefResize, - DefRestore + DefRestore, + 0 }; static const char cpmsg[] = "\ @@ -725,7 +727,8 @@ static struct LayFuncs BindkeyLf = DefClearLine, DefRewrite, DefResize, - DefRestore + DefRestore, + 0 }; @@ -922,7 +925,8 @@ static struct LayFuncs ZmodemLf = DefClearLine, DefRewrite, ZmodemResize, - DefRestore + DefRestore, + 0 }; /*ARGSUSED*/ diff --git a/src/input.c b/src/input.c index cbe7dc6..f0f9982 100644 --- a/src/input.c +++ b/src/input.c @@ -76,7 +76,8 @@ static struct LayFuncs InpLf = DefClearLine, DefRewrite, DefResize, - DefRestore + DefRestore, + 0 }; /* diff --git a/src/layer.c b/src/layer.c index c71c731..88d7360 100644 --- a/src/layer.c +++ b/src/layer.c @@ -1121,7 +1121,11 @@ ExitOverlayPage() debug1("Exiting layer %#x\n", (unsigned int)flayer); oldlay = flayer; if (oldlay->l_data) - free(oldlay->l_data); + { + if (oldlay->l_layfn->lf_LayFree) + LayFree(oldlay->l_data); + free(oldlay->l_data); + } p = Layer2Window(flayer); diff --git a/src/layer.h b/src/layer.h index 7d5da0b..8c42d2b 100644 --- a/src/layer.h +++ b/src/layer.h @@ -46,6 +46,8 @@ struct LayFuncs int (*lf_LayRewrite) __P((int, int, int, struct mchar *, int)); int (*lf_LayResize) __P((int, int)); void (*lf_LayRestore) __P((void)); + void (*lf_LayFree) __P((void *)); /* Should only free any data kept in + flayer->l_data (but not flayer->l_data itself). */ }; struct layer @@ -90,6 +92,7 @@ struct layer #define LayRewrite (*flayer->l_layfn->lf_LayRewrite) #define LayResize (*flayer->l_layfn->lf_LayResize) #define LayRestore (*flayer->l_layfn->lf_LayRestore) +#define LayFree (*flayer->l_layfn->lf_LayFree) #define LaySetCursor() LGotoPos(flayer, flayer->l_x, flayer->l_y) #define LayCanResize(l) (l->l_layfn->LayResize != DefResize) diff --git a/src/list_generic.c b/src/list_generic.c index 24caf48..d2c1742 100644 --- a/src/list_generic.c +++ b/src/list_generic.c @@ -37,6 +37,7 @@ static void ListClearLine __P((int, int, int, int)); static int ListRewrite __P((int, int, int, struct mchar *, int)); static int ListResize __P((int, int)); static void ListRestore __P((void)); +static void ListFree __P((void *)); struct LayFuncs ListLf = { @@ -46,7 +47,8 @@ struct LayFuncs ListLf = ListClearLine, ListRewrite, ListResize, - ListRestore + ListRestore, + ListFree }; /** Returns non-zero on success. */ @@ -278,14 +280,18 @@ static void ListProcess(char **ppbuf, int *plen) static void ListAbort(void) { - struct ListData *ldata = flayer->l_data; + LAY_CALL_UP(LRefreshAll(flayer, 0)); + ExitOverlayPage(); +} + +static void ListFree(void *d) +{ + struct ListData *ldata = d; glist_remove_rows(ldata); if (ldata->list_fn->gl_free) ldata->list_fn->gl_free(ldata); if (ldata->search) Free(ldata->search); - LAY_CALL_UP(LRefreshAll(flayer, 0)); - ExitOverlayPage(); } static void ListRedisplayLine(int y, int xs, int xe, int isblank) @@ -360,10 +366,12 @@ void glist_remove_rows(struct ListData *ldata) { struct ListRow *row; - for (row = ldata->root; row; row = row->next) + for (row = ldata->root; row; ) { - ldata->list_fn->gl_freerow(ldata, row); - free(row); + struct ListRow *r = row; + row = row->next; + ldata->list_fn->gl_freerow(ldata, r); + free(r); } ldata->root = ldata->selected = ldata->top = NULL; } diff --git a/src/list_window.c b/src/list_window.c index e5695df..c6af77f 100644 --- a/src/list_window.c +++ b/src/list_window.c @@ -429,9 +429,10 @@ gl_Window_input(struct ListData *ldata, char **inp, int *len) break; /* Do nothing if it's a group window */ if (wdata->onblank) { + int fnumber = wdata->fore->w_number; glist_abort(); display = cd; - SwitchWindow(wdata->fore->w_number); + SwitchWindow(fnumber); *len = 0; break; } diff --git a/src/mark.c b/src/mark.c index c90201f..ccb74f9 100644 --- a/src/mark.c +++ b/src/mark.c @@ -77,7 +77,8 @@ struct LayFuncs MarkLf = DefClearLine, MarkRewrite, DefResize, - DefRestore + DefRestore, + 0 }; int join_with_cr = 0; diff --git a/src/window.c b/src/window.c index edf04dd..99e0bc7 100644 --- a/src/window.c +++ b/src/window.c @@ -212,7 +212,8 @@ struct LayFuncs WinLf = WinClearLine, WinRewrite, WinResize, - WinRestore + WinRestore, + 0 }; static int -- 2.11.4.GIT