diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 89019b36f8a6321823c1ffb01c43614523613731..ec9ab88b75333c5413a802335d6b240a1d6d96a9 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+	PR libfortran/35990
+	* intrinsics/pack_generic.c:  Really commit.
+
 2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR libfortran/35990
diff --git a/libgfortran/intrinsics/pack_generic.c b/libgfortran/intrinsics/pack_generic.c
index e282c916502e8dd5d066ff9068dd319379118d43..bb4abaeae4b4b895b3543d9ea664e0d75730e89e 100644
--- a/libgfortran/intrinsics/pack_generic.c
+++ b/libgfortran/intrinsics/pack_generic.c
@@ -491,6 +491,7 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
   index_type dim;
   index_type ssize;
   index_type nelem;
+  index_type total;
 
   dim = GFC_DESCRIPTOR_RANK (array);
   ssize = 1;
@@ -498,6 +499,9 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
     {
       count[n] = 0;
       extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound;
+      if (extent[n] < 0)
+	extent[n] = 0;
+
       sstride[n] = array->dim[n].stride * size;
       ssize *= extent[n];
     }
@@ -505,18 +509,26 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
     sstride[0] = size;
 
   sstride0 = sstride[0];
-  sptr = array->data;
+
+  if (ssize != 0)
+    sptr = array->data;
+  else
+    sptr = NULL;
 
   if (ret->data == NULL)
     {
       /* Allocate the memory for the result.  */
-      int total;
 
       if (vector != NULL)
 	{
 	  /* The return array will have as many elements as there are
 	     in vector.  */
 	  total = vector->dim[0].ubound + 1 - vector->dim[0].lbound;
+	  if (total <= 0)
+	    {
+	      total = 0;
+	      vector = NULL;
+	    }
 	}
       else
 	{