RFR: 8067951: System.loadLibrary cannot find library when path contains quoted entry
Xueming Shen
xueming.shen at oracle.com
Tue Jan 6 18:33:07 UTC 2015
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