Hi, I'm not sure whether it's ideal to couple an internal data size to some constant defined on the system. But I'll change it. To make sure nothing breaks, I will add guard #if (64 < NSIG-1) #error "Not all signals can be encoded in jvmsigs. Adapt its type!" #endif to jsig.c.
Best regards, Goetz. > -----Original Message----- > From: David Holmes [mailto:david.hol...@oracle.com] > Sent: Donnerstag, 12. November 2015 09:29 > To: Lindenmaier, Goetz; hotspot-runtime-...@openjdk.java.net; > serviceability-dev > Subject: Re: RFR(M): 8141529: Fix handling of _JAVA_SR_SIGNUM > > Hi Goetz, > > On 12/11/2015 6:22 PM, Lindenmaier, Goetz wrote: > > Hi David, > > > > thanks for looking at this! > > > >> -----Original Message----- > >> From: David Holmes [mailto:david.hol...@oracle.com] > >> Sent: Donnerstag, 12. November 2015 08:35 > >> To: Lindenmaier, Goetz; hotspot-runtime-...@openjdk.java.net; > >> serviceability-dev > >> Subject: Re: RFR(M): 8141529: Fix handling of _JAVA_SR_SIGNUM > >> > >> Hi Goetz, > >> > >> Adding in serviceability-dev > >> > >> On 9/11/2015 6:22 PM, Lindenmaier, Goetz wrote: > >>> Hi, > >>> > >>> The environment variable _JAVA_SR_SIGNUM can be set to a signal > >> number > >>> do be used by the JVM's suspend/resume mechanism. > >>> > >>> If set, a signal handler is installed and the current signal handler is > >>> saved > to > >> an array. > >>> On linux, this array had size MAXSIGNUM=32, and _JAVA_SR_SIGNUM > was > >> allowed > >>> to range up to _NSIG=65. This could cause memory corruption. > >>> > >>> Further, in jsig.c, an unsinged int is used to set a bit for signals. > >>> This also > >>> is too small, as only 32 signals can be supported. Further, the signals > >>> are > >> mapped > >>> wrong to these bits. '0' is not a valid signal, but '32' was. 1<<32 > >>> happens > to > >> map to > >>> zero, so the signal could be stored, but this probably was not intended > that > >> way. > >>> > >>> This change increases MAXSIGNUM to 65 on linux, and to 64 on aix. It > >> introduces > >>> proper checking of the signal read from the env var, and issues a warning > if > >> it > >>> does not use the signal set. It adapts the data types in jisig.c > >>> properly. > >>> > >>> Please review this change. I please need a sponsor. > >>> http://cr.openjdk.java.net/~goetz/webrevs/8141529-NSIG/webrev.00 > >> > >> This all sounds very good to me. (I must find out why Solaris is not > >> involved here :) ). > > The mechanism is not implemented there. Why, I don't know. > > > >> On Linux you didn't add the bounds check to os::Linux::set_our_sigflags. > > It came with 8140482 http://hg.openjdk.java.net/jdk9/hs- > rt/hotspot/rev/cd86b5699825 > > That change isn't present in your new code: > > void os::Linux::set_our_sigflags(int sig, int flags) { > assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); > sigflags[sig] = flags; > } > > does it need to be re-based? > > >> I'm also wondering about documenting where we are determining the > >> maximum from? Is it simply _NSIG on some/all distributions? And I see > >> _NSIG is supposed to be the biggest signal number + one. Also linux > >> defines NSIG = _NSIG so which should we be using? > > I checked a row of linux distributions and Versions and always found > NSIG=65. > > Also, as we compile NSIG into the code, we can not react on a difference > > between systems. So I guess that's fine. > > So why do we need MAXSIGNUM instead of just using NSIG ? > > > As NSIG = _NSIG, I don't really care which we use. I chose _NSIG because > > it was used before. On the other platforms I only found NSIG in the header > > files. > > I'd switch to NSIG as Dmitry suggested as it is the public value in > signal.h. > > Thanks, > David > > > Best regards, > > Goetz > > > > > >> > >> Thanks, > >> David > >> > >>> Best regards, > >>> Goetz. > >>>