RFR: 8194154 patch for crash at File.getCanonicalPath()

yumin qi yumin.qi at gmail.com
Wed Feb 14 22:36:41 UTC 2018


HI, Roger and Brian

  Updated again in same link.
  I could not run jtreg so please have a look if the options are good for
@run

Thanks
Yumin

On Wed, Feb 14, 2018 at 11:13 AM, Roger Riggs <Roger.Riggs at oracle.com>
wrote:

> Hi,
>
> In the test, the message can be improved; though the exception should
> never occur
> it will be misleading if it does.
> Instead:
>     "Changing property user.dir should have no effect on the
> getCanonicalPath"
>
> It is cleaner to throw AssertionError for the test failure.
> Throwing FileSystemException makes it look like it came from inside the
> file system implementation.
>
> Regards, Roger
>
>
> On 2/13/2018 6:45 PM, yumin qi wrote:
>
>> Alan,
>>
>>    In fact, if property "user.dir" is cached, the problem will go away
>> without any changes to native or UnixFileSystem.java, since it won't
>> canonicalize the string supplied from user. The output will be
>>    getProperty("user.dir") + "/" + file. (The result is not as expected,
>> user can not change the property, means user has to work around the
>> problem
>> to reach their targeted directory to do things like loading classes)
>>
>>    Any change to "user.dir" in java program does not have any effect.
>>    For Windows:
>>
>> --- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java Fri Feb
>> 02
>> 10:32:59 2018 -0800
>> +++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java Tue Feb
>> 13
>> 23:40:21 2018 +0000
>> @@ -43,12 +43,14 @@
>>       private final char slash;
>>       private final char altSlash;
>>       private final char semicolon;
>> +    private final String userDir;
>>
>>       public WinNTFileSystem() {
>>           Properties props = GetPropertyAction.privilegedGetProperties();
>>           slash = props.getProperty("file.separator").charAt(0);
>>           semicolon = props.getProperty("path.separator").charAt(0);
>>           altSlash = (this.slash == '\\') ? '/' : '\\';
>> +        userDir = props.getProperty("user.dir");
>>       }
>>
>>       private boolean isSlash(char c) {
>> @@ -347,7 +349,7 @@
>>       private String getUserPath() {
>>           /* For both compatibility and security,
>>              we must look this up every time */
>> -        return normalize(System.getProperty("user.dir"));
>> +        return normalize(userDir);
>>       }
>>
>>       private String getDrive(String path) {
>>
>>    Does it need normalize(userDir) in getUserPath()? I think we need here.
>>
>>    I will update the webrev and send for another round of review: the
>> change
>> in native will be reverted, and made changes to UnixFileSystem.java.
>>
>>
>> Thanks
>> Yumin
>>
>>
>> On Mon, Feb 12, 2018 at 3:09 AM, Alan Bateman <Alan.Bateman at oracle.com>
>> wrote:
>>
>> On 09/02/2018 18:01, Alan Bateman wrote:
>>>
>>> :
>>>>
>>>> I'll study the patch you have but I think we also need to create issues
>>>> to get us to the point where changing this system property in a running
>>>> VM
>>>> doesn't impact running code.
>>>>
>>>> Looking at it again, I think we should change java.io.UnixFileSystem
>>> (and
>>> the Windows equivalent) to cache the value of user.dir to avoid difficult
>>> to diagnose issues with bad code changing the value of this property in a
>>> running VM. This should reduce the issue down to cases where user.dir is
>>> changed on the command line (never supported either of course) to a value
>>> that is not "/" but has trailing or duplicate slashes.
>>>
>>> When reduced down then the alternatives are to change the native
>>> canonicalize method as you have done or alternatively do it once at
>>> UnixFileSystem initialization time so that canonicalize does not have to
>>> deal with this case. The former would require changing the description of
>>> the function (it currently reads "The input path is assumed to contain no
>>> duplicate slashes"), the latter avoids any changes to the native
>>> implementation.
>>>
>>> -Alan
>>>
>>>
>>> diff -r 0937e5f799df src/java.base/unix/classes/jav
>>> a/io/UnixFileSystem.java
>>> --- a/src/java.base/unix/classes/java/io/UnixFileSystem.java    Sat Feb
>>> 10 07:06:16 2018 -0500
>>> +++ b/src/java.base/unix/classes/java/io/UnixFileSystem.java    Mon Feb
>>> 12 10:49:40 2018 +0000
>>> @@ -34,12 +34,14 @@
>>>       private final char slash;
>>>       private final char colon;
>>>       private final String javaHome;
>>> +    private final String userDir;
>>>
>>>       public UnixFileSystem() {
>>>           Properties props = GetPropertyAction.privilegedGe
>>> tProperties();
>>>           slash = props.getProperty("file.separator").charAt(0);
>>>           colon = props.getProperty("path.separator").charAt(0);
>>>           javaHome = props.getProperty("java.home");
>>> +        userDir = props.getProperty("user.dir");
>>>       }
>>>
>>>
>>> @@ -128,7 +130,11 @@
>>>
>>>       public String resolve(File f) {
>>>           if (isAbsolute(f)) return f.getPath();
>>> -        return resolve(System.getProperty("user.dir"), f.getPath());
>>> +        SecurityManager sm = System.getSecurityManager();
>>> +        if (sm != null) {
>>> +            sm.checkPropertyAccess("user.dir");
>>> +        }
>>> +        return resolve(userDir, f.getPath());
>>>       }
>>>
>>>       // Caches for canonicalization results to improve startup
>>> performance.
>>>
>>>
>>>
>


More information about the core-libs-dev mailing list