From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1568 invoked by alias); 7 Jun 2008 16:51:09 -0000 Received: (qmail 1543 invoked by uid 367); 7 Jun 2008 16:51:09 -0000 Date: Sat, 07 Jun 2008 16:51:00 -0000 Message-ID: <20080607165109.1528.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Don't delete a local ref before it's last use. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 7412e5a7e9e3256885448ede4d72c302ddbc469e X-Git-Newrev: 4baf67699b3de5a88098a8eec820593ae4d153f2 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00354.txt.bz2 The branch, master has been updated via 4baf67699b3de5a88098a8eec820593ae4d153f2 (commit) from 7412e5a7e9e3256885448ede4d72c302ddbc469e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 4baf67699b3de5a88098a8eec820593ae4d153f2 Author: Andrew Cagney Date: Sat Jun 7 12:50:22 2008 -0400 Don't delete a local ref before it's last use. frysk-sys/lib/dwfl/ChangeLog 2008-06-07 Andrew Cagney * jni/ElfSymbol.cxx (ElfSymbol::elf_load_verneed): Don't delete a local ref before you're finished with it. ----------------------------------------------------------------------- Summary of changes: frysk-sys/lib/dwfl/ChangeLog | 5 ++++ frysk-sys/lib/dwfl/jni/ElfSymbol.cxx | 35 ++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 14 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index 101e9c2..762b92a 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -1,3 +1,8 @@ +2008-06-07 Andrew Cagney + + * jni/ElfSymbol.cxx (ElfSymbol::elf_load_verneed): Don't delete a + local ref before you're finished with it. + 2008-06-06 Andrew Cagney * TestDwarfDie.java (testGetModule()): Use LocalMemory diff --git a/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx b/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx index cff02d1..c00ea47 100644 --- a/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx +++ b/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx @@ -94,40 +94,44 @@ lib::dwfl::ElfSymbol::elf_load_verneed(jnixx::env env, int count = ret.GetArrayLength(env); int offset = 0; for (int i = 0; i < count; ++i) { + Need verneed; + jnixx::array aux_elems; ::GElf_Verneed ver; if (::gelf_getverneed(data, offset, &ver) == NULL) return false; - Need verneed = Need::New(env); + verneed = Need::New(env); ret.SetObjectArrayElement(env, i, verneed); int auxcount = ver.vn_cnt; verneed.SetVersion(env, ver.vn_version); verneed.SetFilename(env, parent.getStringAtOffset(env, str_sect_index, ver.vn_file)); - jnixx::array aux_elems - = jnixx::array::NewObjectArray(env, auxcount); + aux_elems = jnixx::array::NewObjectArray(env, auxcount); verneed.SetAux(env, aux_elems); int aux_offset = offset + ver.vn_aux; offset += ver.vn_next; for (int j = 0; j < auxcount; ++j) { + String jname; + Aux vernaux; ::GElf_Vernaux aux; if (::gelf_getvernaux(data, aux_offset, &aux) == NULL) return false; - Aux vernaux = Aux::New(env); + vernaux = Aux::New(env); vernaux.SetHash(env, (jint)aux.vna_hash); vernaux.SetWeak(env, (bool)((aux.vna_flags & VER_FLG_WEAK) == VER_FLG_WEAK)); - String jname = parent.getStringAtOffset(env, str_sect_index, - aux.vna_name); + jname = parent.getStringAtOffset(env, str_sect_index, aux.vna_name); vernaux.SetName(env, jname); - jname.DeleteLocalRef(env); vernaux.SetIndex(env, (jint)aux.vna_other); - vernaux.DeleteLocalRef(env); aux_elems.SetObjectArrayElement(env, j, vernaux); aux_offset += aux.vna_next; + vernaux.DeleteLocalRef(env); + jname.DeleteLocalRef(env); } + aux_elems.DeleteLocalRef(env); + verneed.DeleteLocalRef(env); } return true; } @@ -145,11 +149,13 @@ lib::dwfl::ElfSymbol::elf_load_verdef(jnixx::env env, int count = ret.GetArrayLength(env); int offset = 0; for (int i = 0; i < count; ++i) { + jnixx::array names_elems; + Def verdef; ::GElf_Verdef ver; if (::gelf_getverdef(data, offset, &ver) == NULL) return false; - Def verdef = Def::New(env); + verdef = Def::New(env); ret.SetObjectArrayElement(env, i, verdef); int auxcount = ver.vd_cnt; @@ -157,23 +163,24 @@ lib::dwfl::ElfSymbol::elf_load_verdef(jnixx::env env, verdef.SetBase(env, (bool)((ver.vd_flags & VER_FLG_BASE) == VER_FLG_BASE)); verdef.SetIndex(env, ver.vd_ndx); verdef.SetHash(env, ver.vd_hash); - jnixx::array names_elems - = jnixx::array::NewObjectArray(env, auxcount); + names_elems = jnixx::array::NewObjectArray(env, auxcount); verdef.SetNames(env, names_elems); verdef.DeleteLocalRef(env); int aux_offset = offset + ver.vd_aux; offset += ver.vd_next; for (int j = 0; j < auxcount; ++j) { + String jname; ::GElf_Verdaux aux; if (::gelf_getverdaux(data, aux_offset, &aux) == NULL) return false; - String jname = parent.getStringAtOffset(env, str_sect_index, - aux.vda_name); + jname = parent.getStringAtOffset(env, str_sect_index, aux.vda_name); names_elems.SetObjectArrayElement(env, j, jname); - jname.DeleteLocalRef(env); aux_offset += aux.vda_next; + jname.DeleteLocalRef(env); } + verdef.DeleteLocalRef(env); + names_elems.DeleteLocalRef(env); } return true; } hooks/post-receive -- frysk system monitor/debugger