[ping] RFR(M): 8186072: dll_build_name returns true even if file is missing.

Lindenmaier, Goetz goetz.lindenmaier at sap.com
Tue Aug 29 10:11:51 UTC 2017


Hi,

Thomas, thanks for looking at the new webrev ad hoc.

> > 2) If the user provided buffer is too small, we will fail, which looks
> > like the dll could not have been located. I am not sure we have to be
> > shy with allocating memory - internally, we malloc a buffer for
> > assembling the filename, and then os::splitpath() will malloc a whole
> > bunch of arrays too. So I think we could just return the dll path
> > location in a malloced buffer and require the caller to free.
> 
> That seems a much bigger change. My question before pushing this is:
> have we in any way reduced the size of path that we may accept on some
> platforms? If we have that would be bad.
No. I nowhere change the size of the buffer passed into this method,
and that's the limit. 
On posix, paths no more contain // where concatenated, so the 
paths supported can contain one more char in this case. This is an 
improvement.
The buffer passed in usually has size MAX_PATH, so the checks for
overflow should never cause a problem. They are mostly there
for safety.  Allocation of the memory rather would reduce memory 
consumption, but I think it's not that relevant.  Overall, I think it's 
a mismatch that some functions allocate the memory, others 
require a buffer ... but that's really out of scope.

Best regards,
  Goetz.




> 
> > 3) I do not understand ':' as a file separator on windows. So, a path is
> > allowed to contain e.g. "C:;" ? Which would mean "a path relative to the
> > current directory currently active on drive C". If I am not mistaken. Do
> > we want to support this, what is the use case?
> 
> IIUC the existing windows code supports this. So yes c:foo.dll is a
> reference to foo.dll in whatever the current directory on drive c: is.
> As for a usecase ... perhaps a way to workaround long paths or
> historical path format restrictions (ie no spaces) ? But the main thing
> is to not break what we currently support.
> 
> Thanks,
> David
> 
> > Kind Regards, Thomas
> >
> >
> > On Tue, Aug 29, 2017 at 10:41 AM, David Holmes
> <david.holmes at oracle.com
> > <mailto:david.holmes at oracle.com>> wrote:
> >
> >     On 29/08/2017 6:29 PM, Lindenmaier, Goetz wrote:
> >
> >         Hi David,
> >
> >         I fixed the indentation and added you as reviewer.
> >         I replaced the webrev in-place:
> >         http://cr.openjdk.java.net/~goetz/wr17/8186072-
> dllBuildName/webrev.05/
> >         <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> dllBuildName/webrev.05/>
> >         The new code went through all our testing ... except for some
> >         ppc/s390 builds
> >         that failed because of an other change pushed to hs tonight. But
> >         that should
> >         not matter, it all passed with the jdk10/jdk10 testing.
> >
> >         Would you mind sponsoring?
> >
> >
> >     No problem - but can we get Thomas to sign-off on this latest
> >     version please.
> >
> >
> >     Thanks,
> >     David
> >
> >         Best regards,
> >             Goetz.
> >
> >             -----Original Message-----
> >             From: David Holmes [mailto:david.holmes at oracle.com
> >             <mailto:david.holmes at oracle.com>]
> >             Sent: Dienstag, 29. August 2017 09:53
> >             To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com
> >             <mailto:goetz.lindenmaier at sap.com>>
> >             Cc: hotspot-runtime-dev at openjdk.java.net
> >             <mailto:hotspot-runtime-dev at openjdk.java.net>
> >             Subject: Re: [ping] RFR(M): 8186072: dll_build_name returns
> >             true even if file
> >             is missing.
> >
> >             Hi Goetz,
> >
> >             On 29/08/2017 4:18 PM, Lindenmaier, Goetz wrote:
> >
> >                 Hi,
> >
> >                 this is a webrev with merged windows and posix
> >                 implementations:
> >                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >
> >             dllBuildName/webrev.05/
> >
> >             I like the look of this.
> >
> >             There are a couple of indention nits in os.cpp:
> >
> >                 247 static bool conc_path_file_and_check(char *buffer, char
> >             *printbuffer, size_t printbuflen,
> >                 248                               const char* pname,
> >             char lastchar,
> >             const char* fname) {
> >
> >
> >                 251   const char *filesep = (WINDOWS_ONLY(lastchar ==
> >             ':' ||) lastchar
> >             == os::file_separator()[0]) ?
> >                 252                   "" : os::file_separator();
> >
> >
> >             Thanks,
> >             David
> >
> >                 Best regards,
> >                      Goetz
> >
> >                     -----Original Message-----
> >                     From: Lindenmaier, Goetz
> >                     Sent: Montag, 28. August 2017 12:10
> >                     To: 'David Holmes' <david.holmes at oracle.com
> >                     <mailto:david.holmes at oracle.com>>
> >                     Cc: hotspot-runtime-dev at openjdk.java.net
> >                     <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                     Subject: RE: [ping] RFR(M): 8186072: dll_build_name
> >                     returns true even if
> >
> >             file
> >
> >                     is missing.
> >
> >                     Hi,
> >
> >                     this are the changes needed to make the windows
> >                     dll_locate_lib
> >                     universally applicable. I also merge the three
> >                     similar jio_snprintf
> >                     calls into one method.
> >                     I do some gymnastics to avoid another buffer of
> >                     MAX_PATH_LEN
> >                     at the first call to conc_path_file_and_check.
> >                     I'll test this tonight.
> >
> >                     Best regards,
> >                          Goetz.
> >
> >                     diff -r e09e4eb985c5 src/os/windows/vm/os_windows.cpp
> >                     --- a/src/os/windows/vm/os_windows.cpp  Thu Aug 17
> >                     17:26:02
> >
> >             2017
> >
> >                     +0200
> >                     +++ b/src/os/windows/vm/os_windows.cpp  Mon Aug 28
> >                     12:02:26
> >
> >             2017
> >
> >                     +0200
> >                     @@ -1205,6 +1205,17 @@
> >                           return GetFileAttributes(filename) !=
> >                     INVALID_FILE_ATTRIBUTES;
> >                         }
> >
> >                     +bool conc_path_file_and_check(char *buffer, char
> >                     *printbuffer, size_t
> >                     printbuflen,
> >                     +                              const char* pname,
> >                     char lastchar, const char* fname) {
> >                     +  char *filesep = (WINDOWS_ONLY(lastchar == ':' ||)
> >                     lastchar ==
> >                     os::file_seperator()[0]) ? "" : os::file_separator();
> >                     +  int ret = jio_snprintf(printbuffer, printbuflen,
> >                     "%s%s%s", path, filesep,
> >                     fullfname);
> >                     +  if (ret != -1) {
> >                     +    struct stat statbuf;
> >                     +    return os::stat(buffer, &statbuf) == 0;
> >                     +  }
> >                     +  return false;
> >                     +}
> >                     +
> >                         bool os::dll_locate_lib(char *buffer, size_t buflen,
> >                                                 const char* pname, const
> >                     char* fname) {
> >                           bool retval = false;
> >                     @@ -1220,11 +1231,8 @@
> >                               if (p != NULL) {
> >                                 const size_t plen = strlen(buffer);
> >                                 const char lastchar = buffer[plen - 1];
> >                     -        char *filesep = (lastchar == ':' ||
> >                     lastchar == '\\') ? "" : "\\";
> >                     -        int ret = jio_snprintf(&buffer[plen],
> >                     buflen - plen, "%s%s", filesep,
> >                     fullfname);
> >                     -        if (ret != -1) {
> >                     -          retval = file_exists(buffer);
> >                     -        }
> >                     +        retval = conc_path_file_and_check(buffer,
> >                     &buffer[plen], buflen -
> >                     plen,
> >                     +                                          "",
> >                     lastchar, fullfname);
> >                               }
> >                             } else if (strchr(pname,
> >                     *os::path_separator()) != NULL) {
> >                               int n;
> >                     @@ -1238,12 +1246,8 @@
> >                                     continue; // skip the empty path values
> >                                   }
> >                                   const char lastchar = path[plen - 1];
> >                     -          char *filesep = (lastchar == ':' ||
> >                     lastchar == '\\') ? "" : "\\";
> >                     -          int ret = jio_snprintf(buffer, buflen,
> >                     "%s%s%s", path, filesep,
> >                     fullfname);
> >                     -          if (ret != -1 && file_exists(buffer)) {
> >                     -            retval = true;
> >                     -            break;
> >                     -          }
> >                     +          retval = conc_path_file_and_check(buffer,
> >                     buffer, buflen, path,
> >                     lastchar, fullfname);
> >                     +          if (retval) break;
> >                                 }
> >                                 // release the storage
> >                                 for (int i = 0; i < n; i++) {
> >                     @@ -1255,11 +1259,7 @@
> >                               }
> >                             } else {
> >                               const char lastchar = pname[pnamelen-1];
> >                     -      char *filesep = (lastchar == ':' || lastchar
> >                     == '\\') ? "" : "\\";
> >                     -      int ret = jio_snprintf(buffer, buflen,
> >                     "%s%s%s", pname, filesep,
> >                     fullfname);
> >                     -      if (ret != -1) {
> >                     -        retval = file_exists(buffer);
> >                     -      }
> >                     +      retval = conc_path_file_and_check(buffer,
> >                     buffer, buflen, path,
> >
> >             lastchar,
> >
> >                     fullfname);
> >                             }
> >                           }
> >
> >
> >                         -----Original Message-----
> >                         From: David Holmes
> >                         [mailto:david.holmes at oracle.com
> >                         <mailto:david.holmes at oracle.com>]
> >                         Sent: Montag, 28. August 2017 07:38
> >                         To: Lindenmaier, Goetz
> >                         <goetz.lindenmaier at sap.com
> >                         <mailto:goetz.lindenmaier at sap.com>>
> >                         Cc: hotspot-runtime-dev at openjdk.java.net
> >                         <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                         Subject: Re: [ping] RFR(M): 8186072:
> >                         dll_build_name returns true even if
> >
> >                     file
> >
> >                         is missing.
> >
> >                         Hi Goetz,
> >
> >                         On 25/08/2017 12:19 AM, Lindenmaier, Goetz wrote:
> >
> >                             Hi,
> >
> >                             I please need a second review and a sponsor:
> >                             http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                             <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >
> >                     dllBuildName/webrev.04
> >
> >
> >                             To update my description of the change to
> >                             the status after Thomas'
> >
> >                     review:
> >
> >
> >                             dll_build_name builds the proper path to a
> >                             library given a list of paths
> >
> >                         separated by
> >
> >                             path_seperator and a library name. It adds
> >                             in the platform specific
> >
> >                     endings
> >
> >                         etc.
> >
> >                             It is documented to return whether the file
> >                             exists, but only does so if a
> >
> >                         path_seperator
> >
> >                             exists in the path.
> >                             Especially if the path is empty, it just
> >                             returns ‘true’ without checking.
> >
> >                             Dll_build_name is usually used before
> >                             calling dll_load.  If dll_load does
> >
> >                     not
> >
> >                         get a full path it searches
> >
> >                             in well known unix/windows locations. This
> >                             is intended in the two cases
> >
> >                         where dll_build_name
> >
> >                             is called with an empty path.
> >
> >                             I renamed dll_build_name to dll_locate_lib
> >                             and changed it's behavior to
> >
> >                         always return
> >
> >                             a full path to the lib, inserting current
> >                             working directory if no path is
> >
> >             given.
> >
> >                             For the use case where "" was actually
> >                             passed to the function, I added
> >
> >             a
> >
> >                         new function
> >
> >                             (reusing the old function name)
> >                             dll_build_name that just adds system
> >
> >                         dependent prefix and suffix
> >
> >                             to the name.
> >                             I merged all unix implementations to the
> >                             posix os branch.
> >
> >
> >                         I started to look at this and have applied the
> >                         patch to run through some
> >                         basic testing. The overall approach seems
> >                         reasonable. But it is hard to
> >                         track all the details - in particular whether
> >                         there were any subtle
> >                         differences across the "posix" systems?
> >
> >                         I'm wondering what, if any, significant
> >                         differences exist between the
> >                         Windows and POSIX versions? I would hope the
> >                         platform differences
> >
> >             could
> >
> >                         easily be hidden behind macros (for path
> >                         separator, library suffix etc).
> >                         Then perhaps this could just go in shared code
> >                         (os.hpp, os.cpp)?
> >
> >                         That aside, in the Windows code shouldn't the
> >                         hardwired .dll strings
> >                         actually be JNI_LIB_SUFFIX?
> >
> >                         Thanks,
> >                         David
> >
> >                             Best regards,
> >                                   Goetz.
> >
> >
> >
> >                                 -----Original Message-----
> >                                 From: Thomas Stüfe
> >                                 [mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>]
> >                                 Sent: Dienstag, 22. August 2017 17:30
> >                                 To: Lindenmaier, Goetz
> >                                 <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>>
> >                                 Cc: hotspot-runtime-dev at openjdk.java.net
> >                                 <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                                 Subject: Re: RFR(M): 8186072:
> >                                 dll_build_name returns true even if file
> >
> >             is
> >
> >                                 missing.
> >
> >                                 Looks good.
> >
> >                                 ..Thomas
> >
> >                                 On Tue, Aug 22, 2017 at 4:33 PM,
> >                                 Lindenmaier, Goetz
> >                                 <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>>
> >
> >
> >                         wrote:
> >
> >
> >
> >                                          I mistyped the path to webrev,
> >                                 this should work:
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 dllBuildName/webrev.04
> >
> >                         <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                         <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >
> >                                 dllBuildName/webrev.04>
> >
> >                                          Sorry,
> >                                            Goetz
> >
> >
> >
> >                                          > -----Original Message-----
> >                                          > From: Lindenmaier, Goetz
> >                                          > Sent: Dienstag, 22. August
> >                                 2017 15:48
> >                                          > To: 'Thomas Stüfe'
> >                                 <thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>
> >                                 <mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>> >
> >                                          > Cc:
> >                                 hotspot-runtime-dev at openjdk.java.net
> >                                 <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                                 <mailto:hotspot- <mailto:hotspot->
> >
> >                         runtime-
> >
> >                                 dev at openjdk.java.net
> >                                 <mailto:dev at openjdk.java.net>>
> >                                          > Subject: RE: RFR(M): 8186072:
> >                                 dll_build_name returns true even if
> >                                 file is
> >                                          > missing.
> >                                          >
> >                                          > Hi,
> >                                          >
> >                                          > could I please get a second
> >                                 review?
> >                                          >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> dllBuildName-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> dllBuildName->
> >                                 hs/webrev.04
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >
> >                         dllBuildName-
> >
> >                                 hs/webrev.04>
> >                                          >
> >                                          > I had to update the webrev
> >                                 because of a problem on windows.
> >                                          > @Thomas I had edited os.hpp,
> >                                 but not saved :(
> >                                          >
> >                                          > Best regards,
> >                                          >   Goetz.
> >                                          >
> >                                          > PS: Didn't double-check the
> >                                 webrev as cr server is slow.
> >                                          >
> >                                          > > -----Original Message-----
> >                                          > > From: Thomas Stüfe
> >                                 [mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>
> >                                 <mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>> ]
> >                                          > > Sent: Donnerstag, 17.
> >                                 August 2017 19:54
> >                                          > > To: Lindenmaier, Goetz
> >                                 <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>> >
> >                                          > > Cc:
> >                                 hotspot-runtime-dev at openjdk.java.net
> >                                 <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                                 <mailto:hotspot- <mailto:hotspot->
> >                                 runtime-dev at openjdk.java.net
> >                                 <mailto:runtime-dev at openjdk.java.net>>
> >                                          > > Subject: Re: RFR(M):
> >                                 8186072: dll_build_name returns true even
> >
> >                         if
> >
> >                                 file is
> >                                          > > missing.
> >                                          > >
> >                                          > > Hi Goetz,
> >                                          > >
> >                                          > > On Thu, Aug 17, 2017 at
> >                                 6:03 PM, Lindenmaier, Goetz
> >                                          > > <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>>
> >
> >                         <mailto:goetz.lindenmaier at sap.com
> >                         <mailto:goetz.lindenmaier at sap.com>
> >
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>> > >
> >                                 wrote:
> >                                          > >
> >                                          > >
> >                                          > >     Hi Thomas,
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     I adapted the comments
> >                                 in os.hpp.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     If I move the call to
> >                                 dll_build_name out of dll_locate_lib
> >                                          > >
> >                                          > >     I have to do a lot of
> >                                 coding in all the places where it is called.
> >                                          > >
> >                                          > >     That seems not useful
> >                                 to me.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Fixed the type to size_t.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     One could merge
> >                                 posix/windows if putting the check for ‘:’
> >                                          > >
> >                                          > >     into a WINDOWS_ONLY() I
> >                                 guess. The check for \ could be
> >                                          > >
> >                                          > >     done in posix as well,
> >                                 if using file_seperator().
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     *  Not your change,
> >                                 but: why does the code in
> >
> >                         os::dll_locate_lib()
> >
> >                                 even
> >                                          > >
> >                                          > >     *  differentiate
> >                                 between a PATH containing no
> >                                 os::path_separator()
> >                                          > >
> >                                          > >     *  and a path
> >                                 containing os::path_separator()?
> >                                          > >
> >                                          > >     I assume this was done
> >                                 to avoid all the allocations and copying
> >
> >                         of
> >
> >                                 the
> >                                          > > path.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Also adapted the
> >                                 comment in jvmtiExport.cpp.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     New webrev:
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > > dllBuildName/webrev.03/
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > > dllBuildName/webrev.03/>
> >                                          > >
> >                                          > >     incremental diff:
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >                                 dllBuildName/webrev.03/diffs-incremental.patch
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >                                 dllBuildName/webrev.03/diffs-incremental.patch>
> >                                          > >
> >                                          > >     (fixed indentation on
> >                                 windows)
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Best regards,
> >                                          > >
> >                                          > >       Goetz.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > > Comments in os.hpp seem
> >                                 unchanged ?
> >                                          > >
> >                                          > > But looks fine otherwise. I
> >                                 do not need another webrev.
> >                                          > >
> >                                          > > Thanks, Thomas
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     From: Thomas Stüfe
> >                                 [mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>
> >                                 <mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>>
> >                                          > >
> >                                 <mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>
> >                                 <mailto:thomas.stuefe at gmail.com
> >                                 <mailto:thomas.stuefe at gmail.com>> > ]
> >                                          > >     Sent: Thursday, August
> >                                 17, 2017 3:48 PM
> >                                          > >     To: Lindenmaier, Goetz
> >                                 <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>>
> >                                          > >
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>> > >
> >                                          > >     Cc:
> >                                 hotspot-runtime-dev at openjdk.java.net
> >                                 <mailto:hotspot-runtime-dev at openjdk.java.net>
> >                                 <mailto:hotspot- <mailto:hotspot->
> >                                 runtime-dev at openjdk.java.net
> >                                 <mailto:runtime-dev at openjdk.java.net>>
> >                                 <mailto:hotspot-runtime-
> >                                 <mailto:hotspot-runtime->
> >
> >                         <mailto:hotspot- <mailto:hotspot->
> >
> >                                 runtime->
> >                                          > > dev at openjdk.java.net
> >                                 <mailto:dev at openjdk.java.net>
> >                                 <mailto:dev at openjdk.java.net
> >                                 <mailto:dev at openjdk.java.net>> >
> >                                          > >     Subject: Re: RFR(M):
> >                                 8186072: dll_build_name returns true
> >
> >                         even
> >
> >                                 if file
> >                                          > > is missing.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Hi Goetz,
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     On Thu, Aug 17, 2017 at
> >                                 1:35 PM, Lindenmaier, Goetz
> >                                          > > <goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>>
> >
> >                         <mailto:goetz.lindenmaier at sap.com
> >                         <mailto:goetz.lindenmaier at sap.com>
> >
> >                                 <mailto:goetz.lindenmaier at sap.com
> >                                 <mailto:goetz.lindenmaier at sap.com>> > >
> >                                 wrote:
> >                                          > >
> >                                          > >             Hi Thomas,
> >                                          > >
> >                                          > >             I reworked the
> >                                 whole thing.
> >                                          > >
> >                                          > >             First, there is
> >                                 dll_build_name. It just does <name> ->
> >                                          > > lib<name>.so.
> >                                          > >
> >                                          > >             Second, I
> >                                 renamed the legacy dll_build_name to
> >                                 dll_locate_lib.
> >                                          > >
> >                                          > >             I merged all
> >                                 the unix variants to one in os_posix.
> >                                          > >
> >                                          > >             I removed the
> >                                 buffer overflow check at the top.
> >                                          > >             It's too
> >                                 restrictive because the path argument
> >                                          > >             can contain
> >                                 several paths.  I added the overflow
> >                                          > >             checks into the
> >                                 single cases.
> >                                          > >
> >                                          > >             Also, I first
> >                                 assemble the pure name using the new, simple
> >                                          > >             dll_build_name.
> >                                 This is for reuse and readability.
> >                                          > >
> >                                          > >             In case of an
> >                                 empty directory, I use get_current_directory
> >                                          > >             to complete the
> >                                 path as indicated by the original
> >                                          > > documentation
> >                                          > >             where it was
> >                                 called with "".
> >                                          > >             Dll_locate_lib
> >                                 now always returns a name with a full
> >                                 path if
> >                                          > >             the file exists.
> >                                          > >
> >                                          > >             Also, on
> >                                 windows, I think I fixed a bug by
> >                                 reversing the
> >
> >                         order
> >
> >                                          > >             of checks. A
> >                                 path list ending in ':' or '\' would not
> >                                 have
> >                                          > >             been recognized.
> >                                          > >
> >                                          > >             On Bsd, I
> >                                 removed JNI_LIB_* because that already is
> >
> >                         defined
> >
> >                                          > >             in jvm_bsh.h
> >                                          > >
> >                                          > >             New webrev:
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > > dllBuildName/webrev.02/
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > > dllBuildName/webrev.02/>
> >                                          > >
> >                                          > >             Best regards,
> >                                          > >               Goetz.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     I like this better than
> >                                 before. Remarks:
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> dllBuildName/webrev.02/src/share/vm/runtime/os.hpp.udiff.html
> >
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> dllBuildName/webrev.02/src/share/vm/runtime/os.hpp.udiff.html>
> >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     +  // Builds the
> >                                 platform-specific name of a library.
> >                                          > >
> >                                          > >     +  // Returns false on
> >                                 __buffer overflow__.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Hopefully not! :D
> >                                          > >
> >                                          > >     How about: "Returns
> >                                 false no truncation" instead.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     +  // Builds a
> >                                 platform-specific full library path
> >                                 given an ld path
> >                                 and lib
> >                                          > > name.
> >                                          > >
> >                                          > >     +  // Returns true if
> >                                 the buffer contains a full path to an
> >                                 existing
> >                                 file,
> >                                          > > false
> >                                          > >
> >                                          > >     +  // otherwise. If
> >                                 pathname is empty, checks the current
> >                                 directory.
> >                                          > >
> >                                          > >     +  static bool
> >                                   dll_locate_lib(char* buffer, size_t size,
> >                                          > >
> >                                          > >
> >                                                   const char* pathname,
> >                                 const char*
> >                                 fname);
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Might be worth
> >                                 mentioning that "fname" is the unadorned
> >
> >                         library
> >
> >                                          > > name, e.g. "verify" for
> >                                 libverify.so or verify.dll.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Would the following
> >                                 alternative be valid:
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     one could make
> >                                 dll_locate_lib take the real file name,
> >                                 and let
> >                                 caller
> >                                          > > use dll_build_name() to
> >                                 build the libary name first before handing
> >
> >                         it
> >
> >                                 to
> >                                          > > dll_locate_lib(). In that
> >                                 case, dll_locate_lib() could be renamed to
> >
> >                         a
> >
> >                                 generic
> >                                          > > "find_file_in_path" because
> >                                 it would work for any kind of file.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     As an added bonus,
> >                                 there would be no need to create a
> >                                 temporary
> >                                          > > array in
> >                                 dll_build_name/dll_locate_lib, and no
> >                                 need to call free()
> >
> >                         so
> >
> >                                 no
> >                                          > > cleanup-related control
> >                                 flow changes in these functions.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     =====
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> >
> dllBuildName/webrev.02/src/os/windows/vm/os_windows.cpp.udiff.html
> >
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> >
> >
> dllBuildName/webrev.02/src/os/windows/vm/os_windows.cpp.udiff.html>
> >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     +  int fullfnamelen =
> >                                 strlen(JNI_LIB_PREFIX) + strlen(fname) +
> >                                          > > strlen(JNI_LIB_SUFFIX);
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     int -> size_t (does
> >                                 that even compile without warning?)
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     +    // Check current
> >                                 working directory.
> >                                          > >
> >                                          > >     +    const char* p =
> >                                 get_current_directory(buffer, buflen);
> >                                          > >
> >                                          > >     +    if (p != NULL &&
> >                                          > >
> >                                          > >     +        strlen(buffer)
> >                                 + 1 + fullfnamelen + 1 <= buflen) {
> >                                          > >
> >                                          > >     +      strcat(buffer,
> >                                 "\\");
> >                                          > >
> >                                          > >     +      strcat(buffer,
> >                                 fullfname);
> >                                          > >
> >                                          > >     +      retval =
> >                                 file_exists(buffer);
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Small nit: I'd use
> >                                 jio_snprintf instead of strcat. Functionally
> >                                 identical but
> >                                          > > will make scanners (e.g.
> >                                 coverity) happy. One could then avoid
> >
> >                         the
> >
> >                                 length
> >                                          > > calculation and rely on
> >                                 jio_snprintf truncation:
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     const char* p =
> >                                 get_current_directory(buffer, buflen);
> >                                          > >
> >                                          > >     if (p != NULL) {
> >                                          > >
> >                                          > >       const size_t end =
> >                                 strlen(p);
> >                                          > >
> >                                          > >       if (jio_snprintf(end,
> >                                 buflen - end, "\\%s", fullname) != -1) {
> >                                          > >
> >                                          > >         retval =
> >                                 file_exists(buffer);
> >                                          > >
> >                                          > >       }
> >                                          > >
> >                                          > >     }
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     --
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Not your change, but:
> >                                 why does the code in os::dll_locate_lib()
> >                                 even
> >                                          > > differentiate between a
> >                                 PATH containing no os::path_separator()
> >                                 and a path
> >                                          > > containing
> >                                 os::path_separator()?
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Would the former not be
> >                                 just a PATH with only one directory
> >
> >                         and
> >
> >                                 hence
> >                                          > > need no special treatment?
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     =====
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> dllBuildName/webrev.02/src/os/posix/vm/os_posix.cpp.udiff.ht
> >                         <http://os_posix.cpp.udiff.ht>ml
> >
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> dllBuildName/webrev.02/src/os/posix/vm/os_posix.cpp.udiff.ht
> >                         <http://os_posix.cpp.udiff.ht>ml>
> >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Could
> >                                 os::dll_locate_lib be consolidated
> >                                 between windows and
> >                                 unix?
> >                                          > > Seems to be the
> >                                 implementation is almost identical.
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     ====
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> dllBuildName/webrev.02/src/share/vm/prims/jvmtiExport.cpp.udiff.html
> >
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >
> >
> >
> dllBuildName/webrev.02/src/share/vm/prims/jvmtiExport.cpp.udiff.html>
> >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     +        // not found -
> >                                 try library path
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Proposal: "not found -
> >                                 try OS default library path"
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >             Find some
> >                                 comments inline:
> >                                          > >
> >                                          > >
> >                                          > >             >
> >                                   Especially if the path is empty, it
> >                                 just returns 'true'.
> >                                          > >             >
> >                                   Dll_build_name is usually used before
> >                                 calling dll_load.
> >                                 If
> >                                          > > dll_load does not get a
> >                                 full path it searches
> >                                          > >             >       in well
> >                                 known unix/windows locations. This is
> >                                 intended
> >                                 in
> >                                          > > the two cases where
> >                                 dll_build_name
> >                                          > >             >       is
> >                                 called with an empty path.
> >                                          > >             >
> >                                          > >             > So, for both
> >                                 cases (thread.cpp, jvmtiExport.cpp),
> >                                          > >             >
> >                                          > >             > before, we
> >                                 would call os::dll_build_name() with an
> >                                 empty
> >                                          > > string for the path
> >                                          > >             > which, for
> >                                 relative paths, would result in feeding
> >                                 that path
> >                                          > > unexpanded to
> >                                          > >             > dlopen(),
> >                                 which would use whatever the OS does in
> >                                 those
> >                                          > > cases (LIBPATH,
> >                                          > >             >
> >                                 LD_LIBRARY_PATH, PATH on windows). Note
> >                                 that this
> >
> >                         does
> >
> >                                          > > not necessarily
> >                                          > >             > include
> >                                 searching the current directory.
> >                                          > >             Right. With
> >                                 changed dll_biuld_name it's again exactly as
> >                                          > > before.
> >                                          > >
> >                                          > >             > With your
> >                                 change, we now use java.library.path,
> >                                 which is
> >                                 not
> >                                          > > necessarily the
> >                                          > >             > same?
> >                                          > >             You are right,
> >                                 I oversaw that java.library.path can be
> >                                          > > overwritten.  Initially,
> >                                          > >             it's set to the
> >                                 right thing.
> >                                          > >
> >                                          > >             > (BTW, I think
> >                                 the old comments in thread.cpp and
> >                                          > > jniExport.cpp were wrong:"//
> >                                          > >             > Try the local
> >                                 directory" - if "local" means "current",
> >                                 this is
> >                                 not
> >                                          > > what did
> >                                          > >             > happen).
> >                                          > >             Right, I tried
> >                                 to adapt them, did I miss one?
> >                                          > >
> >                                          > >             >       I added
> >                                 a second variant of dll_build_name without
> >
> >                         the
> >
> >                                          > > path argument that adds the
> >                                 path
> >                                          > >             >       from
> >                                 system property java.lang.path and use
> >                                 that in
> >                                 these
> >                                          > > two cases.
> >                                          > >             >       I
> >                                 changed the original function to
> >                                 actually check file
> >                                          > > availability in all cases,
> >                                          > >             >       and to
> >                                 check . if the path is empty.
> >                                          > >             > I think that
> >                                 may be a bit confusing. We would then have
> >                                 three
> >                                          > > options:
> >                                          > >             >
> >                                          > >             > - call
> >                                 os::dll_build_name with a real
> >                                 "<aa>;<bb>;.." PATH
> >                                 and
> >                                          > > get a file name
> >                                          > >             > resolved from
> >                                 that path
> >                                          > >             > - call
> >                                 os::dll_build_name with "" for the PATH
> >                                 and get OS
> >                                 dll
> >                                          > > resolution
> >                                          > >             No, in that
> >                                 case, as I called file_exists(), it
> >                                 would only work if
> >                                          > > the dll is in the
> >                                          > >             current working
> >                                 directory. But I changed this now, anyways.
> >                                          > >
> >                                          > >             > - call your
> >                                 new overloaded version of
> >
> >                         os::dll_build_name(),
> >
> >                                          > > which uses -
> >                                          > >             >
> >                                 Djava.library.path.
> >                                          > >             >
> >                                          > >             >       Please
> >                                 review this change. I please need a sponsor.
> >                                          > >             >
> >                                 http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                  >
> >                                          > >             >
> >                                 dllBuildName/webrev.01/
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                          > >
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072-
> >                                 <http://cr.openjdk.java.net/~goetz/wr17/8186072->>
> >                                  >
> >                                          > >             >
> >                                 dllBuildName/webrev.01/>
> >                                          > >
> >                                          > >             >
> >                                          > >             >       Best
> >                                 regards,
> >                                          > >             >         Goetz.
> >                                          > >             >
> >                                          > >             >
> >                                          > >             >
> >                                          > >             >
> >                                          > >             > Kind Regards,
> >                                 Thomas
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >     Best Regards, Thomas
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >                                          > >
> >
> >
> >
> >
> >


More information about the hotspot-runtime-dev mailing list