[Mono-bugs] [Bug 668095] New: Segfault when calling a synchronized generic method through an interface
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Fri Jan 28 17:16:41 EST 2011
https://bugzilla.novell.com/show_bug.cgi?id=668095
https://bugzilla.novell.com/show_bug.cgi?id=668095#c0
Summary: Segfault when calling a synchronized generic method
through an interface
Classification: Mono
Product: Mono: Runtime
Version: SVN
Platform: x86-64
OS/Version: Ubuntu
Status: NEW
Severity: Major
Priority: P5 - None
Component: JIT
AssignedTo: lupus at novell.com
ReportedBy: knielsen at ariasolutions.com
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
Description of Problem:
The mono virtual machine segfaults when calling a generic method with the
MethodImplOptions.Synchronized attribute through an interface:
Thread 1 (Thread 0x7fc35183b740 (LWP 4282)):
#0 0x00007fc350d9393d in read () from /lib/libpthread.so.0
#1 0x0000000000491577 in read (signal=<value optimized out>, ctx=<value
optimized out>) at /usr/include/bits/unistd.h:45
#2 mono_handle_native_sigsegv (signal=<value optimized out>, ctx=<value
optimized out>) at mini-exceptions.c:2126
#3 0x00000000004e5c2f in mono_arch_handle_altstack_exception
(sigctx=0x7fc3516dbbc0, fault_addr=<value optimized out>, stack_ovf=0) at
exceptions-amd64.c:944
#4 0x000000000041726b in mono_sigsegv_signal_handler (_dummy=11,
info=0x7fc3516dbcf0, context=0x7fc3516dbbc0) at mini.c:5827
#5 <signal handler called>
#6 0x0000000000494a3d in mono_create_static_rgctx_trampoline
(m="MonoGenericsCrash.DefaultRetriever:GetDefault ()", addr=0x407f1d00) at
mini-trampolines.c:102
#7 0x000000000049514b in common_call_trampoline (regs=<value optimized out>,
code=0x407f1cdb "H\213\370I\273\364\034\177@", m=
"MonoGenericsCrash.DefaultRetriever:GetDefault ()", tramp=<value optimized
out>, vt=0xc435b8, vtable_slot=0xc43550, need_rgctx_tramp=1)
at mini-trampolines.c:483
#8 0x0000000000495903 in mono_vcall_trampoline (regs=0x7fffaf75cb68,
code=0x407f1cdb "H\213\370I\273\364\034\177@", slot=<value optimized out>,
tramp=
0x407f1176
"\350\325\230g\001\b\363\377\377\377\377\377\377\377\350Ç\001\b\364\377\377\377\377\377\377\377è\001\b\365\377\377\377\377\377\377\377è\001\b\366\377\377\377\377\377\377\377è001\b\367\377\377\377\377\377\377\377è001\b\370\377\377\377\377\377\377\377è001\b\371\377\377\377\377\377\377\377\350s\230g\001\b\372\377\377\377\377\377\377\377\350e\230g\001\b\373\377\377\377\377\377\377\377\350W\230g\001\b\374\377\377\377\377\377\377\377\350I\230g\001\b\375\377\377\377\377\377\377\377\350;\230g\001\b\376\377\377\377\377\377\377\377\350-\230g\001\b\377\377\377\377\377\377\377\377\350\037\230g\001\004\033")
at mini-trampolines.c:656
#9 0x0000000041e6abba in ?? ()
#10 0x00007fffaf75cc20 in ?? ()
#11 0x0000000041e69177 in ?? ()
#12 0x0000000000000020 in ?? ()
#13 0x0000000000000000 in ?? ()
=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
Steps to reproduce the problem:
1. Run the following program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.CompilerServices;
namespace MonoGenericsCrash
{
interface IDefaultRetriever
{
T GetDefault<T>();
}
class DefaultRetriever : IDefaultRetriever
{
[MethodImpl(MethodImplOptions.Synchronized)]
public T GetDefault<T>()
{
return default(T);
}
}
class Program
{
static void Main()
{
DoSomething(new DefaultRetriever());
}
static void DoSomething(IDefaultRetriever foo)
{
int result = foo.GetDefault<int>();
if (result != 0)
throw new InvalidOperationException("received " + result + " instead of
expected 0");
}
}
}
Actual Results: Program segfaults
Expected Results: Program should not segfault
How often does this happen? Always.
Additional Information:
After some debugging, I determined that the problem was caused by the
common_call_trampoline function (mini-trampolines.c:470), where it replaces the
inflated MonoMethod pointer with a wrapped synchronized one, but does not
update the need_rgctx_tramp variable, causing other parts of the runtime to
assume the wrapping method is inflated when it really isn't.
I will attach a patch that fixes the problem and adds a
test-case for this bug.
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list