RFR(XS): 8248879: SA core file support on OSX has some bugs trying to locate the jvm libraries
Chris Plummer
chris.plummer at oracle.com
Tue Aug 4 23:27:18 UTC 2020
Hi Alex,
Since this is searching for a file and not a directory, I didn't think
it was necessary, but I can see now that rstrstr may be better just in
case /bin/java appears somewhere in the middle of the path such as
~/bin/java16/bin/java.
thanks,
Chris
On 8/4/20 3:05 PM, Alex Menkov wrote:
> Hi Chris,
>
> 396 posbin = strstr(execname, "/bin/java");
>
> I suppose this should be rstrstr.
>
>
> --alex
>
>
> On 07/28/2020 20:40, Chris Plummer wrote:
>> Hi Serguei and Alex,
>>
>> Sorry about the delay getting back to this. I got sidetracked with
>> other bugs and also realized the code needed more work than just
>> Alex's suggestion for rstrstr().
>>
>> As a bit of background first, get_real_path() is used to locate any
>> library that is referenced from the core file using a relative path.
>> So the core file will, for example, refer to @rpath/libjvm.dylib, and
>> get_real_path() will convert that to a usable path to the file.
>> Usually only JDK libraries and user libraries are specified with
>> @rpath. System libraries all use full path names.
>>
>> get_real_path() had a couple of shortcomings. The way it worked is if
>> the specified execname ended in bin/java or if $JAVA_HOME was set,
>> then it only checked for libraries in subdirs of the first one of
>> those 2 that it found to be valid. It would not look in both
>> directories if both were valid, only in the first to be found valid.
>> Only if neither of those were valid did it look in DYLD_LIBRARY_PATH.
>> So, for example, as long as execname ended in bin/java, that's the
>> only jdk directory that was checked for libraries. If it didn't end
>> in bin/java, and $JAVA_HOME was set, then only it was checked. Then I
>> added a 3rd option looking for the existence of any "bin/" in
>> execname. Only if none of these 3 paths existed did the code defer to
>> DYLD_LIBRARY_PATH. That made is hard to locate non JDK libraries,
>> such as user JNI libraries, or to override the execname search for
>> the JDK by setting $JAVA_HOME.
>>
>> I've fixed this by having it check all 3 of the potential JDK
>> locations not only to see if the paths are valid, but also if the
>> library is in any of the paths, and then check all the paths
>> DYLD_LIBRARY_PATH if it failed to find the library in the JDK paths.
>> So now all the potential locations are checked to see if they contain
>> the library. By doing this I was able to make it find the JDK
>> libraries by properly specifying the execname or JAVA_HOME, and still
>> find a user JNI library in DYLD_LIBRARY_PATH.
>>
>> Since the code was kind of a mess and not well suited to just fix
>> with some minor adjustments, I for the most part rewrote it. Although
>> it still does a lot of the same things, it's much cleaner and easier
>> to read now, and there's less replication of similar code. I also
>> replaced strcat and strcpy calls with strncat and strncpy to prevent
>> overflows. I would suggest for this review to just start by looking
>> at get_real_path() and follow the code, and not compare the diffs,
>> which aren't very readable.
>>
>> http://cr.openjdk.java.net/~cjplummer/8248879/webrev.02/index.html
>>
>> thanks,
>>
>> Chris
>>
>>
>> On 7/14/20 8:54 PM, serguei.spitsyn at oracle.com wrote:
>>> Hi Alex,
>>>
>>> Yes, I understand this.
>>> After some thinking, I doubt my suggestion to check all occurrences
>>> or "/bin/" is good. :)
>>>
>>> Thanks,
>>> Serguei
>>>
>>> On 7/14/20 18:19, Alex Menkov wrote:
>>>> Hi Serguei,
>>>>
>>>> On 07/14/2020 15:55, serguei.spitsyn at oracle.com wrote:
>>>>> Hi Chris and Alex,
>>>>>
>>>>> I agree the last occurrence of "/bin/" is better than the first.
>>>>> But I wonder if it makes sense to check all occurrences.
>>>>
>>>> The problem is strrstr (search for last occurrence) is not a part
>>>> of std C lib.
>>>> So to avoid dependency on new library I suggested this simple
>>>> implementation using standard strstr.
>>>>
>>>> --alex
>>>>
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>
>>>>> On 7/14/20 15:14, Alex Menkov wrote:
>>>>>> Yes, you are right.
>>>>>> This is not a function from strings.h
>>>>>>
>>>>>> Ok, you can leave strstr (and keep in mind that the path can't
>>>>>> contain "/bin/" other than jdk's bin) or implement the
>>>>>> functionality. It should be something simple like
>>>>>>
>>>>>> static const char* rstrstr(const char *str, const char *sub) {
>>>>>> const char *result = NULL;
>>>>>> for (const char *p = strstr(str, sub); p != NULL; p = strstr(p
>>>>>> + 1, sub)) {
>>>>>> result = p;
>>>>>> }
>>>>>> return result;
>>>>>> }
>>>>>>
>>>>>> --alex
>>>>>>
>>>>>> On 07/14/2020 13:43, Chris Plummer wrote:
>>>>>>> Actually it's not so easy. I don't see any other references to
>>>>>>> strrstr in our source. When I reference strstr, it gives a
>>>>>>> warning because it's not declared. The only man page I can find
>>>>>>> says to include sstring2.h, but this file does not exist. It
>>>>>>> also says to link with -lsstrings2.
>>>>>>>
>>>>>>> Chris
>>>>>>>
>>>>>>> On 7/14/20 1:37 PM, Chris Plummer wrote:
>>>>>>>> Ok. I'll change both references to use strrstr.
>>>>>>>>
>>>>>>>> thanks,
>>>>>>>>
>>>>>>>> Chris
>>>>>>>>
>>>>>>>> On 7/14/20 1:11 PM, Alex Menkov wrote:
>>>>>>>>> Hi Chris,
>>>>>>>>>
>>>>>>>>> I think it would be better to use strrstr to correctly handle
>>>>>>>>> paths like
>>>>>>>>> /something/bin/jdk/bin/jhsdb
>>>>>>>>>
>>>>>>>>> And I'd updated
>>>>>>>>> 358 char* posbin = strstr(execname, "/bin/java");
>>>>>>>>> to use strrstr as well
>>>>>>>>>
>>>>>>>>> --alex
>>>>>>>>>
>>>>>>>>> On 07/14/2020 12:01, Chris Plummer wrote:
>>>>>>>>>> Ping!
>>>>>>>>>>
>>>>>>>>>> On 7/6/20 9:31 PM, Chris Plummer wrote:
>>>>>>>>>>> Hello,
>>>>>>>>>>>
>>>>>>>>>>> Please help review the following:
>>>>>>>>>>>
>>>>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8248879/webrev.00/index.html
>>>>>>>>>>>
>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8248879
>>>>>>>>>>>
>>>>>>>>>>> The description of the problem and the fix are both in the CR.
>>>>>>>>>>>
>>>>>>>>>>> thanks,
>>>>>>>>>>>
>>>>>>>>>>> Chris
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>
>>
>>
More information about the serviceability-dev
mailing list