Fix memory leaks found by valgrind
[infodrom/cgilib] / aux.c
diff --git a/aux.c b/aux.c
index ef9e487..dfb0f96 100644 (file)
--- a/aux.c
+++ b/aux.c
@@ -13,8 +13,8 @@
     GNU General Public License for more details.
     
     You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software 
-    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+    along with this program; if not, write to the Free Software Foundation
+    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include <stdlib.h>
@@ -117,6 +117,7 @@ char *cgiGetLine (FILE *stream)
 {
     static char *line = NULL;
     static size_t size = 0;
+    int len;
     char buf[BUFSIZE];
     char *cp;
 
@@ -129,25 +130,35 @@ char *cgiGetLine (FILE *stream)
 
     while (!feof (stream)) {
       if ((cp = fgets (buf, sizeof (buf), stream)) == NULL)
+      {
+       free(line);
+       line = NULL;
        return NULL;
+      }
 
       if (strlen(line)+strlen(buf)+1 > size) {
        if ((cp = (char *)realloc (line, size + BUFSIZE)) == NULL)
          return line;
+       cp[size] = '\0';
        size += BUFSIZE;
        line = cp;
       }
 
       strcat (line, buf);
-      if (line[strlen(line)-1] == '\n') {
-       line[strlen(line)-1] = '\0';
-       if (line[strlen(line)-1] == '\r')
-         line[strlen(line)-1] = '\0';
+      len = strlen(line);
+      if (len && line[len-1] == '\n') {
+       line[len-1] = '\0';
+       len --;
+       if (len && line[len-1] == '\r')
+         line[len-1] = '\0';
        cgiDebugOutput (4, "Read line '%s'", line);
        return line;
       }
     }
 
+    free(line);
+    line = NULL;
+
     return NULL;
 }