[net.emacs] two less bugs in GNU-emacs 17.55

tiemann@mcc-pp.UUCP (Michael Tiemann) (09/19/86)

It appears that (struct windows) and (struct Lisp_Process)
are not allocated for properly.

Problem:
file: window.c
function: make_window
Lisp_Object
make_window ()
{
  Lisp_Object val;
  register struct window *p;

  val = Fmake_vector (
          make_number ((sizeof(struct window) - sizeof(struct Lisp_Vector))
                 / sizeof(Lisp_Object)),
    Qnil);
  XSETTYPE (val, Lisp_Window);
  /* ... code deleted ... */
  return val;
}

The problem is that the definition of a Lisp_Vector is
struct Lisp_Vector
  {
    int size;
    struct Lisp_Vector *next;
    Lisp_Object contents[1];
  };

and while the window declaration makes room for the first two fields
(size and next) it does not save room for contents! As a result,
with rcheck enabled, magic numbers for windows (like the minibuf_window)
will be overwritten in their last position.

The fix is to add ask for one more Lisp_Object, then when we subtract
sizeof(struct Lisp_Vector), that 1 offsets contents.

I looked around for other places that this might happen, and it happens
in process.c: function make_process.

Whoever wrote the code had the right idea, but got it backwards:
instead of adding 1 to offset contents, 1 was subtracted from the
request! This left the last TWO fields to clobber magic
numbers.

Also, in xdisp.c, function redisplay_window, if the function is
called with a dummy parent (like when splitting a window for the first time),
its w->start is not a valid argument to marker_position:
marker_position expects a marker, never Qnil. Rather then modify
marker_position, one can move the register initialization
{register int startp = marker_position (w->start);} from the
declaration section into the body of redisplay_window
(after the check {if (NULL (w->buffer)) abort();} (always a
good practice, I think). Then, the recursive call will do the child 
and return, without ever calling marker_position (more efficient!).

When the stucture shapes are modified, the bugs are forced
out of their corners... For people interested in validating
GNU-emacs, try running it as distributed, then change
structure shapes that *should not* matter. You'll be amazed
at what shows up...

To the keeper of GNU: please let me know when(/if) these are
incorporated, thanks

Michael
tiemann@mcc.com