From 551ca039ecd06c92f3909d960c5e4be3a6368f62 Mon Sep 17 00:00:00 2001
From: Per Bothner <per@bothner.com>
Date: Mon, 28 Mar 2005 00:09:38 -0800
Subject: [PATCH] boehm.cc (_Jv_MarkObj): Don't follow null pointer to static
 field...

	* boehm.cc (_Jv_MarkObj): Don't follow null pointer to static field,
	which can happen if class is JV_STATE_LOADED but not JV_STATE_PREPARED.

From-SVN: r97128
---
 libjava/ChangeLog | 5 +++++
 libjava/boehm.cc  | 6 ++++--
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 8659e8351702..24faa64a22da 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-28  Per Bothner  <per@bothner.com>
+
+	* boehm.cc (_Jv_MarkObj): Don't follow null pointer to static field,
+	which can happen if class is JV_STATE_LOADED but not JV_STATE_PREPARED.
+
 2005-03-27  Andreas Tobler  <a.tobler@schweiz.ch>
 
 	* Makefile.am (classes.stamp): Add gnu/gcj/tools/gcj_dbtool/Main.java
diff --git a/libjava/boehm.cc b/libjava/boehm.cc
index 2e64b1ca6cce..af26c2b7b36e 100644
--- a/libjava/boehm.cc
+++ b/libjava/boehm.cc
@@ -189,9 +189,11 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void *env)
 	      // mark also the value pointed to.  We check for isResolved
 	      // since marking can happen before memory is allocated for
 	      // static members.
-	      if (JvFieldIsRef (field) && field->isResolved()) 
+	      // Note that field->u.addr may be null if the class c is
+	      // JV_STATE_LOADED but not JV_STATE_PREPARED (initialized).
+	      if (JvFieldIsRef (field) && p && field->isResolved()) 
 		{
-		  jobject val = *(jobject*) field->u.addr;
+		  jobject val = *(jobject*) p;
 		  p = (GC_PTR) val;
 		  MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c);
 		}
-- 
GitLab