Module Name:    src
Committed By:   pgoyette
Date:           Fri Oct 11 16:30:31 UTC 2013

Modified Files:
        src/sys/lib/libsa: cread.c

Log Message:
Rework previous (1.24) change.  Rather than depending on the
file's flags to decide if decompress cleanup is needed, just
check to see if the open() allocated the 'struct sd *' used for
decompression.

This fixes recent problem where presence of a "load=ffs" command
in my /boot.cfg resulted in a "heap full" error at boot time.

OK martin@


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/lib/libsa/cread.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/lib/libsa/cread.c
diff -u src/sys/lib/libsa/cread.c:1.24 src/sys/lib/libsa/cread.c:1.25
--- src/sys/lib/libsa/cread.c:1.24	Sun Apr 14 22:23:28 2013
+++ src/sys/lib/libsa/cread.c	Fri Oct 11 16:30:31 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cread.c,v 1.24 2013/04/14 22:23:28 martin Exp $	*/
+/*	$NetBSD: cread.c,v 1.25 2013/10/11 16:30:31 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1996
@@ -259,6 +259,7 @@ open(const char *fname, int mode)
 	int fd;
 	struct sd *s = 0;
 
+	ss[fd] = NULL;
 	if (((fd = oopen(fname, mode)) == -1) || (mode != 0))
 		/* compression only for read */
 		return fd;
@@ -284,6 +285,7 @@ open(const char *fname, int mode)
 errout:
 	if (s != 0)
 		dealloc(s, sizeof(struct sd));
+	ss[fd] = NULL;
 	oclose(fd);
 	return -1;
 }
@@ -291,7 +293,6 @@ errout:
 int
 close(int fd)
 {
-	struct open_file *f;
 	struct sd *s;
 
 #if !defined(LIBSA_NO_FD_CHECKING)
@@ -300,17 +301,15 @@ close(int fd)
 		return -1;
 	}
 #endif
-	f = &files[fd];
-
-	if ((f->f_flags & (F_READ|F_WRITE)) == F_READ)
-		return oclose(fd);
 
 	s = ss[fd];
 
-	inflateEnd(&(s->stream));
+	if (s != NULL) {
+		inflateEnd(&(s->stream));
 
-	dealloc(s->inbuf, Z_BUFSIZE);
-	dealloc(s, sizeof(struct sd));
+		dealloc(s->inbuf, Z_BUFSIZE);
+		dealloc(s, sizeof(struct sd));
+	}
 
 	return oclose(fd);
 }

Reply via email to