#! /bin/sh -e

# DP: Don't leak upon failed realloc (taken from the trunk).

dir=
if [ $# -eq 3 -a "$2" = '-d' ]; then
    pdir="-d $3"
    dir="$3/"
elif [ $# -ne 1 ]; then
    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
    exit 1
fi
case "$1" in
    -patch)
        patch $pdir -f --no-backup-if-mismatch -p0 < $0
        ;;
    -unpatch)
        patch $pdir -f --no-backup-if-mismatch -R -p0 < $0
        ;;
    *)
        echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
        exit 1
esac
exit 0

libjava/

2008-03-10  Jim Meyering  <meyering@redhat.com>

	Don't leak upon failed realloc.
	* gnu/classpath/natSystemProperties.cc
	(SystemProperties::insertSystemProperties):

libjava/classpath/

2008-03-10  Jim Meyering  <meyering@redhat.com>

	Don't leak upon failed realloc.
	* native/jni/classpath/jcl.c (JCL_realloc): Upon failed realloc,
	free the original buffer before throwing the exception.

Index: libjava/classpath/native/jni/classpath/jcl.c
===================================================================
--- libjava/classpath/native/jni/classpath/jcl.c	(revision 133093)
+++ libjava/classpath/native/jni/classpath/jcl.c	(revision 133094)
@@ -1,5 +1,5 @@
 /* jcl.c
-   Copyright (C) 1998, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2005, 2006, 2008 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -152,9 +152,11 @@
 JNIEXPORT void *JNICALL
 JCL_realloc (JNIEnv * env, void *ptr, size_t size)
 {
+  void *orig_ptr = ptr;
   ptr = realloc (ptr, size);
   if (ptr == 0)
     {
+      free (orig_ptr);
       JCL_ThrowException (env, "java/lang/OutOfMemoryError",
 			  "malloc() failed.");
       return NULL;
Index: libjava/gnu/classpath/natSystemProperties.cc
===================================================================
--- libjava/gnu/classpath/natSystemProperties.cc	(revision 133093)
+++ libjava/gnu/classpath/natSystemProperties.cc	(revision 133094)
@@ -270,7 +270,10 @@
       if (errno != ERANGE)
 	break;
       buflen = 2 * buflen;
+      char *orig_buf = buffer;
       buffer = (char *) realloc (buffer, buflen);
+      if (buffer == NULL)
+	free (orig_buf);
     }
   if (buffer != NULL)
     free (buffer);
