回复:RFR: 8194154 patch for crash at File.getCanonicalPath() (original) (raw)
Wenqian Pei wenqian.peiwq at alibaba-inc.com
Wed Dec 27 06:44:14 UTC 2017
- Previous message: RFR: 8194154 patch for crash at File.getCanonicalPath()
- Next message: FileOutputStream.getFD() vs finalization
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Sorry, the patch and test is below:
diff -r 777356696811 src/java.base/unix/classes/java/io/UnixFileSystem.java --- a/src/java.base/unix/classes/java/io/UnixFileSystem.java Fri Sep 08 18:24:17 2017 +0000 +++ b/src/java.base/unix/classes/java/io/UnixFileSystem.java Mon Dec 25 16:48:36 2017 +0800 @@ -100,10 +100,10 @@ if (child.equals("")) return parent; if (child.charAt(0) == '/') { if (parent.equals("/")) return child; - return parent + child; + return normalize(parent + child); } if (parent.equals("/")) return parent + child; - return parent + '/' + child; + return normalize(parent + '/' + child); } public String getDefaultParent() { diff -r 777356696811 test/java/io/File/GetCanonicalPath.java --- a/test/java/io/File/GetCanonicalPath.java Fri Sep 08 18:24:17 2017 +0000 +++ b/test/java/io/File/GetCanonicalPath.java Mon Dec 25 16:48:36 2017 +0800 @@ -23,20 +23,35 @@ /* @test @bug 4899022 + @library /lib/testlibrary + @run main/othervm GetCanonicalPath @summary Look for erroneous representation of drive letter / import java.io.; +import java.lang.reflect.Field; +import java.util.Properties; public class GetCanonicalPath { public static void main(String[] args) throws Exception { if (File.separatorChar == '\') { testDriveLetter(); } + String osName = System.getProperty("os.name"); + if (osName.startsWith("Linux")) { + testDuplicateSeparators(); + } } private static void testDriveLetter() throws Exception { String path = new File("c:/").getCanonicalPath(); if (path.length() > 3) throw new RuntimeException("Drive letter incorrectly represented"); } + private static void testDuplicateSeparators() throws Exception { + Field f = System.class.getDeclaredField("props"); + f.setAccessible(true); + Properties p = (Properties) f.get(null); + p.setProperty("user.dir", "/home/a/b/c/"); + System.out.println(new File("./a").getCanonicalPath()); + } } ps: only test on Linux :) ------------------------------------------------------------------发件人:David Holmes <david.holmes at oracle.com>发送时间:2017年12月27日(星期三) 14:14收件人:裴文谦(右席) <wenqian.peiwq at alibaba-inc.com>; core-libs-dev <core-libs-dev at openjdk.java.net>抄 送:陆传胜(传胜) <chuansheng.lcs at alipay.com>; 李三红(三红) <sanhong.lsh at alibaba-inc.com>主 题:Re: RFR: 8194154 patch for crash at File.getCanonicalPath() Hi,
Attachments get stripped (usually). You'll need to include it inline.
Cheers, David
On 25/12/2017 7:40 PM, Wenqian Pei wrote:
Hi: Bug: https://bugs.openjdk.java.net/browse/JDK-8194154 We found that if user defines -Duser.dir like "/home/a/b/c/", jvm will crash at File.getCanonicalPath() in java process bootstrap (before invoking user's java code). The native implematation of canonicalizemd.c:collapsible(char *names) has problem in processing double '/', parameter 'names' need normalized before JNICALL. This patch normalize parameters before call canonicalize0() in this call path Patch and test are in mailbox attachments. Can I please have a review for this patch?
Thanks Wenqian Pei
- Previous message: RFR: 8194154 patch for crash at File.getCanonicalPath()
- Next message: FileOutputStream.getFD() vs finalization
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]