*BSD News Article 8560


Return to BSD News archive

Path: sserve!manuel.anu.edu.au!munnari.oz.au!network.ucsd.edu!usc!cs.utexas.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!caen!uunet!mcsun!fuug!kiae!demos!newsserv
From: "Andrew A. Chernov, Black Mage" <ache@astral.msk.su>
Newsgroups: comp.unix.bsd
Subject: [386bsd] Patch setvbuf() to avoid core dump
Date: Fri, 04 Dec 92 01:22:39 +0300
Distribution: world
Organization: Ha-oh-lahm Yetzirah
Message-ID: <AGlYe7h00K@astral.msk.su>
Sender: news-service@newcom.kiae.su
Reply-To: ache@astral.msk.su
Lines: 70

Hi, I just correct very unpleasant bug, here is example,
that dumps core:

#include <stdio.h>

main()
{
	setvbuf(stdout, NULL, _IOFBF, 10240);
	putchar('a');
}

Manuals says, that NULL argument cause to malloc required buffer
in the first read or write operation, but _really_ it don't
malloc at all!

I look in stdio code and decide to malloc required buffer
immediately in setvbuf function instead of first read/write
operation, because of very complex code and very many places need
to change in this case.
Here is a patch:

*** setvbuf.c.was	Tue May  7 23:44:09 1991
--- setvbuf.c	Fri Dec  4 00:50:20 1992
***************
*** 52,57 ****
--- 52,58 ----
  	register int mode;
  	register size_t size;
  {
+ 	int retcode;
  
  	/*
  	 * Verify arguments.  The `int' limit on `size' is due to this
***************
*** 74,79 ****
--- 75,89 ----
  		free((void *)fp->_bf._base);
  	fp->_flags &= ~(__SLBF|__SNBF|__SMBF);
  
+ 	retcode = 0;
+ 	if (buf == NULL && (mode == _IOLBF || mode == _IOFBF)) {
+ 		if ((buf = malloc(size)) == NULL) {
+ 			mode = _IONBF;
+ 			retcode = EOF;
+ 		}
+ 		else
+ 			fp->_flags |= __SMBF;
+ 	}
  	/*
  	 * Now put back whichever flag is needed, and fix _lbfsize
  	 * if line buffered.  Ensure output flush on exit if the
***************
*** 106,110 ****
  	if (fp->_flags & __SWR)
  		fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : size;
  
! 	return (0);
  }
--- 116,120 ----
  	if (fp->_flags & __SWR)
  		fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : size;
  
! 	return retcode;
  }
-- 
In-This-Life:  Andrew A. Chernov    |  "Hay mas dicha, mas contento
Internet:      ache@astral.msk.su   |  "Que adorar una hermosura
Organization:  The RELCOM Corp.,    |  "Brujuleada entre los lejos
               Moscow, Russia       |  "De lo imposible?!"  (Calderon)