{"record":{"id":"f60b5317d1c7bef0","repo":"openai/codex","slug":"recursive-no-follow-removal-is-unsupported","errorCode":null,"errorMessage":"recursive no-follow removal is unsupported","messagePattern":"recursive no-follow removal is unsupported","errorType":"exception","errorClass":"io::Error","httpStatus":null,"severity":"error","filePath":"codex-rs/exec-server/src/no_follow/unix.rs","lineNumber":298,"sourceCode":"                    match mkdirat(&directory, component, Mode::from_raw_mode(0o777)) {\n                        Ok(()) | Err(rustix::io::Errno::EXIST) => {}\n                        Err(error) => return Err(io::Error::from(error)),\n                    }\n                    directory = open_directory(&directory, component)?;\n                }\n                Err(error) => return Err(error),\n            }\n        }\n        Ok(())\n    })\n    .await\n    .map_err(|error| io::Error::other(format!(\"filesystem task failed: {error}\")))?\n}\n\npub(super) async fn remove(path: PathBuf, recursive: bool, force: bool) -> io::Result<()> {\n    tokio::task::spawn_blocking(move || {\n        if recursive {\n            return Err(io::Error::new(\n                io::ErrorKind::Unsupported,\n                \"recursive no-follow removal is unsupported\",\n            ));\n        }\n        let (parent, leaf) = match parent(&path) {\n            Ok(value) => value,\n            Err(error) if force && error.kind() == io::ErrorKind::NotFound => return Ok(()),\n            Err(error) => return Err(error),\n        };\n        let metadata = match statat(&parent, &leaf, AtFlags::SYMLINK_NOFOLLOW) {\n            Ok(metadata) => metadata,\n            Err(error) if force && error == rustix::io::Errno::NOENT => return Ok(()),\n            Err(error) => return Err(io::Error::from(error)),\n        };\n        let kind = metadata.st_mode & libc::S_IFMT;\n        if kind == libc::S_IFLNK {\n            return Err(io::Error::new(\n                io::ErrorKind::InvalidInput,","sourceCodeStart":280,"sourceCodeEnd":316,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/exec-server/src/no_follow/unix.rs#L280-L316","documentation":"Error \"recursive no-follow removal is unsupported\" thrown in openai/codex.","triggerScenarios":"Thrown at codex-rs/exec-server/src/no_follow/unix.rs:298 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}