On Thu, Aug 31 2017, Jeremie Courreges-Anglas <j...@wxcvbn.org> wrote: > I've noticed this some time ago and, while it doesn't seem to be > a problem in practice, it's still undefined. C says what happens with > pointers: > - within the bounds of an array > - one past the last element of an array > but nothing about a pointer one element before the first element of an > array. > > Thoughts?
ping > > Index: history.c > =================================================================== > RCS file: /d/cvs/src/bin/ksh/history.c,v > retrieving revision 1.69 > diff -u -p -p -u -r1.69 history.c > --- history.c 30 Aug 2017 17:08:45 -0000 1.69 > +++ history.c 31 Aug 2017 12:01:48 -0000 > @@ -39,6 +39,7 @@ static char **hist_get_oldest(void); > static void histbackup(void); > > static FILE *histfh; > +static char **histbase; /* actual start of the history[] allocation */ > static char **current; /* current position in history[] */ > static char *hname; /* current name of history file */ > static int hstarted; /* set after hist_init() called */ > @@ -557,8 +558,9 @@ sethistsize(int n) > memmove(history, histptr - offset, n * sizeof(char *)); > } > > - history = areallocarray(history, n, sizeof(char *), APERM); > histsize = n; > + histbase = areallocarray(histbase, n + 1, sizeof(char *), > APERM); > + history = histbase + 1; > histptr = history + offset; > } > } > @@ -597,9 +599,15 @@ sethistfile(const char *name) > void > init_histvec(void) > { > - if (history == NULL) { > + if (histbase == NULL) { > histsize = HISTORYSIZE; > - history = areallocarray(NULL, histsize, sizeof(char *), APERM); > + /* > + * allocate one extra element so that histptr always > + * lays within array bounds > + */ > + histbase = areallocarray(NULL, histsize + 1, sizeof(char *), > + APERM); > + history = histbase + 1; > histptr = history - 1; > } > } -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE