ifix segfault while reading buffer greater than 256 lines - iomenu - interactive terminal-based selection menu Err bitreich.org 70
hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70
1Log /scm/iomenu/log.gph bitreich.org 70
1Files /scm/iomenu/files.gph bitreich.org 70
1Refs /scm/iomenu/refs.gph bitreich.org 70
1Tags /scm/iomenu/tag bitreich.org 70
1README /scm/iomenu/file/README.gph bitreich.org 70
1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit 636bd34b151fd0f108e68c833d8013ffae94428d /scm/iomenu/commit/636bd34b151fd0f108e68c833d8013ffae94428d.gph bitreich.org 70
1parent db81899f43585604025d14656fd05eba47be9060 /scm/iomenu/commit/db81899f43585604025d14656fd05eba47be9060.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Mon, 11 Dec 2017 23:37:43 +0100 Err bitreich.org 70
i Err bitreich.org 70
ifix segfault while reading buffer greater than 256 lines Err bitreich.org 70
i Err bitreich.org 70
iAnd multiple coding style edits Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M iomenu.c | 77 ++++++++++++++----------------- Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 35 insertions(+), 42 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70
i@@ -26,7 +26,7 @@ static struct termios termios; Err bitreich.org 70
i static int ttyfd; Err bitreich.org 70
i Err bitreich.org 70
i struct winsize ws; Err bitreich.org 70
i-int linec = 0, matchc = 0, current = 0; Err bitreich.org 70
i+int linec = 0, matchc = 0, cur = 0; Err bitreich.org 70
i char **linev = NULL, **matchv = NULL; Err bitreich.org 70
i char input[LINE_MAX], formatted[LINE_MAX * 8]; Err bitreich.org 70
i Err bitreich.org 70
i@@ -102,8 +102,8 @@ read_stdin(void) Err bitreich.org 70
i die("malloc"); Err bitreich.org 70
i while ((len = read(STDIN_FILENO, buf + off, size - off)) > 0) { Err bitreich.org 70
i off += len; Err bitreich.org 70
i- if (off >= size >> 1) { Err bitreich.org 70
i- size <<= 1; Err bitreich.org 70
i+ if (off == size) { Err bitreich.org 70
i+ size *= 2; Err bitreich.org 70
i if ((buf = realloc(buf, size + 1)) == NULL) Err bitreich.org 70
i die("realloc"); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -120,9 +120,9 @@ move(signed int sign) Err bitreich.org 70
i Err bitreich.org 70
i int i; Err bitreich.org 70
i Err bitreich.org 70
i- for (i = current + sign; 0 <= i && i < matchc; i += sign) { Err bitreich.org 70
i+ for (i = cur + sign; 0 <= i && i < matchc; i += sign) { Err bitreich.org 70
i if (!flag_hs || matchv[i][0] != '#') { Err bitreich.org 70
i- current = i; Err bitreich.org 70
i+ cur = i; Err bitreich.org 70
i break; Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i@@ -136,13 +136,13 @@ static void Err bitreich.org 70
i filter(void) Err bitreich.org 70
i { Err bitreich.org 70
i extern char **linev, **matchv; Err bitreich.org 70
i- extern int linec, matchc, current; Err bitreich.org 70
i+ extern int linec, matchc, cur; Err bitreich.org 70
i Err bitreich.org 70
i int tokc, n; Err bitreich.org 70
i char **tokv, *s, buf[sizeof (input)]; Err bitreich.org 70
i Err bitreich.org 70
i tokv = NULL; Err bitreich.org 70
i- current = 0; Err bitreich.org 70
i+ cur = 0; Err bitreich.org 70
i strcpy(buf, input); Err bitreich.org 70
i tokc = 0; Err bitreich.org 70
i n = 0; Err bitreich.org 70
i@@ -162,7 +162,7 @@ filter(void) Err bitreich.org 70
i if (match_line(linev[n], tokv, tokc)) Err bitreich.org 70
i matchv[matchc++] = linev[n]; Err bitreich.org 70
i free(tokv); Err bitreich.org 70
i- if (flag_hs && matchv[current][0] == '#') Err bitreich.org 70
i+ if (flag_hs && matchv[cur][0] == '#') Err bitreich.org 70
i move(+1); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -172,14 +172,13 @@ move_page(signed int sign) Err bitreich.org 70
i extern struct winsize ws; Err bitreich.org 70
i extern int matchc; Err bitreich.org 70
i Err bitreich.org 70
i- int i; Err bitreich.org 70
i- int rows; Err bitreich.org 70
i+ int i, rows; Err bitreich.org 70
i Err bitreich.org 70
i rows = ws.ws_row - 1; Err bitreich.org 70
i- i = current - current % rows + rows * sign; Err bitreich.org 70
i+ i = cur - cur % rows + rows * sign; Err bitreich.org 70
i if (!(0 <= i && i < matchc)) Err bitreich.org 70
i return; Err bitreich.org 70
i- current = i - 1; Err bitreich.org 70
i+ cur = i - 1; Err bitreich.org 70
i move(+1); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -188,8 +187,7 @@ remove_word() Err bitreich.org 70
i { Err bitreich.org 70
i extern char input[LINE_MAX]; Err bitreich.org 70
i Err bitreich.org 70
i- int len; Err bitreich.org 70
i- int i; Err bitreich.org 70
i+ int len, i; Err bitreich.org 70
i Err bitreich.org 70
i len = strlen(input) - 1; Err bitreich.org 70
i for (i = len; i >= 0 && isspace(input[i]); i--) Err bitreich.org 70
i@@ -205,7 +203,7 @@ add_char(char c) Err bitreich.org 70
i { Err bitreich.org 70
i extern char input[LINE_MAX]; Err bitreich.org 70
i Err bitreich.org 70
i- int len; Err bitreich.org 70
i+ int len; Err bitreich.org 70
i Err bitreich.org 70
i len = strlen(input); Err bitreich.org 70
i if (isprint(c)) { Err bitreich.org 70
i@@ -218,14 +216,13 @@ add_char(char c) Err bitreich.org 70
i static void Err bitreich.org 70
i print_selection(void) Err bitreich.org 70
i { Err bitreich.org 70
i- extern char **matchv; Err bitreich.org 70
i- extern char input[LINE_MAX]; Err bitreich.org 70
i+ extern char **matchv, input[LINE_MAX]; Err bitreich.org 70
i extern int matchc; Err bitreich.org 70
i Err bitreich.org 70
i- char **match; Err bitreich.org 70
i+ char **match; Err bitreich.org 70
i Err bitreich.org 70
i if (flag_hs) { Err bitreich.org 70
i- match = matchv + current; Err bitreich.org 70
i+ match = matchv + cur; Err bitreich.org 70
i while (--match >= matchv) { Err bitreich.org 70
i if ((*match)[0] == '#') { Err bitreich.org 70
i fputs(*match + 1, stdout); Err bitreich.org 70
i@@ -234,10 +231,10 @@ print_selection(void) Err bitreich.org 70
i } Err bitreich.org 70
i putchar('\t'); Err bitreich.org 70
i } Err bitreich.org 70
i- if (matchc == 0 || (flag_hs && matchv[current][0] == '#')) Err bitreich.org 70
i+ if (matchc == 0 || (flag_hs && matchv[cur][0] == '#')) Err bitreich.org 70
i puts(input); Err bitreich.org 70
i else Err bitreich.org 70
i- puts(matchv[current]); Err bitreich.org 70
i+ puts(matchv[cur]); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i /* Err bitreich.org 70
i@@ -247,8 +244,7 @@ print_selection(void) Err bitreich.org 70
i int Err bitreich.org 70
i key(int k) Err bitreich.org 70
i { Err bitreich.org 70
i- extern char **matchv; Err bitreich.org 70
i- extern char input[LINE_MAX]; Err bitreich.org 70
i+ extern char **matchv, input[LINE_MAX]; Err bitreich.org 70
i extern int linec; Err bitreich.org 70
i Err bitreich.org 70
i top: Err bitreich.org 70
i@@ -291,7 +287,7 @@ top: Err bitreich.org 70
i break; Err bitreich.org 70
i case CTL('I'): /* tab */ Err bitreich.org 70
i if (linec > 0) Err bitreich.org 70
i- strcpy(input, matchv[current]); Err bitreich.org 70
i+ strcpy(input, matchv[cur]); Err bitreich.org 70
i filter(); Err bitreich.org 70
i break; Err bitreich.org 70
i case CTL('J'): /* enter */ Err bitreich.org 70
i@@ -314,12 +310,14 @@ top: Err bitreich.org 70
i static char * Err bitreich.org 70
i format(char *str, int cols) Err bitreich.org 70
i { Err bitreich.org 70
i- extern struct winsize ws; Err bitreich.org 70
i+ extern struct winsize ws; Err bitreich.org 70
i Err bitreich.org 70
i- int col = 0; Err bitreich.org 70
i- long rune = 0; Err bitreich.org 70
i- char *fmt = formatted; Err bitreich.org 70
i+ int col; Err bitreich.org 70
i+ long rune; Err bitreich.org 70
i+ char *fmt; Err bitreich.org 70
i Err bitreich.org 70
i+ col = rune = 0; Err bitreich.org 70
i+ fmt = formatted; Err bitreich.org 70
i while (*str && col < cols) { Err bitreich.org 70
i if (*str == '\t') { Err bitreich.org 70
i int t = 8 - col % 8; Err bitreich.org 70
i@@ -345,14 +343,14 @@ format(char *str, int cols) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-print_line(char *line, int cur) Err bitreich.org 70
i+print_line(char *line, int highlight) Err bitreich.org 70
i { Err bitreich.org 70
i extern struct winsize ws; Err bitreich.org 70
i Err bitreich.org 70
i if (flag_hs && line[0] == '#') { Err bitreich.org 70
i format(line + 1, ws.ws_col - 1); Err bitreich.org 70
i fprintf(stderr, "\n\x1b[1m %s\x1b[m", formatted); Err bitreich.org 70
i- } else if (cur) { Err bitreich.org 70
i+ } else if (highlight) { Err bitreich.org 70
i format(line, ws.ws_col - 1); Err bitreich.org 70
i fprintf(stderr, "\n\x1b[47;30m\x1b[K %s\x1b[m", formatted); Err bitreich.org 70
i } else { Err bitreich.org 70
i@@ -364,26 +362,21 @@ print_line(char *line, int cur) Err bitreich.org 70
i static void Err bitreich.org 70
i print_screen(void) Err bitreich.org 70
i { Err bitreich.org 70
i- extern struct winsize ws; Err bitreich.org 70
i- extern char **matchv; Err bitreich.org 70
i- extern char *flag_p; Err bitreich.org 70
i- extern char input[LINE_MAX]; Err bitreich.org 70
i- extern int matchc; Err bitreich.org 70
i+ extern struct winsize ws; Err bitreich.org 70
i+ extern char **matchv, *flag_p, input[LINE_MAX]; Err bitreich.org 70
i+ extern int matchc; Err bitreich.org 70
i Err bitreich.org 70
i char **m; Err bitreich.org 70
i- int p; Err bitreich.org 70
i- int i; Err bitreich.org 70
i- int cols; Err bitreich.org 70
i- int rows; Err bitreich.org 70
i+ int p, i, cols, rows; Err bitreich.org 70
i Err bitreich.org 70
i cols = ws.ws_col - 1; Err bitreich.org 70
i rows = ws.ws_row - 1; Err bitreich.org 70
i p = 0; Err bitreich.org 70
i- i = current - current % rows; Err bitreich.org 70
i+ i = cur - cur % rows; Err bitreich.org 70
i m = matchv + i; Err bitreich.org 70
i fputs("\x1b[2J", stderr); Err bitreich.org 70
i while (p < rows && i < matchc) { Err bitreich.org 70
i- print_line(*m, i == current); Err bitreich.org 70
i+ print_line(*m, i == cur); Err bitreich.org 70
i p++, i++, m++; Err bitreich.org 70
i } Err bitreich.org 70
i fputs("\x1b[H", stderr); Err bitreich.org 70
i@@ -403,7 +396,7 @@ print_screen(void) Err bitreich.org 70
i static void Err bitreich.org 70
i set_terminal(void) Err bitreich.org 70
i { Err bitreich.org 70
i- struct termios new; Err bitreich.org 70
i+ struct termios new; Err bitreich.org 70
i Err bitreich.org 70
i fputs("\x1b[s\x1b[?1049h\x1b[H", stderr); Err bitreich.org 70
i if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) { Err bitreich.org 70
.
Response:
text/plain