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

Reply via email to