Review for 8001185
David Holmes
david.holmes at oracle.com
Sat Oct 27 00:38:39 PDT 2012
Hi Bill,
A few minor comments.
thread.cpp:
3680 // Try to load the agent from the standard dll directory
3681 if (os::dll_build_name(buffer, sizeof(buffer),
Arguments::get_dll_dir(),
3682 name)) {
3683 library = os::dll_load(buffer, ebuf, sizeof ebuf);
3684 }
The indentation of the if-block is wrong. Same here:
3709 if (os::dll_build_name(buffer, sizeof(buffer), ns, name)) {
3710 library = os::dll_load(buffer, ebuf, sizeof ebuf);
3711 }
hotspot uses 2-space indent (mostly). The indentation problem exists in
all the files where you added if-blocks.
---
os.hpp
// Builds a platform-specific full library path given a ld path and
lib name
! static bool dll_build_name(char* buffer, size_t size,
The comment should indicate what the bool return means.
---
os.cpp
1167 strcpy(inpath, path);
I know inpath was created to fit path, so the change to use strcpy
instead of strncpy is safe, but it might get flagged by a static
analysis tool that doesn't understand NEW_C_HEAP_ARRAY. Just to be clear
the bug in the original code is that:
strncpy(inpath, path, strlen(path));
should be
strncpy(inpath, path, strlen(path)+1);
---
os_windows.cpp
1157 // Quietly truncates on buffer overflow. Should be an error.
1158 if (pnamelen + strlen(fname) + 10 > buflen) {
1159 return retval;
The comment needs updating as you no longer truncate the buffer. Same
applies to all the other os variants.
Cheers,
David
On 27/10/2012 2:21 AM, BILL PITTORE wrote:
> This bug deals with parsing sun.boot.library.path (dll_dir) when it has
> multiple paths. I found these problems while fixing JDK-7200297. The
> latter bug showed up on an embedded platform that does not have the
> ability to set LD_LIBRARY_PATH for shared library searches.
> If you add -Dsun.boot.library.path=<dir> to command line you end up with
> dll_dir with multiple paths. When -agentlib option is used, code in
> os_<platform>.cpp splits out the individual paths and attempts to find
> the library in those paths. First problem is in os::split_path() where
> the incoming path is copied into a malloced buffer. Terminating null is
> not added. Result of this is that last path in list of paths will not
> get searched correctly (in os::dll_build_name()) since the snprintf will
> copy random amount of garbage after pathname. I supposes it's possible
> that reading way past end of malloc'd path could result in page fault if
> malloc'd memory at end of mapped memory block.
> Another problem is that code in dll_build_name() leaves last full path
> attempted in the buffer that is returned to caller. Caller will then try
> to load that file even if dll_build_name() did not find the file. So one
> extra (possibly failing) load attempt.
> Next problem is that dll_build_name could return NULL string (*buffer ==
> '\0') if buffer too small or previous bug fixed. Caller should check for
> that otherwise (on linux/solaris) calling dlopen() with null string
> returns handle of executable; not what you're expecting. Changed the API
> for dll_build_name to return a bool so it is easy for caller to test
> whether or not returned buffer is valid.
>
> Webrev is at: http://cr.openjdk.java.net/~bpittore/8001185/webrev.00/
>
> thanks,
> bill
>
More information about the hotspot-runtime-dev
mailing list