[ping] RFR(M): 8186072: dll_build_name returns true even if file is missing.
David Holmes
david.holmes at oracle.com
Tue Aug 29 09:57:53 UTC 2017
Hi Thomas,
On 29/08/2017 7:44 PM, Thomas Stüfe wrote:
> Hi,
>
> I am fine with this change going in in the current form. Lets get this
> patch in.
Now I'm questioning some things ...
> I see some issues, but they can be addressed in follow up items:
>
> 1) os::path_seperator() should really return a char, not a string. Most
> callers seem to reference os::path_seperator()[0].
I've often wondered about that too but that's a separate RFE.
> 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.
> 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