diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 2329449c8b..c0049ba3a6 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -2626,8 +2626,8 @@ bool extract_tar(std::string const& arFileName, struct archive* a = archive_read_new(); struct archive* ext = archive_write_disk_new(); if (extract) { - int flags = ARCHIVE_EXTRACT_SECURE_NODOTDOT | - ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS | ARCHIVE_EXTRACT_SECURE_SYMLINKS; + int flags = + ARCHIVE_EXTRACT_SECURE_NODOTDOT | ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS; if (extractTimestamps == cmSystemTools::cmTarExtractTimestamps::Yes) { flags |= ARCHIVE_EXTRACT_TIME; } diff --git a/Tests/RunCMake/CommandLineTar/extract-through-symlink.cmake b/Tests/RunCMake/CommandLineTar/extract-through-symlink.cmake new file mode 100644 index 0000000000..f08f0966d5 --- /dev/null +++ b/Tests/RunCMake/CommandLineTar/extract-through-symlink.cmake @@ -0,0 +1,12 @@ +# Test that cmake -E tar can extract to a symlinked directory + +set(OUTPUT_NAME "test.tar.gz") + +set(COMPRESSION_FLAGS -cvzf) +set(COMPRESSION_OPTIONS --format=gnutar) + +set(DECOMPRESSION_FLAGS -xvzf) + +set(DESTINATION_SYMLINK ON) + +include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake) diff --git a/Tests/RunCMake/CommandLineTar/roundtrip.cmake b/Tests/RunCMake/CommandLineTar/roundtrip.cmake index a6311ea6f6..eeafcdbf1c 100644 --- a/Tests/RunCMake/CommandLineTar/roundtrip.cmake +++ b/Tests/RunCMake/CommandLineTar/roundtrip.cmake @@ -44,7 +44,13 @@ endif() file(REMOVE ${FULL_OUTPUT_NAME}) file(REMOVE_RECURSE ${FULL_DECOMPRESS_DIR}) -file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) +if(DESTINATION_SYMLINK AND UNIX) + file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}-dir) + execute_process(COMMAND ln -sf + ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR}) +else() + file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) +endif() run_tar(${CMAKE_CURRENT_BINARY_DIR} ${COMPRESSION_FLAGS} ${FULL_OUTPUT_NAME} ${COMPRESSION_OPTIONS} ${COMPRESS_DIR}) run_tar(${FULL_DECOMPRESS_DIR} ${DECOMPRESSION_FLAGS} ${FULL_OUTPUT_NAME} ${DECOMPRESSION_OPTIONS} -- ${DECOMPRESSION_PATHNAMES}) diff --git a/Tests/RunCMake/File_Archive/RunCMakeTest.cmake b/Tests/RunCMake/File_Archive/RunCMakeTest.cmake index 0602db1a01..a49c7f00fc 100644 --- a/Tests/RunCMake/File_Archive/RunCMakeTest.cmake +++ b/Tests/RunCMake/File_Archive/RunCMakeTest.cmake @@ -58,3 +58,5 @@ if(Python_EXECUTABLE) run_cmake_script(path-absolute -DPython_EXECUTABLE=${Python_EXECUTABLE}) run_cmake_script(path-traversal -DPython_EXECUTABLE=${Python_EXECUTABLE}) endif() + +run_cmake(extract-through-symlink) diff --git a/Tests/RunCMake/File_Archive/extract-through-symlink.cmake b/Tests/RunCMake/File_Archive/extract-through-symlink.cmake new file mode 100644 index 0000000000..2734bc62ab --- /dev/null +++ b/Tests/RunCMake/File_Archive/extract-through-symlink.cmake @@ -0,0 +1,9 @@ +# Test that file(ARCHIVE_EXTRACT) can extract to a symlinked directory + +set(OUTPUT_NAME "test.tar.gz") + +set(ARCHIVE_FORMAT gnutar) +set(COMPRESSION_TYPE GZip) +set(DESTINATION_SYMLINK ON) + +include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake) diff --git a/Tests/RunCMake/File_Archive/roundtrip.cmake b/Tests/RunCMake/File_Archive/roundtrip.cmake index 99b87af5cb..a2048930de 100644 --- a/Tests/RunCMake/File_Archive/roundtrip.cmake +++ b/Tests/RunCMake/File_Archive/roundtrip.cmake @@ -33,7 +33,13 @@ endif() file(REMOVE ${FULL_OUTPUT_NAME}) file(REMOVE_RECURSE ${FULL_DECOMPRESS_DIR}) -file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) +if(DESTINATION_SYMLINK AND UNIX) + file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}-dir) + execute_process(COMMAND ln -sf + ${FULL_DECOMPRESS_DIR}-dir ${FULL_DECOMPRESS_DIR}) +else() + file(MAKE_DIRECTORY ${FULL_DECOMPRESS_DIR}) +endif() file(ARCHIVE_CREATE OUTPUT ${FULL_OUTPUT_NAME}