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?


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