summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-02-26 11:31:19 -0500
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>2010-02-26 11:31:19 -0500
commit4f28ba8c8fd9032763eac42ed3591a6b2751f84c (patch)
tree8d079eb28c0fa7adcd174cdd4180de157620934c
parentb6dd7d868756eccc06aa4b9ef6c2098d41ceaa86 (diff)
downloadscreen-4f28ba8c8fd9032763eac42ed3591a6b2751f84c.tar.gz
Some more fixes for the list management.
Make sure the allocated memory is always freed. Also, do not reference freed memory. Thank you valgrind.
-rw-r--r--src/display.c3
-rw-r--r--src/help.c12
-rw-r--r--src/input.c3
-rw-r--r--src/layer.c6
-rw-r--r--src/layer.h3
-rw-r--r--src/list_generic.c22
-rw-r--r--src/list_window.c3
-rw-r--r--src/mark.c3
-rw-r--r--src/window.c3
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