RFR: 8067951: System.loadLibrary cannot find library when path contains quoted entry

Ivan Gerasimov ivan.gerasimov at oracle.com
Mon Jan 12 12:42:03 UTC 2015


Hi everyone!

May I assume the last webrev is good to go?

- It uses static final in the if clause, so that the additional code is 
eliminated on Unix;
- Quotation marks are used as new delimiter, so it's impossible for them 
to collide with whatever is found in the property value;
- The last loop is as small as was the original, though handles empty 
paths more accurately.

Sincerely yours,
Ivan

On 07.01.2015 0:13, Ivan Gerasimov wrote:
> And here's the update:
> http://cr.openjdk.java.net/~igerasim/8067951/6/webrev/
>
> As you suggested, the psCount is calculated in the first loop along 
> the way.
> Another change is that a quotation mark is used as the new path 
> separator.
>
> I also thought it's better to add a short comment, as now it may look 
> confusing at a first glance.
>
> Sincerely yours,
> Ivan
>
> On 06.01.2015 21:33, Xueming Shen wrote:
>> Hi Ivan,
>>
>> Yes, it looks better and should run faster as it doesn't need to 
>> worry about quote
>> in second loop. I was a little hesitated when suggested to replace 
>> the ps with 0,
>> though I'm pretty much sure a \u0000 should never be a legal 
>> character in a
>> windows' path :-)
>>
>> Anyone can think about any possibility of having an embedded \0 
>> character in path?
>>
>> Nitpick:
>>
>> the "posCount" probably can be calculated in the "quote handling" loop ?
>>
>>     if (ClassloaderHelper.allowQuotedPathElements ....) {
>>          ...
>>          if (ch ==  ps) { ch = '\0'; psCount++; }
>>          buf[bufLen++] = ch;
>>          ...
>>     } else {
>>         for (int i = ldPath.indexOf(ps); i >=0 ...) {
>>         }
>>     }
>>
>> otherwise, it looks fine for me.
>>
>> -Sherman
>>
>> On 01/06/2015 05:49 AM, Ivan Gerasimov wrote:
>>> Hi Sherman!
>>>
>>> I took your suggestion and rewrote the method to moved the logic, 
>>> which removes the quotes to the top.
>>> I think the code became cleaner, so thank you for suggestion!
>>>
>>> Here's the updated webrev:
>>> http://cr.openjdk.java.net/~igerasim/8067951/5/webrev/
>>>
>>> Sincerely yours,
>>> Ivan
>>>
>>>
>>> On 06.01.2015 0:12, Xueming Shen wrote:
>>>> On 01/05/2015 12:41 PM, Ivan Gerasimov wrote:
>>>>> Thanks Sherman!
>>>>>
>>>>> On 05.01.2015 22:10, Xueming Shen wrote:
>>>>>>
>>>>>> Just wonder if we really need that "inQuotes" logic here? A 
>>>>>> straightforward approach might
>>>>>> be "every time you have a quote, skip everything until you hit 
>>>>>> another one, when counting,
>>>>>> or copy everything into the buffer until hit another one, when 
>>>>>> copying" ?
>>>>>>
>>>>> I agree it would work, but, in my opinion, it would be a bit more 
>>>>> complicated.
>>>>> The counting loop would look something like this:
>>>>> ------------------------------------
>>>>>         outerLoop: for (int i = 0; i < ldLen; ++i) {
>>>>>             char ch = ldPath.charAt(i);
>>>>>             if (mayBeQuoted && ch == '\"') {
>>>>>                 thereAreQuotes = true;
>>>>>                 for (++i; i < ldLen; ++i) {
>>>>>                     if (ldPath.charAt(i) == '\"') {
>>>>>                         continue outerLoop;
>>>>>                     }
>>>>>                 }
>>>>>                 break; // unpaired quote
>>>>>             } else if (ch == ps) {
>>>>>                 psCount++;
>>>>>             }
>>>>>         }
>>>>> ------------------------------------
>>>>> which is 3 lines longer, comparing to the loop with inQuotes flag.
>>>>>
>>>>
>>>> It does not seem like we are doing anything special for "unpaired 
>>>> quote" (just ignore it?),
>>>> if that is the case, you probably don't need to do anything for it, 
>>>> the code could be
>>>> something like
>>>>
>>>>         for (int i = 0; i < ldLen; ++i) {
>>>>             char ch = ldPath.charAt(i);
>>>>             if (mayBeQuoted && ch == '\"') {
>>>>                 thereAreQuotes = true;
>>>>                 while (++i < ldLen && ldPath.charAt(i) != '\"') {}
>>>>             } else if (ch == ps) {
>>>>                 psCount++;
>>>>             }
>>>>         }
>>>>
>>>> I have not tried to debug the code though :-) Just an opinion here.
>>>>
>>>> -Sherman
>>>>
>>>>
>>>
>>
>>
>>
>
>
>




More information about the core-libs-dev mailing list