Changed the creation location of the NI file to configure smack for RPK
authorj-h.choi <j-h.choi@samsung.com>
Wed, 21 Feb 2024 05:05:44 +0000 (14:05 +0900)
committer조웅석/MDE Lab(SR)/삼성전자 <ws77.cho@samsung.com>
Wed, 28 Feb 2024 06:16:25 +0000 (15:16 +0900)
When the RPK(resource package) is installed through pkgcmd, AOT is performed.
At this time, there was an issue that the smack label did not change for the NI created in the lib folder.
Because the installer does not have the capability of cap_mac_admin.

Change-Id: I74d47104d9edf07187fd1bd942a2993c280a7219

NativeLauncher/inc/ni_common.h
NativeLauncher/tool/ni_common.cc
NativeLauncher/tool/r2r_checker.cc

index 28b387fa72829348b289b2b76731e136a1a57479..e1c7e8529ea29a4f2d58a7eb65596c5a546f6b71 100644 (file)
@@ -41,6 +41,7 @@
 #define NI_FLAGS_SKIP_RO_APP            0x0400
 #define NI_FLAGS_RM_ORIGIN_AFTER_NI     0x0800
 #define NI_FLAGS_SET_PRIORITY           0x1000
+#define NI_FLAGS_RESOURCE_NI            0x2000
 
 typedef std::function<void (std::string)> afterCreate;
 
index 6ab3e10d7d4bda1539ef2594f8395a54b9df678c..bacf9238789b80aa798f82ec3496ac77f9639027 100644 (file)
@@ -233,6 +233,7 @@ static bool createDirsAndCopyOwnerShip(std::string& target_path, const std::stri
 static std::string getNIFilePath(const std::string& absDllPath, NIOption* opt)
 {
        std::string dllPath = absDllPath;
+       std::string fileName = getFileName(absDllPath);
        if (opt->flags & NI_FLAGS_APPNI) {
                std::string niDirPath;
                std::string niTmpDirPath;
@@ -253,10 +254,13 @@ static std::string getNIFilePath(const std::string& absDllPath, NIOption* opt)
                                niTmpDirPath = prevPath;
                                _SERR("fail to create dir (%s)", niTmpDirPath.c_str());
                        }
-                       dllPath = concatPath(niTmpDirPath, getFileName(absDllPath));
+                       dllPath = concatPath(niTmpDirPath, fileName);
                } else {
-                       dllPath = concatPath(niDirPath, getFileName(absDllPath));
+                       dllPath = concatPath(niDirPath, fileName);
                }
+       } else if (opt->flags & NI_FLAGS_RESOURCE_NI) {
+               std::string rpkDir = concatPath(__pm->getAppRootPath(), APP_NI_SUB_DIR);
+               dllPath = createDir(rpkDir) ? concatPath(rpkDir, fileName) : concatPath(__pm->getAppRootPath(), fileName);
        }
 
        size_t index = dllPath.find_last_of(".");
@@ -466,6 +470,11 @@ static ni_error_e crossgen2PostAction(const std::string& dllPath, const std::str
                }
        }
 
+       if (opt->flags & NI_FLAGS_RESOURCE_NI) {
+               moveFile(niPath, changeExtension(dllPath, ".dll", ".ni.dll"));
+               removeAll(concatPath(__pm->getAppRootPath(), APP_NI_SUB_DIR));
+       }
+
        if (!(opt->flags & NI_FLAGS_INPUT_BUBBLE && opt->flags & NI_FLAGS_NO_PIPELINE)) {
                _SOUT("Native image %s generated successfully.", outFile.c_str());
        }
@@ -825,7 +834,7 @@ static ni_error_e removeAndCreateNI(const char* pkgId, NIOption* pOptions)
        }
 
        _SOUT("Complete make native image for pkg (%s)", pkgId);
-       return NI_ERROR_NONE;   
+       return NI_ERROR_NONE;
 }
 
 static bool isReadOnlyPkg(std::string pkgId)
@@ -1026,7 +1035,6 @@ ni_error_e createNIUnderTAC(const std::string& targetPath, const std::string& re
        return NI_ERROR_NONE;
 }
 
-
 ni_error_e createNIUnderDirs(const std::string& rootPaths, NIOption* opt)
 {
        ni_error_e ret = NI_ERROR_NONE;
@@ -1082,6 +1090,7 @@ ni_error_e createNIUnderPkgRoot(const std::string& pkgId, NIOption* opt)
                _SERR("Failed to get root path from [%s]", pkgId.c_str());
                return NI_ERROR_INVALID_PACKAGE;
        }
+       __pm->setAppRootPath(rootPath);
 
        char* extraDllPaths = pluginGetExtraDllPath();
        if (extraDllPaths && extraDllPaths[0] != '\0') {
@@ -1091,7 +1100,10 @@ ni_error_e createNIUnderPkgRoot(const std::string& pkgId, NIOption* opt)
 
        std::string targetDirs;
        if (isRPK(pkgId)) {
-               opt->flags &= ~NI_FLAGS_APPNI;
+               opt->flags &= ~NI_FLAGS_APPNI; // added to exclude logic of APP_NI
+               opt->flags |= NI_FLAGS_RESOURCE_NI; // added flag for RPK type
+               opt->flags |= NI_FLAGS_NO_PIPELINE; // added the flag to set the output path
+
                std::string paths = getResourcePaths(rootPath);
                if (paths.empty()) {
                        _SERR("Failed to get rpk paths from [%s]", pkgId.c_str());
@@ -1099,9 +1111,8 @@ ni_error_e createNIUnderPkgRoot(const std::string& pkgId, NIOption* opt)
                }
                targetDirs = paths;
        } else {
-               __pm->setAppRootPath(rootPath);
-
                opt->flags |= NI_FLAGS_APPNI;
+               opt->flags &= ~NI_FLAGS_RESOURCE_NI; // added to exclude logic of RESOURCE_NI
 
                if (isReadOnlyArea(rootPath)) {
                        opt->flags |= NI_FLAGS_APP_UNDER_RO_AREA;
@@ -1189,7 +1200,7 @@ ni_error_e removeNIUnderPkgRoot(const std::string& pkgId)
                        if (isDirectory(path)) {
                                removeNIUnderDirs(path);
                        }
-               }               
+               }
        } else {
                __pm->setAppRootPath(rootPath);
 
index 06ef6e48175771fb2440c821187992b71e7b38c6..b4a337a976a13b760903acbbbf81648277db02a4 100644 (file)
@@ -115,13 +115,11 @@ static bool hasValidR2RHeader(void* pAddr)
 
        IMAGE_DATA_DIRECTORY* pCorDir = getCorDirectoryEntry(pNTHeaders);
        if (!pCorDir) {
-               _SERR("Invalid Cor Data Directory");
                return false;
        }
 
        IMAGE_COR20_HEADER* pCor = (IMAGE_COR20_HEADER*)getDirectoryData(pAddr, pNTHeaders, pCorDir);
        if (!pCor) {
-               _SERR("Invalid Cor Header");
                return false;
        }