[comp.bugs.4bsd] repl

konijn@ace.UUCP (03/24/87)

Index: /usr/src/new/mh/uip/replsbr.c

Description:
	The repl(1) command, part of MH-6.4, dumps core on mc68000
	machines.  The command allocates an array of pointers,
	with each pointer pointing to an allocated buffer.
	The buffers are freed by a loop that stops on the first NULL
	pointer.  This happens to work OK on a VAX, presumably because
	calloc() returns a larger piece of memory than was requested.
	On my machine it doesn't.

Repeat-By:
	Use repl(1) on an mc68000 machine.

Fix:
	A quick hack: calloc() an extra field in the array of pointers.
	This field is initialised to NULL and will end the loop that
	frees all allocated buffers.

*** replsbr.c	Fri Mar 20 15:51:00 1987
--- /tmp/1	Fri Mar 20 19:44:03 1987
***************
*** 71,78 ****
      cp = new_fs (form ? form : replcomps, NULLCP, NULLCP);
      format_len = strlen (cp);
      ncomps = fmt_compile (cp, &fmt) + 1;
!     /* allocate one extra pointer, null to stop freeing loop */
!     nxtbuf = compbuffers = (char **)calloc((unsigned)(ncomps+1),sizeof(char *));
      if (nxtbuf == NULL)
  	adios (NULLCP, "unable to allocate component buffers");
      used_buf = (struct comp **)calloc((unsigned)(ncomps+1),sizeof(struct comp *));
--- 71,77 ----
      cp = new_fs (form ? form : replcomps, NULLCP, NULLCP);
      format_len = strlen (cp);
      ncomps = fmt_compile (cp, &fmt) + 1;
!     nxtbuf = compbuffers = (char **)calloc((unsigned)ncomps,sizeof(char *));
      if (nxtbuf == NULL)
  	adios (NULLCP, "unable to allocate component buffers");
      used_buf = (struct comp **)calloc((unsigned)(ncomps+1),sizeof(struct comp *));

---------
Erik van Konijnenburg,	<konijn@ace.nl>, ...!mcvax!ace!konijn,
ACE Associated Computer Experts bv, Amsterdam, the Netherlands