Skip to content

Commit 6948456

Browse files
8256461: AbstractFileSystemProvider.getSunPathForSocketCall for empty Path returns '.'
Reviewed-by: dfuchs, alanb
1 parent d309560 commit 6948456

File tree

5 files changed

+60
-3
lines changed

5 files changed

+60
-3
lines changed

src/java.base/share/classes/sun/nio/ch/UnixDomainSockets.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ static FileDescriptor socket() throws IOException {
105105

106106
static void bind(FileDescriptor fd, Path addr) throws IOException {
107107
byte[] path = getPathBytes(addr);
108+
if (path.length == 0) {
109+
throw new BindException("Server socket cannot bind to unnamed address");
110+
}
108111
bind0(fd, path);
109112
}
110113

src/java.base/share/classes/sun/nio/fs/AbstractFileSystemProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public boolean exists(Path file) {
158158
/**
159159
* Returns a path name as bytes for a Unix domain socket.
160160
* Different encodings may be used for these names on some platforms.
161+
* If path is empty, then an empty byte[] is returned.
161162
*/
162-
public abstract byte[] getSunPathForSocketFile(Path file);
163+
public abstract byte[] getSunPathForSocketFile(Path path);
163164
}

src/java.base/unix/classes/sun/nio/fs/UnixFileSystemProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public abstract class UnixFileSystemProvider
4848
extends AbstractFileSystemProvider
4949
{
5050
private static final String USER_DIR = "user.dir";
51+
private static final byte[] EMPTY_PATH = new byte[0];
5152
private final UnixFileSystem theFileSystem;
5253

5354
public UnixFileSystemProvider() {
@@ -568,6 +569,9 @@ protected String implProbeContentType(Path file) throws IOException {
568569
@Override
569570
public byte[] getSunPathForSocketFile(Path obj) {
570571
UnixPath file = UnixPath.toUnixPath(obj);
572+
if (file.isEmpty()) {
573+
return EMPTY_PATH;
574+
}
571575
return file.getByteArrayForSysCalls();
572576
}
573577
}

src/java.base/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
class WindowsFileSystemProvider
4747
extends AbstractFileSystemProvider
4848
{
49-
private static final Unsafe unsafe = Unsafe.getUnsafe();
49+
private static final byte[] EMPTY_PATH = new byte[0];
5050

5151
private final WindowsFileSystem theFileSystem;
5252

@@ -628,7 +628,7 @@ public Path readSymbolicLink(Path obj1) throws IOException {
628628
public byte[] getSunPathForSocketFile(Path obj) {
629629
WindowsPath file = WindowsPath.toWindowsPath(obj);
630630
String s = file.toString();
631-
return s.getBytes(StandardCharsets.UTF_8);
631+
return s.isEmpty() ? EMPTY_PATH : s.getBytes(StandardCharsets.UTF_8);
632632
}
633633

634634
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
/**
25+
* @test
26+
* @bug 8256461
27+
* @modules java.base/sun.nio.fs
28+
* @run testng EmptySunPathForSocketFile
29+
*/
30+
31+
import java.nio.file.FileSystems;
32+
import java.nio.file.Path;
33+
import java.nio.file.spi.FileSystemProvider;
34+
import sun.nio.fs.AbstractFileSystemProvider;
35+
36+
import static org.testng.Assert.assertEquals;
37+
38+
/**
39+
* Check that AbstractFileSystemProvider.getSunPathForSocketFile with
40+
* an empty path returns an empty byte[]
41+
*/
42+
public class EmptySunPathForSocketFile {
43+
public static void main(String[] args) throws Exception {
44+
Path path = Path.of("");
45+
FileSystemProvider provider = FileSystems.getDefault().provider();
46+
byte[] bb = ((AbstractFileSystemProvider) provider).getSunPathForSocketFile(path);
47+
assertEquals(bb, new byte[0]);
48+
}
49+
}

0 commit comments

Comments
 (0)