Code Review fix for 8005044 remove crufty '_g' support from HS runtime code

Coleen Phillimore coleen.phillimore at oracle.com
Wed Dec 19 10:49:36 PST 2012


On 12/19/2012 1:42 PM, Ron Durbin wrote:
>
> Coleen
>
> If we are hitting this in an existing test. Would this not raise the 
> priority?
>

No test, just private testing.
Coleen

> *From:*Daniel D. Daugherty
> *Sent:* Wednesday, December 19, 2012 11:38 AM
> *To:* Coleen Phillimore
> *Cc:* hotspot-runtime-dev at openjdk.java.net
> *Subject:* Re: Code Review fix for 8005044 remove crufty '_g' support 
> from HS runtime code
>
> Bug filed:
>
>     JDK-8005262 possible gamma launcher issues
> https://jbs.oracle.com/bugs/browse/JDK-8005262
>
> Dan
>
> On 12/19/12 11:18 AM, Coleen Phillimore wrote:
>
>     On 12/19/2012 12:39 PM, harold seigel wrote:
>
>         >> I say file the bug merely to document the issue and get
>         this code checked in
>         I agree.
>
>
>     Harold, Thank you for looking at this change closely.
>     Dan, please file a bug about the fake path and include this
>     writeup below, because I think I hit this bug with testing CDS
>     with the gamma launcher and it might explain it.
>     Thanks,
>     Coleen
>
>
>
>     Harold
>
>     On 12/19/2012 12:11 PM, Ron Durbin wrote:
>
>     Harold
>
>     I would say first off this is not a bug that has manifested itself
>     yet.
>
>     So it is low priority.
>
>     That being said this exposure is not introduced or made more risky
>     by my changes.
>
>     This is the only issue that we have against this code review and
>     it does not belong to the changes being reviewed=.
>
>     I say file the bug merely to document the issue and get this code
>     checked in.
>
>     Ron
>
>     *From:*Daniel D. Daugherty
>     *Sent:* Wednesday, December 19, 2012 9:30 AM
>     *To:* hotspot-runtime-dev at openjdk.java.net
>     <mailto:hotspot-runtime-dev at openjdk.java.net>; build-dev;
>     serviceability-dev at openjdk.java.net
>     <mailto:serviceability-dev at openjdk.java.net>
>     *Subject:* Re: Code Review fix for 8005044 remove crufty '_g'
>     support from HS runtime code
>
>     Adding the other aliases back in...
>
>     Harold,
>
>     This question:
>
>     > Another nit: Is it worth checking that all of
>     > "/hotspot/libjvm.so" could get copied to buf? (i.e.: that
>     > buflen-len > strlen("/hotspot/libjvm.so")
>
>     is straight forward and the short answer is: yes, that
>     code makes assumptions that "/hotspot/libjvm.so" will
>     fit into 'buf'. It should not do that.
>
>     It is Ron's call as to whether he wants to fix this existing
>     bug as part of this work. It is easy enough to fix the obvious
>     part of the bug, but... as is normal with HotSpot, there
>     is more going on here than meets the eye...
>
>     The slightly longer answer is that it probably doesn't
>     matter because the path being created here is a fake.
>     As long as the "/hotspot/l" part gets copied, then the
>     callers of os::jvm_path() will be able to handle the
>     fakery.
>
>     Of course, there is an even longer answer. Read on if
>     you want gory details (and a history lesson).
>
>     This gamma launcher stuff is giving me an absolute headache.
>     Unfortunately, there is a lot of history involved here...
>
>     Here are the variations:
>
>     src/os/bsd/vm/os_bsd.cpp:
>
>        1715   if (Arguments::created_by_gamma_launcher()) {
>        1716     // Support for the gamma launcher.  Typical value for
>     buf is
>        1717     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm". If
>     "/jre/lib/" appears at
>        1718     // the right place in the string, then assume we are
>     installed in a JDK and
>        1719     // we're done.  Otherwise, check for a JAVA_HOME
>     environment variable and
>        1720     // construct a path to the JVM being overridden.
>
>     <snip>
>
>        1762         // If the path exists within JAVA_HOME, add the
>     JVM library name
>        1763         // to complete the path to JVM being overridden. 
>     Otherwise fallback
>        1764         // to the path to the current library.
>        1765         if (0 == access(buf, F_OK)) {
>        1766 // Use current module name "libjvm"
>        1767 len = strlen(buf);
>        1768 snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
>        1769         } else {
>        1770 // Fall back to path of current library
>        1771 rp = realpath(dli_fname, buf);
>        1772 if (rp == NULL)
>     1773             return;
>        1774         }
>
>     src/os/linux/vm/os_linux.cpp:
>
>        2206   if (Arguments::created_by_gamma_launcher()) {
>        2207     // Support for the gamma launcher.  Typical value for
>     buf is
>        2208     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". If
>     "/jre/lib/" appears at
>        2209     // the right place in the string, then assume we are
>     installed in a JDK and
>        2210     // we're done.  Otherwise, check for a JAVA_HOME
>     environment variable and fix
>        2211     // up the path so it looks like libjvm.so is installed
>     there (append a
>        2212     // fake suffix hotspot/libjvm.so).
>
>     <snip>
>
>        2243         if (0 == access(buf, F_OK)) {
>        2244 // Use current module name "libjvm.so"
>        2245 len = strlen(buf);
>        2246 snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
>        2247         } else {
>        2248 // Go back to path of .so
>        2249 rp = realpath(dli_fname, buf);
>        2250 if (rp == NULL)
>     2251             return;
>        2252         }
>
>     src/os/solaris/vm/os_solaris.cpp:
>
>        2496   if (Arguments::created_by_gamma_launcher()) {
>        2497     // Support for the gamma launcher.  Typical value for
>     buf is
>        2498     // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so". If
>     "/jre/lib/" appears at
>        2499     // the right place in the string, then assume we are
>     installed in a JDK and
>        2500     // we're done.  Otherwise, check for a JAVA_HOME
>     environment variable and fix
>        2501     // up the path so it looks like libjvm.so is installed
>     there (append a
>        2502     // fake suffix hotspot/libjvm.so).
>
>     <snip>
>
>        2539         if (0 == access(buf, F_OK)) {
>        2540 // Use current module name "libjvm.so"
>        2541 len = strlen(buf);
>        2542 snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
>        2543         } else {
>        2544 // Go back to path of .so
>        2545 realpath((char *)dlinfo.dli_fname, buf);
>        2546         }
>
>     src/os/windows/vm/os_windows.cpp:
>
>        1732   buf[0] = '\0';
>        1733   if (Arguments::created_by_gamma_launcher()) {
>        1734      // Support for the gamma launcher. Check for an
>        1735      // JAVA_HOME environment variable
>        1736      // and fix up the path so it looks like
>        1737      // libjvm.so is installed there (append a fake suffix
>        1738      // hotspot/libjvm.so).
>        1739      char* java_home_var = ::getenv("JAVA_HOME");
>        1740      if (java_home_var != NULL && java_home_var[0] != 0) {
>        1741
>        1742 strncpy(buf, java_home_var, buflen);
>        1743
>        1744         // determine if this is a legacy image or modules
>     image
>        1745         // modules image doesn't have "jre" subdirectory
>        1746 size_t len = strlen(buf);
>        1747 char* jrebin_p = buf + len;
>        1748 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\
>     <file:///%5C%5C%5C%5Cjre%5Cbin%5C>");
>        1749         if (0 != _access(buf, 0)) {
>        1750 jio_snprintf(jrebin_p, buflen-len, "\\bin\\
>     <file:///%5C%5C%5C%5Cbin%5C>");
>        1751         }
>        1752 len = strlen(buf);
>        1753 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
>        1754      }
>        1755   }
>
>
>     Linux, Solaris and Windows all recognize that if they
>     get to the point where they are appending a "hotspot/..."
>     path to the jvm_path value, then they are making a fake
>     path. Why are they making a fake path? Well, the gamma
>     launcher lets someone use a libjvm.so/jvm.dll that is
>     not located in the usual place in a JDK. And, you get
>     to use that libjvm.so/jvm.dll WITH THAT JDK. Sounds
>     pretty cool and it is pretty cool... until you realize
>     that there is code in the VM that tries to find other
>     libraries _relative_ to the libjvm.so/jvm.dll that is
>     running. Ouch! So enter the above code blocks that fake
>     a path to the libjvm.so/jvm.dll so that callers to
>     os::jvm_path() don't get confused.
>
>     To make matters more convoluted... yes, I know this is
>     convoluted enough... The os_bsd.cpp doesn't seem to
>     realize that it is creating a fake path here. At one
>     point, the os_bsd.cpp code was a copy of os_linux.cpp
>     code, but it was obviously tweaked. It will take more
>     investigation to figure out the right course of action
>     for os_bsd.cpp
>
>     Dan
>
>
>
>     On 12/19/12 7:51 AM, harold seigel wrote:
>
>
>     Hi Ron,
>
>     I'm ok with using snprinft().
>
>     Another nit: Is it worth checking that all of "/hotspot/libjvm.so"
>     could get copied to buf?  (i.e.:  that buflen-len >
>     strlen("/hotspot/libjvm.so")
>
>     Thanks, Harold
>
>     On 12/19/2012 9:17 AM, Ron Durbin wrote:
>
>     Harold,
>
>     Did you have any more points or counter points to make on the use
>     of snprintf and strncpy ?
>
>     Ron
>
>     *From:*Ron Durbin
>     *Sent:* Tuesday, December 18, 2012 4:50 PM
>     *To:* Daniel Daugherty; hotspot-runtime-dev at openjdk.java.net
>     <mailto:hotspot-runtime-dev at openjdk.java.net>; build-dev;
>     serviceability-dev at openjdk.java.net
>     <mailto:serviceability-dev at openjdk.java.net>
>     *Subject:* RE: Code Review fix for 8005044 remove crufty '_g'
>     support from HS runtime code
>
>     Thanks for the quick reviews by all.
>
>     I will agree with Dan on this one, sprint will stay.
>
>     Ron
>
>     *From:*Daniel D. Daugherty
>     *Sent:* Tuesday, December 18, 2012 4:03 PM
>     *To:* hotspot-runtime-dev at openjdk.java.net
>     <mailto:hotspot-runtime-dev at openjdk.java.net>; build-dev;
>     serviceability-dev at openjdk.java.net
>     <mailto:serviceability-dev at openjdk.java.net>
>     *Subject:* Re: Code Review fix for 8005044 remove crufty '_g'
>     support from HS runtime code
>
>     Sorry, I lost my manners somewhere... :-(
>
>     Thanks for the fast review!
>
>     Dan
>
>     On 12/18/12 3:57 PM, Daniel D. Daugherty wrote:
>
>         Adding back in the other aliases...
>
>         Harold,
>
>         The equivalent of:
>
>         snprintf(buf, n, str);
>
>         is:
>
>             strncpy(buf, str, n - 1);
>             buf[n - 1] = '\0';
>
>         because snprintf() will only write out (n - 1) bytes from
>         'str' to 'buf' and then write a NUL in the last slot.
>         strncpy() copies up to 'n' bytes from 'str' to 'buf'.
>         strncpy() will not copy past a NUL character in 'str', but
>         it will also not NUL terminate 'buf' if a NUL is not found
>         in 'str' before the limit 'n' is reached.
>
>         Dan
>
>         On 12/18/12 2:48 PM, harold seigel wrote:
>
>             Hi Ron,
>
>             I think these calls to snprintf() in os_solaris.cpp and
>             the other os_....cpp files could be replaced with calls to
>             strncpy().  It might be a little simpler.
>
>             Otherwise, it looks good.
>
>             Thanks, Harold
>
>             2539 if (0 == access(buf, F_OK)) {
>             2540 // Use current module name "libjvm.so"
>             2541 len = strlen(buf);
>             2542 *snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");*
>             2543 } else {
>             2544 // Go back to path of .so
>             2545 realpath((char *)dlinfo.dli_fname, buf); 2546 }
>
>             On 12/18/2012 3:46 PM, Daniel D. Daugherty wrote:
>
>             Greetings,
>
>             I'm sponsoring this code review request from Ron Durbin.
>             This change
>             is targeted at JDK8/HSX-25 in the RT_Baseline repo.
>
>             Dan
>
>             Sending again with correct subject line, bug URLs and
>             webrev URL.
>
>
>             Intro:
>
>             This set of changes removes the runtime support for
>             generation of debug versions that follow _g semantics.
>
>             Defect:
>             JDK-8005044 remove crufty '_g' support from HS runtime code
>             http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8005044
>             https://jbs.oracle.com/bugs/browse/JDK-8005044
>
>
>             Webrev
>             http://cr.openjdk.java.net/~dcubed/for_rdurbin/8005044-webrev/0
>             <http://cr.openjdk.java.net/%7Edcubed/for_rdurbin/8005044-webrev/0>
>
>
>
>             Details:
>             Files have been modified to remove all reference and
>             support for  debug versions that follow _g semantics.
>
>             Testing:
>
>             Passed JPRT last night:
>
>             Additional Testing In process: (suggested by Dan):
>
>             src/share/vm/runtime/arguments.cpp
>                 - test with shared archive creation and use; see the
>             e-mail
>                   from Coleen
>
>             src/share/tools/ProjectCreator/ProjectCreator.java
>                 - just a usage message; visual inspection of the code
>
>             src/os/windows/vm/os_windows.cpp
>                 - comments only; no testing needed
>
>             src/os/{bsd,linux,solaris}/vm/os_{bsd,linux,solaris}.cpp
>                 - the only code changes come into play when the "gamma"
>                   launcher is used
>                 - and when JAVA_HOME refers to a valid JDK, the function
>                   fakes up a JVM path so that callers using the JVM path
>                   to find other things in the JDK will work.
>                 - I can't find any way that the actual JVM path value
>                   that is returned is exposed
>                 - I don't see a way to test this other than have a debug
>                   printf() or manual code inspection.
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20121219/db7021b1/attachment-0001.html 


More information about the hotspot-runtime-dev mailing list