From npiggin at gmail.com Tue Feb 6 00:02:08 2024 From: npiggin at gmail.com (Nicholas Piggin) Date: Mon, 5 Feb 2024 23:02:08 +1000 Subject: [PATCH 1/2] ui: Fix compile with curses opaque menu headers In-Reply-To: <20240205130209.222045-1-npiggin@gmail.com> References: <20240205130209.222045-1-npiggin@gmail.com> Message-ID: <20240205130209.222045-2-npiggin@gmail.com> Recent Debian ncurses is built with NCURSES_OPAQUE_MENU, which means the menu item type can't be poked directly. Fix with accessors. One wrinkle is the item name can't be modified, new_item has to be used. Signed-off-by: Nicholas Piggin --- ui/ncurses/nc-menu.c | 12 ++++++++---- ui/ncurses/nc-menu.h | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c index a90a02e..a1524b5 100644 --- a/ui/ncurses/nc-menu.c +++ b/ui/ncurses/nc-menu.c @@ -141,9 +141,13 @@ int pmenu_item_update(struct pmenu_item *item, const char *name) if (!label) return -1; - i = item->nci; - i->name.str = label; - i->name.length = strncols(label); + i = new_item(label, NULL); + if (!i) { + talloc_free((char *)label); + return -1; + } + free_item(item->nci); + item->nci = i; return 0; } @@ -358,7 +362,7 @@ static int pmenu_item_get_index(const struct pmenu_item *item) return i; pb_log_fn("not found: %p %s\n", item, - (item ? item->nci->name.str : "(null)")); + (item ? item_name(item->nci) : "(null)")); return -1; } diff --git a/ui/ncurses/nc-menu.h b/ui/ncurses/nc-menu.h index eb568c8..550c7e1 100644 --- a/ui/ncurses/nc-menu.h +++ b/ui/ncurses/nc-menu.h @@ -126,7 +126,7 @@ static inline struct pmenu *pmenu_from_scr(struct nc_scr *scr) static inline void pmenu_dump_item(const ITEM *item) { - pb_debug("%p %s\n", item, (item ? item->name.str : "(null)")); + pb_debug("%p %s\n", item, (item ? item_name(item) : "(null)")); } static inline void pmenu_dump_items(ITEM *const *items, unsigned int count) @@ -135,7 +135,7 @@ static inline void pmenu_dump_items(ITEM *const *items, unsigned int count) for (i = 0; i < count; i++) pb_debug("%u: %p %s\n", i, items[i], - (items[i] ? items[i]->name.str : "(null)")); + (items[i] ? item_name(items[i]) : "(null)")); } #endif -- 2.42.0 From npiggin at gmail.com Tue Feb 6 00:02:07 2024 From: npiggin at gmail.com (Nicholas Piggin) Date: Mon, 5 Feb 2024 23:02:07 +1000 Subject: [PATCH 0/2] compile fix and (possible) memory leak Message-ID: <20240205130209.222045-1-npiggin@gmail.com> This fixes the compile for recent Debian, which uses "opaque" curses headers. Patches are based on top of Geoff's build tree. Thanks, Nick Nicholas Piggin (2): ui: Fix compile with curses opaque menu headers ui: Fix curses menu item label leak ui/ncurses/nc-menu.c | 16 ++++++++++++---- ui/ncurses/nc-menu.h | 5 +++-- 2 files changed, 15 insertions(+), 6 deletions(-) -- 2.42.0 From npiggin at gmail.com Tue Feb 6 00:02:09 2024 From: npiggin at gmail.com (Nicholas Piggin) Date: Mon, 5 Feb 2024 23:02:09 +1000 Subject: [PATCH 2/2] ui: Fix curses menu item label leak In-Reply-To: <20240205130209.222045-1-npiggin@gmail.com> References: <20240205130209.222045-1-npiggin@gmail.com> Message-ID: <20240205130209.222045-3-npiggin@gmail.com> When a menu item name is updated, the old label is not freed. Signed-off-by: Nicholas Piggin --- ui/ncurses/nc-menu.c | 4 ++++ ui/ncurses/nc-menu.h | 1 + 2 files changed, 5 insertions(+) diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c index a1524b5..70f2210 100644 --- a/ui/ncurses/nc-menu.c +++ b/ui/ncurses/nc-menu.c @@ -82,6 +82,7 @@ static void pmenu_resize(struct nc_scr *scr) static int pmenu_item_destructor(void *arg) { struct pmenu_item *item = arg; + talloc_free((char *)item->label); free_item(item->nci); return 0; } @@ -146,7 +147,9 @@ int pmenu_item_update(struct pmenu_item *item, const char *name) talloc_free((char *)label); return -1; } + talloc_free((char *)item->label); free_item(item->nci); + item->label = label; item->nci = i; return 0; @@ -168,6 +171,7 @@ struct pmenu_item *pmenu_item_create(struct pmenu *menu, const char *name) item->i_sig = pb_item_sig; item->pmenu = menu; + item->label = label; item->nci = new_item(label, NULL); if (!item->nci) { diff --git a/ui/ncurses/nc-menu.h b/ui/ncurses/nc-menu.h index 550c7e1..7ba45bf 100644 --- a/ui/ncurses/nc-menu.h +++ b/ui/ncurses/nc-menu.h @@ -46,6 +46,7 @@ struct pmenu; struct pmenu_item { enum pb_nc_sig i_sig; + const char *label; ITEM *nci; struct pmenu *pmenu; void *data; -- 2.42.0