diff options
Diffstat (limited to 'twinstall.cpp')
-rw-r--r-- | twinstall.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/twinstall.cpp b/twinstall.cpp index 041c78d63..8af709915 100644 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -55,13 +55,44 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) ret_val = mzExtractZipEntryToFile(Zip, binary_location, binary_fd); close(binary_fd); - mzCloseZipArchive(Zip); if (!ret_val) { + mzCloseZipArchive(Zip); LOGERR("Could not extract '%s'\n", ASSUMED_UPDATE_BINARY_NAME); return INSTALL_ERROR; } + // If exists, extract file_contexts from the zip file + const ZipEntry* selinx_contexts = mzFindZipEntry(Zip, "file_contexts"); + if (selinx_contexts == NULL) { + mzCloseZipArchive(Zip); + LOGINFO("Zip does not contain SELinux file_contexts file in its root.\n"); + } else { + string output_filename = "/file_contexts"; + LOGINFO("Zip contains SELinux file_contexts file in its root. Extracting to %s\n", output_filename.c_str()); + // Delete any file_contexts + if (TWFunc::Path_Exists(output_filename) && unlink(output_filename.c_str()) != 0) { + LOGINFO("Unable to unlink '%s'\n", output_filename.c_str()); + } + + int file_contexts_fd = creat(output_filename.c_str(), 0644); + if (file_contexts_fd < 0) { + mzCloseZipArchive(Zip); + LOGERR("Could not extract file_contexts to '%s'\n", output_filename.c_str()); + return INSTALL_ERROR; + } + + ret_val = mzExtractZipEntryToFile(Zip, selinx_contexts, file_contexts_fd); + close(file_contexts_fd); + + if (!ret_val) { + mzCloseZipArchive(Zip); + LOGERR("Could not extract '%s'\n", ASSUMED_UPDATE_BINARY_NAME); + return INSTALL_ERROR; + } + } + mzCloseZipArchive(Zip); + pipe(pipe_fd); args[0] = Temp_Binary.c_str(); |