http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54085
Bug #: 54085
Summary: free storage leak when fdopen is combined with close
of the file descriptor
Classification: Unclassified
Product: gcc
Version: 3.4.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: [email protected]
ReportedBy: [email protected]
// I ran across a problem that manifest itself as a free storage leak.
//
// We open a file using open so we can set attributes. We then
// convert the file descriptor to a file handle with fdopen in order to
// use the fflush function to ensure output has completed. We then closed the
file
// with the close function. Some memory allocated with the fdopen does not get
// released in this sequence. Putting this in a loop gradually uses up all
available
// memory as reported by the malloc_stats call.
//
// A greatly simplified testFunction that performs the critical tasks
// is provided below. Call this function in an infinite loop. Each time it is
// called it allocates memory which is never freed.
//
// Two scenarios are reasonable:
//
// BEST CASE
// The file descriptor and the file handle represent the same entity
// and closing either releases all storage. After calling either close or
fclose
// calling fputc or write is incorrect. Calling close or fclose after
// either close is incorrect.
//
// SUFFICIENT SOLUTION
// The file descriptor and file handle are independent and closing one
// does not effect the other. Closing the handle derived from the
// descriptor with fclose should not prevent a close of the handle with
// close. It is OK to ignore a write to the descriptor after an fclose.
// It is not OK to crash when an operation (write, close) is done after
// the fclose.
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
void testFunction(void) {
FILE *pFile;
int uartFD;
uartFD = open("/dev/uart1",(O_RDWR | O_NONBLOCK));
if (uartFD < 0) {
return;
};
pFile = fdopen(uartFD,"w+");
if (pFile != NULL) {
fflush(pFile);
// fclose(pFile); using this close fixes the problem BUT
// you must also remove the close of the file descriptor
close(uartFD);
};
return;
}
main () {
while (1) testFunction();
}