diff --git a/master_changes.md b/master_changes.md index 38308da0749..d85db4e4869 100644 --- a/master_changes.md +++ b/master_changes.md @@ -21,6 +21,7 @@ users) ## Config report ## Actions + * Stop the installation process via .install file from creating unnecessary intermediate directories for paths that contain `..` [#7015 @kit-ty-kate] ## Install @@ -107,6 +108,7 @@ users) ## Reftests ### Tests + * Add a test showing the behaviour of .install files containing destination filepath trying to escape their scope [#6897 #7008 @rjbou @kit-ty-kate] * Add a test ensuring installing files through a .install file can't escape the opam switch (CVE-2026-57825) [#7005 @NathanReb] ### Engine @@ -116,6 +118,7 @@ users) ## Doc ## Security fixes + * Invalidate .install fields containing absolute destination filepath except when in the `misc` field [#6897 #7008 @kit-ty-kate] * Fix a bug that allowed a package to install files anywhere on the system using a symlink to an external directory without warning the user and asking for their permission: CVE-2026-57825. [#7005 @NathanReb] # API updates diff --git a/src/client/opamAction.ml b/src/client/opamAction.ml index 118822b0e7e..d9d7d247fd6 100644 --- a/src/client/opamAction.ml +++ b/src/client/opamAction.ml @@ -101,7 +101,7 @@ let preprocess_dot_install_t st nv build_dir = else (base, false) in let src_file = OpamFilename.create build_dir base.c in - let dst_file = match dst with + let unsafe_dst_file = match dst with | None -> OpamFilename.create dst_dir (OpamFilename.basename src_file) | Some d -> if append && not (OpamFilename.Base.check_suffix d ".exe") then @@ -109,25 +109,25 @@ let preprocess_dot_install_t st nv build_dir = (OpamFilename.Base.add_extension d "exe") else OpamFilename.create dst_dir d in + let dst_file = + OpamFilename.of_string + (OpamSystem.real_path (OpamFilename.to_string unsafe_dst_file)) + in let file = file_wo_prefix dst_file in let inst warning = if append then warning (OpamFilename.to_string src_file) `Add_exe; let check, warn = check ~src:build_dir ~dst:dst_dir base in - let real_dst = - OpamFilename.of_string - (OpamSystem.real_path (OpamFilename.to_string dst_file)) - in let escapes = - not (OpamFilename.starts_with switch_prefix real_dst) - || (OpamFilename.starts_with switch_meta real_dst) + not (OpamFilename.starts_with switch_prefix dst_file) + || (OpamFilename.starts_with switch_meta dst_file) in if escapes then (OpamConsole.error "package %s attempted to install a file outside allowed \ destination directories: %s -> %s." (OpamPackage.Name.to_string name) - (OpamFilename.to_string dst_file) - (OpamFilename.to_string real_dst); + (OpamFilename.to_string unsafe_dst_file) + (OpamFilename.to_string dst_file); failwith ".install file escaping allowed directories") else if check then OpamFilename.install ~warning ~exec ~src:src_file ~dst:dst_file (); diff --git a/src/format/opamFile.ml b/src/format/opamFile.ml index dd85ff45bc0..44454f0c610 100644 --- a/src/format/opamFile.ml +++ b/src/format/opamFile.ml @@ -3730,9 +3730,7 @@ module Dot_installSyntax = struct (Pp.opt @@ Pp.singleton -| Pp.V.string -| Pp.pp ~name:"rel-filename" (fun ~pos s -> - if OpamFilename.might_escape ~sep:`Unspecified s then - Pp.bad_format ~pos "%s references its parent directory." s - else if Filename.is_relative s then + if Filename.is_relative s then OpamFilename.Base.of_string s else Pp.bad_format ~pos "%s is an absolute filename." s) diff --git a/tests/reftests/dot-install.test b/tests/reftests/dot-install.test index 7bf71176801..29a1a90e31d 100644 --- a/tests/reftests/dot-install.test +++ b/tests/reftests/dot-install.test @@ -370,30 +370,35 @@ lib: [ "a-file" { "../../a-file" } "fichier" { "/ab/so/lute/path/fichier" } "dosiero" { "/tmp/../middle/dosiero" } + "dosiero" { "tmp/../../../../middle/dosiero" } "good" { "good" } ] bin: [ "a-file" { "../../a-file" } "fichier" { "/ab/so/lute/path/fichier" } "dosiero" { "/tmp/../middle/dosiero" } + "dosiero" { "tmp/../../../../middle/dosiero" } "good" { "good" } ] etc: [ "a-file" { "../../a-file" } "fichier" { "/ab/so/lute/path/fichier" } "dosiero" { "/tmp/../middle/dosiero" } + "dosiero" { "tmp/../../../../middle/dosiero" } "good" { "good" } ] share: [ "a-file" { "../../a-file" } "fichier" { "/ab/so/lute/path/fichier" } "dosiero" { "/tmp/../middle/dosiero" } + "dosiero" { "tmp/../../../../middle/dosiero" } "good" { "good" } ] misc: [ "a-file" { "../../a-file" } "fichier" { "/ab/so/lute/path/fichier" } "dosiero" { "/tmp/../middle/dosiero" } + "dosiero" { "tmp/../../../../middle/dosiero" } "good" { "good" } ] ### @@ -410,7 +415,7 @@ hallo [default] no changes from file://${BASEDIR}/REPO ### opam switch create escapability --empty ### OPAMDEBUGSECTIONS="SYSTEM" OPAMDEBUG=-5 -### opam install eskape +### opam install eskape | unordered FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (none => read) @@ -437,16 +442,16 @@ SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/ SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape/eskape.1/files/good SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/good [WARNING] Errors in ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install, some fields have been ignored: - - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:2:14-2:28:: - ../../a-file references its parent directory. - - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:8:14-8:28:: - ../../a-file references its parent directory. - - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:26:14-26:28:: + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:3:14-3:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:10:14-10:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:30:14-30:28:: ../../a-file is not an absolute filename. - - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:20:14-20:28:: - ../../a-file references its parent directory. - - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:14:14-14:28:: - ../../a-file references its parent directory. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:24:14-24:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape.1/eskape.install:17:14-17:40:: + /ab/so/lute/path/fichier is an absolute filename. -> installed eskape.1 SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache @@ -474,3 +479,315 @@ SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) Not found: ${BASEDIR}/OPAM/escapability/share/eskape/a-file ==> eskape changes opam-version: "2.0" +### : Testing escapability with a relative path containing '..' that does exist and doesn't escape +### +opam-version: "2.0" +install: [ "echo" "hellow" ] +### touch OPAM/escapability/a-file +### +lib: [ + "a-file" { "../../a-file" } +] +etc: [ + "a-file" { "../../a-file" } +] +share: [ + "a-file" { "../../a-file" } +] +misc: [ + "a-file" { "../../a-file" } +] +### +hellow +### opam install eskape-rel-dotdot-exists | unordered +FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s +SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (read => none) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (read => none) +The following actions will be performed: +=== install 1 package + - install eskape-rel-dotdot-exists 1 + +<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1 +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-dotdot-exists/eskape-rel-dotdot-exists.1/files/eskape-rel-dotdot-exists.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/eskape-rel-dotdot-exists.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-dotdot-exists/eskape-rel-dotdot-exists.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/a-file +[WARNING] Errors in ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/eskape-rel-dotdot-exists.install, some fields have been ignored: + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/eskape-rel-dotdot-exists.install:11:14-11:28:: + ../../a-file is not an absolute filename. + +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/lib/eskape-rel-dotdot-exists +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/a-file -> ${BASEDIR}/OPAM/escapability/a-file (644) +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/a-file -> ${BASEDIR}/OPAM/escapability/a-file (644) +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-dotdot-exists.1/a-file -> ${BASEDIR}/OPAM/escapability/a-file (644) +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/share +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/share/eskape-rel-dotdot-exists +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/etc +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/etc/eskape-rel-dotdot-exists +-> installed eskape-rel-dotdot-exists.1 +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-dotdot-exists.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-dotdot-exists.1/files +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-dotdot-exists/eskape-rel-dotdot-exists.1/files/eskape-rel-dotdot-exists.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-dotdot-exists.1/files/eskape-rel-dotdot-exists.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-dotdot-exists/eskape-rel-dotdot-exists.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-dotdot-exists.1/files/a-file +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (write => none) +Done. +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (write => none) +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/backup/state-today.export +SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) +SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +### ocaml cat.ml escapability eskape-rel-dotdot-exists +==> eskape-rel-dotdot-exists installed file +Not found: ${BASEDIR}/OPAM/escapability/share/eskape-rel-dotdot-exists/a-file +==> eskape-rel-dotdot-exists changes +opam-version: "2.0" +added: [ + "etc" {"D"} + "etc|eskape-rel-dotdot-exists" {"D"} + "lib|eskape-rel-dotdot-exists" {"D"} + "share" {"D"} + "share|eskape-rel-dotdot-exists" {"D"} +] +contents-changed: "a-file" {"F:12fc204edeae5b57713c5ad7dcb97d39"} +### : Testing escapability with a relative path containing '..' in the middle, that does not exist and doesn't escape +### +opam-version: "2.0" +install: [ "echo" "hellow" ] +### +lib: [ + "a-file" { "tmp/../middle/a-file" } +] +bin: [ + "a-file" { "tmp/../middle/a-file" } +] +etc: [ + "a-file" { "tmp/../middle/a-file" } +] +share: [ + "a-file" { "tmp/../middle/a-file" } +] +misc: [ + "a-file" { "tmp/../middle/a-file" } +] +### +hellow +### opam install eskape-rel-middotdot-notexists | unordered +FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s +SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (read => none) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (read => none) +The following actions will be performed: +=== install 1 package + - install eskape-rel-middotdot-notexists 1 + +<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1 +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-middotdot-notexists/eskape-rel-middotdot-notexists.1/files/eskape-rel-middotdot-notexists.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/eskape-rel-middotdot-notexists.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-middotdot-notexists/eskape-rel-middotdot-notexists.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/a-file +[WARNING] Errors in ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/eskape-rel-middotdot-notexists.install, some fields have been ignored: + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/eskape-rel-middotdot-notexists.install:14:13-14:35:: + tmp/../middle/a-file is not an absolute filename. + +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/bin/middle +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/a-file -> ${BASEDIR}/OPAM/escapability/bin/middle/a-file (755) +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/lib/eskape-rel-middotdot-notexists/middle +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/a-file -> ${BASEDIR}/OPAM/escapability/lib/eskape-rel-middotdot-notexists/middle/a-file (644) +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/share/eskape-rel-middotdot-notexists/middle +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/a-file -> ${BASEDIR}/OPAM/escapability/share/eskape-rel-middotdot-notexists/middle/a-file (644) +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/etc/eskape-rel-middotdot-notexists/middle +SYSTEM install ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-rel-middotdot-notexists.1/a-file -> ${BASEDIR}/OPAM/escapability/etc/eskape-rel-middotdot-notexists/middle/a-file (644) +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/lib/eskape-rel-middotdot-notexists +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/share/eskape-rel-middotdot-notexists +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/etc/eskape-rel-middotdot-notexists +-> installed eskape-rel-middotdot-notexists.1 +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-middotdot-notexists.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-middotdot-notexists.1/files +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-middotdot-notexists/eskape-rel-middotdot-notexists.1/files/eskape-rel-middotdot-notexists.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-middotdot-notexists.1/files/eskape-rel-middotdot-notexists.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-rel-middotdot-notexists/eskape-rel-middotdot-notexists.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-rel-middotdot-notexists.1/files/a-file +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (write => none) +Done. +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (write => none) +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/backup/state-today.export +SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) +SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +### ocaml cat.ml escapability eskape-rel-middotdot-notexists +==> eskape-rel-middotdot-notexists installed file +Not found: ${BASEDIR}/OPAM/escapability/share/eskape-rel-middotdot-notexists/a-file +==> eskape-rel-middotdot-notexists changes +opam-version: "2.0" +added: [ + "bin|middle" {"D"} + "bin|middle|a-file" {"F:12fc204edeae5b57713c5ad7dcb97d39"} + "etc|eskape-rel-middotdot-notexists" {"D"} + "etc|eskape-rel-middotdot-notexists|middle" {"D"} + "etc|eskape-rel-middotdot-notexists|middle|a-file" + {"F:12fc204edeae5b57713c5ad7dcb97d39"} + "lib|eskape-rel-middotdot-notexists" {"D"} + "lib|eskape-rel-middotdot-notexists|middle" {"D"} + "lib|eskape-rel-middotdot-notexists|middle|a-file" + {"F:12fc204edeae5b57713c5ad7dcb97d39"} + "share|eskape-rel-middotdot-notexists" {"D"} + "share|eskape-rel-middotdot-notexists|middle" {"D"} + "share|eskape-rel-middotdot-notexists|middle|a-file" + {"F:12fc204edeae5b57713c5ad7dcb97d39"} +] +### : Testing escapability with a relative path containing '..' in the middle, that does not exist and does escape +### +opam-version: "2.0" +install: [ "echo" "hellow" ] +### +lib: [ + "a-file" { "tmp/../../../../middle/a-file" } +] +bin: [ + "a-file" { "tmp/../../../middle/a-file" } +] +etc: [ + "a-file" { "tmp/../../../../middle/a-file" } +] +share: [ + "a-file" { "tmp/../../../../middle/a-file" } +] +misc: [ + "a-file" { "tmp/../../../../middle/a-file" } +] +### +hellow +### opam install realeskape-rel-middotdot-notexists | unordered +FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s +SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (read => none) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (read => none) +The following actions will be performed: +=== install 1 package + - install realeskape-rel-middotdot-notexists 1 + +<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1 +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/realeskape-rel-middotdot-notexists/realeskape-rel-middotdot-notexists.1/files/realeskape-rel-middotdot-notexists.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1/realeskape-rel-middotdot-notexists.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/realeskape-rel-middotdot-notexists/realeskape-rel-middotdot-notexists.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1/a-file +[WARNING] Errors in ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1/realeskape-rel-middotdot-notexists.install, some fields have been ignored: + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/realeskape-rel-middotdot-notexists.1/realeskape-rel-middotdot-notexists.install:14:13-14:44:: + tmp/../../../../middle/a-file is not an absolute filename. + +[ERROR] package realeskape-rel-middotdot-notexists attempted to install a file outside allowed destination directories: ${BASEDIR}/OPAM/escapability/bin/tmp/../../../middle/a-file -> ${BASEDIR}/OPAM/middle/a-file. +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/lib/realeskape-rel-middotdot-notexists +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/lib/realeskape-rel-middotdot-notexists +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/share/realeskape-rel-middotdot-notexists +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/etc/realeskape-rel-middotdot-notexists +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/doc/realeskape-rel-middotdot-notexists +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/install/realeskape-rel-middotdot-notexists.install + +.install file escaping allowed directories +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (write => none) + + +<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> ++- The following actions failed +| - install realeskape-rel-middotdot-notexists 1 ++- +- No changes have been performed +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (write => none) +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/backup/state-today.export +SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) +SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +# Return code 31 # +### ocaml cat.ml escapability realeskape-rel-middotdot-notexists +==> realeskape-rel-middotdot-notexists installed file +Not found: ${BASEDIR}/OPAM/escapability/share/realeskape-rel-middotdot-notexists/a-file +==> realeskape-rel-middotdot-notexists changes +Not found: ${BASEDIR}/OPAM/escapability/.opam-switch/install/realeskape-rel-middotdot-notexists.changes +### : Testing escapability with an absolute path +### +opam-version: "2.0" +install: [ "echo" "hellow" ] +### +lib: [ + "fichier" { "/ab/so/lute/path/fichier" } +] +bin: [ + "fichier" { "/ab/so/lute/path/fichier" } +] +etc: [ + "fichier" { "/ab/so/lute/path/fichier" } +] +share: [ + "fichier" { "/ab/so/lute/path/fichier" } +] +### +hellow +### opam install eskape-abs | unordered +FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s +SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/repo/state-magicv.cache (read => none) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => read) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (read => none) +The following actions will be performed: +=== install 1 package + - install eskape-abs 1 + +<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> +SYSTEM rmdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1 +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-abs/eskape-abs.1/files/eskape-abs.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-abs/eskape-abs.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/a-file +[WARNING] Errors in ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install, some fields have been ignored: + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install:2:14-2:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install:5:14-5:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install:11:14-11:40:: + /ab/so/lute/path/fichier is an absolute filename. + - At ${BASEDIR}/OPAM/escapability/.opam-switch/build/eskape-abs.1/eskape-abs.install:8:14-8:40:: + /ab/so/lute/path/fichier is an absolute filename. + +-> installed eskape-abs.1 +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-abs.1 +SYSTEM mkdir ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-abs.1/files +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-abs/eskape-abs.1/files/eskape-abs.install +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-abs.1/files/eskape-abs.install +SYSTEM read ${BASEDIR}/OPAM/repo/default/packages/eskape-abs/eskape-abs.1/files/a-file +SYSTEM write ${BASEDIR}/OPAM/escapability/.opam-switch/packages/eskape-abs.1/files/a-file +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (none => write) +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/packages/cache (write => none) +Done. +SYSTEM LOCK ${BASEDIR}/OPAM/escapability/.opam-switch/lock (write => none) +SYSTEM rm ${BASEDIR}/OPAM/escapability/.opam-switch/backup/state-today.export +SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) +SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +### ocaml cat.ml escapability eskape-abs +==> eskape-abs installed file +Not found: ${BASEDIR}/OPAM/escapability/share/eskape-abs/a-file +==> eskape-abs changes +opam-version: "2.0"