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 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 .