Control: tags -1 + patch
On 2023-12-10 20:18 +0100, Santiago Vila wrote:
> Package: src:ncurses-hexedit
> Version: 0.9.7+orig-7.2
> Severity: serious
> Tags: ftbfs
>
> Dear maintainer:
>
> During a rebuild of all packages in unstable, your package failed to build:
>
> --------------------------------------------------------------------------------
> [...]
> gcc -DHAVE_CONFIG_H -I. -I.. -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2
> -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong
> -fstack-clash-protection -Wformat -Werror=format-security
> -fcf-protection -Wall -c -o file.o file.c
> file.c: In function ‘printPage’:
> file.c:647:34: error: invalid use of incomplete typedef ‘WINDOW’ {aka ‘struct
> _win_st’}
> 647 | for (result = Globals.wmain->_curx; result < COLS; result++)
> | ^~
There are quite a few more instances of such errors across the source
code, the attached patch should fix all of them. The package builds and
from a cursory look appears to work, but it would be good if a potential
NMU'er reviews and tests the patch before uploading.
Cheers,
Sven
From 676299deb4fa83c7f100011da2948c49ba97499c Mon Sep 17 00:00:00 2001
From: Sven Joachim <[email protected]>
Date: Sun, 17 Dec 2023 16:15:43 +0100
Subject: [PATCH] Avoid accessing internal ncurses structures
Since ncurses patchlevel 20231021 the WINDOW structure is opaque, its
members cannot be addressed directly. Use the functions ncurses
provides for this purpose instead.
---
src/file.c | 2 +-
src/misc.c | 6 ++----
src/print.c | 16 ++++++++--------
src/widgets.c | 24 ++++++++++++------------
4 files changed, 23 insertions(+), 25 deletions(-)
diff --git a/src/file.c b/src/file.c
index 14a2475..ba7c147 100644
--- a/src/file.c
+++ b/src/file.c
@@ -644,7 +644,7 @@ printPage (const struct FileNames *fp)
wprintw (Globals.wmain, "%s", trunc_file);
fp = fp->p;
- for (result = Globals.wmain->_curx; result < COLS; result++)
+ for (result = getcurx(Globals.wmain); result < COLS; result++)
wprintw (Globals.wmain, " ");
}
diff --git a/src/misc.c b/src/misc.c
index 24068b4..8b0fb4b 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -641,10 +641,8 @@ handleSigwinch (int i)
if (!newlines)
die_horribly (NOT_ENOUGH_MEMORY, NULL);
- Globals.wmain->_cury = cursor_y - 1;
- Globals.wmain->_curx = cursor_x;
- stdscr->_cury = cursor_y;
- stdscr->_curx = cursor_x;
+ wmove(Globals.wmain, cursor_y - 1, cursor_x);
+ move(cursor_y, cursor_x);
if (cursor_y >= BOTTOM_LINE)
cursor_y = BOTTOM_LINE;
if (Globals.mode == FILE_MODE)
diff --git a/src/print.c b/src/print.c
index 57b291e..59b0ca1 100644
--- a/src/print.c
+++ b/src/print.c
@@ -196,16 +196,16 @@ drawAsciiDump (unsigned long off, unsigned long *offs)
if (*offs > Globals.filesize)
break;
#ifdef __NCURSES_H /* i don't know why this works */
- if (Globals.wmain->_cury == MAIN_BOTTOM_LINE)
+ if (getcury(Globals.wmain) == MAIN_BOTTOM_LINE)
#else
- if (Globals.wmain->_cury == MAIN_HEIGHT)
+ if (getcury(Globals.wmain) == MAIN_HEIGHT)
#endif
break;
- if (Globals.wmain->_curx == COLS - 2)
+ if (getcurx(Globals.wmain) == COLS - 2)
{
move = 1;
}
- if (Globals.wmain->_curx == 0)
+ if (getcurx(Globals.wmain) == 0)
*(newlines + i++) = *offs;
bold = hash_lookup (*offs, NULL);
if (!bold)
@@ -215,8 +215,8 @@ drawAsciiDump (unsigned long off, unsigned long *offs)
{
if (filebuffer (*offs) == '\n')
{
- int cury = Globals.wmain->_cury;
- int i = Globals.wmain->_curx;
+ int cury = getcury(Globals.wmain);
+ int i = getcurx(Globals.wmain);
for (; i < COLS - 2; i++)
wprintw (Globals.wmain, " ");
wprintw (Globals.wmain, ".");
@@ -235,7 +235,7 @@ drawAsciiDump (unsigned long off, unsigned long *offs)
{
if (filebuffer (*offs) == EBCDIC['\n'])
{
- int cury = Globals.wmain->_cury;
+ int cury = getcury(Globals.wmain);
wprintw (Globals.wmain, ".");
wmove (Globals.wmain, cury + 1, 0);
}
@@ -257,7 +257,7 @@ drawAsciiDump (unsigned long off, unsigned long *offs)
(*offs)++;
if (move)
{
- wmove (Globals.wmain, Globals.wmain->_cury + 1, 0);
+ wmove (Globals.wmain, getcury(Globals.wmain) + 1, 0);
move = 0;
continue;
}
diff --git a/src/widgets.c b/src/widgets.c
index eb627ad..38183f8 100644
--- a/src/widgets.c
+++ b/src/widgets.c
@@ -99,11 +99,11 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
case KEY_LEFT:
if (i > 0)
{
- if (win->_curx > x)
+ if (getcurx(win) > x)
/* not at left hand side */
{
i--;
- wmove (win, y, win->_curx - 1);
+ wmove (win, y, getcurx(win) - 1);
}
else if (i > 0)
/* left hand side */
@@ -128,11 +128,11 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
}
break;
case KEY_RIGHT:
- if (win->_curx < (x + max - 1))
+ if (getcurx(win) < (x + max - 1))
/* not at right hand side */
{
i++;
- wmove (win, y, win->_curx + 1);
+ wmove (win, y, getcurx(win) + 1);
}
else if (i < len - 1)
/* right hand side */
@@ -163,7 +163,7 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
#endif
if (i > 0)
{
- if (win->_curx > x)
+ if (getcurx(win) > x)
/* not at left hand side */
{
i--;
@@ -172,7 +172,7 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
for (n = i; n < len; n++)
*(str + n) = *(str + n + 1);
*(str + n) = 0;
- oldx = win->_curx;
+ oldx = getcurx(win);
wmove (win, y, x);
for (n = left; n <= right; n++)
{
@@ -209,8 +209,8 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
do_beep ();
break;
case SPACEBAR:
- oldx = win->_curx;
- if ((win->_curx < x + max - 1)
+ oldx = getcurx(win);
+ if ((getcurx(win) < x + max - 1)
&& (i < len - 1) && (*(str + len - 1) <= ' '))
{
for (n = len - 1; n > i; n--)
@@ -230,7 +230,7 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
}
wmove (win, y, oldx + 1);
}
- else if ((win->_curx == x + max - 1)
+ else if ((getcurx(win) == x + max - 1)
&& (i < len - 1) && (*(str + len - 1) <= ' '))
{
for (n = len - 1; n > i; n--)
@@ -255,7 +255,7 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
}
wmove (win, y, x + max - 1);
}
- else if ((win->_curx == x + max - 1)
+ else if ((getcurx(win) == x + max - 1)
&& (i == len - 1))
{
*(str + len - 1) = ' ';
@@ -285,12 +285,12 @@ stringBox (WINDOW *win, int y, int x, int len, int max, char *sample)
default: /* normal input */
if (isprintable (in))
{
- if (win->_curx != (x + max - 1))
+ if (getcurx(win) != (x + max - 1))
/* not at right hand side */
{
*(str + i) = in;
i++;
- oldx = win->_curx;
+ oldx = getcurx(win);
wmove (win, y, x);
for (n = left; n <= right; n++)
{
--
2.43.0