11/*
2- * Copyright (c) 2005, 2023 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2005, 2024 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -210,11 +210,8 @@ protected void close(long fd) throws IOException {
210210 }
211211
212212 // Return the socket file for the given process.
213- private File findSocketFile (int pid , int ns_pid ) {
214- // A process may not exist in the same mount namespace as the caller.
215- // Instead, attach relative to the target root filesystem as exposed by
216- // procfs regardless of namespaces.
217- String root = "/proc/" + pid + "/root/" + tmpdir ;
213+ private File findSocketFile (int pid , int ns_pid ) throws IOException {
214+ String root = findTargetProcessTmpDirectory (pid , ns_pid );
218215 return new File (root , ".java_pid" + ns_pid );
219216 }
220217
@@ -230,21 +227,34 @@ private File createAttachFile(int pid, int ns_pid) throws IOException {
230227 // Do not canonicalize the file path, or we will fail to attach to a VM in a container.
231228 f .createNewFile ();
232229 } catch (IOException x ) {
233- String root ;
234- if (pid != ns_pid ) {
235- // A process may not exist in the same mount namespace as the caller.
236- // Instead, attach relative to the target root filesystem as exposed by
237- // procfs regardless of namespaces.
238- root = "/proc/" + pid + "/root/" + tmpdir ;
239- } else {
240- root = tmpdir ;
241- }
230+ String root = findTargetProcessTmpDirectory (pid , ns_pid );
242231 f = new File (root , fn );
243232 f .createNewFile ();
244233 }
245234 return f ;
246235 }
247236
237+ private String findTargetProcessTmpDirectory (int pid , int ns_pid ) throws IOException {
238+ String root ;
239+ if (pid != ns_pid ) {
240+ // A process may not exist in the same mount namespace as the caller, e.g.
241+ // if we are trying to attach to a JVM process inside a container.
242+ // Instead, attach relative to the target root filesystem as exposed by
243+ // procfs regardless of namespaces.
244+ String procRootDirectory = "/proc/" + pid + "/root" ;
245+ if (!Files .isReadable (Path .of (procRootDirectory ))) {
246+ throw new IOException (
247+ String .format ("Unable to access root directory %s " +
248+ "of target process %d" , procRootDirectory , pid ));
249+ }
250+
251+ root = procRootDirectory + "/" + tmpdir ;
252+ } else {
253+ root = tmpdir ;
254+ }
255+ return root ;
256+ }
257+
248258 /*
249259 * Write/sends the given to the target VM. String is transmitted in
250260 * UTF-8 encoding.
0 commit comments