summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source3/utils/regedit_list.c23
-rw-r--r--source3/utils/regedit_treeview.c7
-rw-r--r--source3/utils/regedit_valuelist.c7
3 files changed, 25 insertions, 12 deletions
diff --git a/source3/utils/regedit_list.c b/source3/utils/regedit_list.c
index 417dea8abc..ac4e24091c 100644
--- a/source3/utils/regedit_list.c
+++ b/source3/utils/regedit_list.c
@@ -271,6 +271,7 @@ static WERROR put_data(struct multilist *list)
return WERR_OK;
}
+#define MIN_WIDTH 3
static struct multilist_column *find_widest_column(struct multilist *list)
{
unsigned col;
@@ -285,6 +286,10 @@ static struct multilist_column *find_widest_column(struct multilist *list)
}
}
+ if (colp->width < MIN_WIDTH) {
+ return NULL;
+ }
+
return colp;
}
@@ -295,6 +300,7 @@ static WERROR calc_column_widths(struct multilist *list)
size_t len;
const char *item;
size_t width, total_width, overflow;
+ struct multilist_column *colp;
/* calculate the maximum widths for each column */
for (col = 0; col < list->ncols; ++col) {
@@ -335,19 +341,12 @@ static WERROR calc_column_widths(struct multilist *list)
}
overflow = total_width - list->window_width;
- /* the window is so narrow that no amount of trimming will
- help fit the data. just give up. */
- if (overflow > width) {
- return WERR_OK;
- }
- /* keep trimming from the widest column until the row fits */
- while (overflow) {
- struct multilist_column *colp = find_widest_column(list);
- size_t max_trim = colp->width / 3;
- size_t trim = MIN(overflow, max_trim);
- colp->width -= trim;
- overflow -= trim;
+ /* attempt to trim as much as possible to fit all the columns to
+ the window */
+ while (overflow && (colp = find_widest_column(list))) {
+ colp->width--;
+ overflow--;
}
return WERR_OK;
diff --git a/source3/utils/regedit_treeview.c b/source3/utils/regedit_treeview.c
index 47765c16de..9962ad99fb 100644
--- a/source3/utils/regedit_treeview.c
+++ b/source3/utils/regedit_treeview.c
@@ -445,7 +445,14 @@ void tree_view_resize(struct tree_view *view, int nlines, int ncols,
WINDOW *nwin, *nsub;
nwin = newwin(nlines, ncols, begin_y, begin_x);
+ if (nwin == NULL) {
+ return;
+ }
nsub = subwin(nwin, nlines - 2, ncols - 2, begin_y + 1, begin_x + 1);
+ if (nsub == NULL) {
+ delwin(nwin);
+ return;
+ }
replace_panel(view->panel, nwin);
delwin(view->sub);
delwin(view->window);
diff --git a/source3/utils/regedit_valuelist.c b/source3/utils/regedit_valuelist.c
index 1c80c0911b..9557c8ca6a 100644
--- a/source3/utils/regedit_valuelist.c
+++ b/source3/utils/regedit_valuelist.c
@@ -183,7 +183,14 @@ void value_list_resize(struct value_list *vl, int nlines, int ncols,
WINDOW *nwin, *nsub;
nwin = newwin(nlines, ncols, begin_y, begin_x);
+ if (nwin == NULL) {
+ return;
+ }
nsub = subwin(nwin, nlines - 2, ncols - 2, begin_y + 1, begin_x + 1);
+ if (nsub == NULL) {
+ delwin(nwin);
+ return;
+ }
replace_panel(vl->panel, nwin);
delwin(vl->sub);
delwin(vl->window);