{"record":{"id":"3323d036bc0e3272","repo":"quarkusio/quarkus","slug":"unable-to-validate-remote-dev-path-file","errorCode":null,"errorMessage":"Unable to validate remote-dev path: <file>","messagePattern":"Unable to validate remote-dev path: <file>","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java","lineNumber":490,"sourceCode":"        final Path realRoot;\n        try {\n            realRoot = normalizedRoot.toRealPath();\n        } catch (IOException e) {\n            throw new IllegalArgumentException(\"Unable to validate the application root for remote-dev path: \" + file, e);\n        }\n        Path current = normalizedRoot;\n        for (Path element : normalizedRoot.relativize(resolved)) {\n            current = current.resolve(element);\n            if (Files.isSymbolicLink(current)) {\n                throw new IllegalArgumentException(\"Symbolic links are not allowed in remote-dev paths: \" + file);\n            }\n            if (Files.exists(current, LinkOption.NOFOLLOW_LINKS)) {\n                try {\n                    if (!current.toRealPath().startsWith(realRoot)) {\n                        throw new IllegalArgumentException(\"Path leaves the application root: \" + file);\n                    }\n                } catch (IOException e) {\n                    throw new IllegalArgumentException(\"Unable to validate remote-dev path: \" + file, e);\n                }\n            } else {\n                break;\n            }\n        }\n    }\n\n    private static String normalizeFile(String file) {\n        requireNonNull(file, \"file\");\n        file = file.replace('\\\\', '/');\n        if (file.startsWith(\"/\")) {\n            file = file.substring(1);\n        }\n        return file;\n    }\n\n    @Override\n    public boolean isTest() {","sourceCodeStart":472,"sourceCodeEnd":508,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java#L472-L508","documentation":"While walking path components, calling toRealPath() on an existing component can itself throw IOException; the validation wraps this in an IllegalArgumentException with this message (cause attached). The server could not determine whether the path stays inside the root, so it fails closed.","triggerScenarios":"updateFile or resolveApplicationPath validating a path where current.toRealPath() throws IOException for an existing component — permission denied on a parent, I/O error, or racing deletion of the component during traversal.","commonSituations":"Permission changes on intermediate directories; concurrent mvn clean removing components mid-validation; flaky network filesystems.","solutions":["Fix permissions on the intermediate directories of the path (chmod a+rx on parents).","Re-run the sync after the filesystem stabilizes (avoid mvn clean during remote-dev sync).","Check the health of the network filesystem backing the root.","Restart the dev server if the root layout changed underneath it."],"exampleFix":"// before: parent dir mode 0700 owned by other user -> toRealPath() throws\n// after (server shell): chmod a+rx /path/to/parent","handlingStrategy":"validation","validationCode":"Path root = Path.of(\".\").toAbsolutePath().normalize();\nfor (Path p = root; p != null; p = p.getParent()) {\n    if (!Files.isReadable(p) || !Files.isExecutable(p))\n        throw new IllegalStateException(\"cannot traverse: \" + p);\n    if (p.equals(root.getRoot())) break;\n}","typeGuard":null,"tryCatchPattern":"try {\n    client.sync(path);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Unable to validate remote-dev path\")) {\n        Throwable cause = e.getCause();\n        log.errorf(\"Path validation IO failure (%s) — check permissions/storage, then retry\", cause == null ? \"?\" : cause.getMessage());\n    } else throw e;\n}","preventionTips":["Ensure execute/read permission on every parent directory","Avoid mvn clean or concurrent mutation during remote-dev sync","Monitor network-filesystem health"],"tags":["io","remote-dev","validation","filesystem"],"backgroundTag":"ioexception-wrapped","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}