On Thu, Aug 31 2017, Jeremie Courreges-Anglas <[email protected]> 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