From 56e3cc850cde4578ae0ec709d085ee02a4ecaac8 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 23 Apr 2020 20:30:18 +0900 Subject: [PATCH 01/16] Remove preload-rw pkgs after install These packages were backuped already. Change-Id: Ibca7ca4ab358788759c90c28e9a24eee10866e97 Signed-off-by: Sangyoon Jang --- src/install_preload_pkg.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/install_preload_pkg.c b/src/install_preload_pkg.c index e53ab34..48576cc 100644 --- a/src/install_preload_pkg.c +++ b/src/install_preload_pkg.c @@ -144,20 +144,7 @@ static int _install_preload_pkg(const char *backend, const char *directory, waitpid(pid, &status, 0); } - /* remove a file after installation, - * keep rw packages for factory-reset - */ - if (readonly) { - ret = remove(file_path); - if (ret < 0) { - _E("Failed to remove [%s]: [%s]", - file_path, strerror_r(errno, err_buf, - sizeof(err_buf))); - closedir(dir); - g_list_free_full(preload_rw_pkg_list, free); - return -1; - } - } else { + if (!readonly) { // make the preload-rw list pkg_info = pkgmgr_client_check_pkginfo_from_file(file_path); if (pkg_info == NULL) { @@ -170,6 +157,17 @@ static int _install_preload_pkg(const char *backend, const char *directory, pkgmgr_client_free_pkginfo(pkg_info); pkg_info = NULL; } + + /* remove a file after installation */ + ret = remove(file_path); + if (ret < 0) { + _E("Failed to remove [%s]: [%s]", file_path, + strerror_r(errno, err_buf, + sizeof(err_buf))); + closedir(dir); + g_list_free_full(preload_rw_pkg_list, free); + return -1; + } } closedir(dir); -- 2.7.4 From b2e0373859679f5e462b83ace3d44ab56a20e6cf Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 27 Apr 2020 15:02:17 +0900 Subject: [PATCH 02/16] Fix preload-rw update Add version, type information at ".all_preload_rw_list" to update preload-rw packages during Tizen platform upgrade. Change-Id: Ifaa629ed4b8a591f03a22bdcfb70cd471e99fd94 Signed-off-by: Sangyoon Jang --- src/install_preload_pkg.c | 67 +++++++++++--- src/pkg_upgrade.c | 226 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 240 insertions(+), 53 deletions(-) diff --git a/src/install_preload_pkg.c b/src/install_preload_pkg.c index 48576cc..d73894d 100644 --- a/src/install_preload_pkg.c +++ b/src/install_preload_pkg.c @@ -59,11 +59,27 @@ #define WGT_RW_DIR tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-rw-wgt") #define ALL_PRELOAD_RW_PKG_LIST "/opt/usr/share/.all_preload_rw_list" +struct pkginfo { + char *pkgid; + char *version; + char *type; +}; + +static void __free_pkginfo(gpointer data) +{ + struct pkginfo *info = (struct pkginfo *)data; + free(info->pkgid); + free(info->version); + free(info->type); + free(info); +} + static void __make_preload_rw_list(GList *pkg_list) { FILE *file; char err_buf[BUFSZE]; char pkg_info[BUFSZE]; + struct pkginfo *info; if (pkg_list == NULL) return; @@ -76,14 +92,12 @@ static void __make_preload_rw_list(GList *pkg_list) } for (; pkg_list != NULL; pkg_list = pkg_list->next) { - char *pkgid = pkg_list->data; - if (pkgid == NULL) { - _E("pkgid is null\n"); - continue; - } - - _D("Add [%s] to preload-rw list", pkgid); - snprintf(pkg_info, BUFSZE, "package=\"%s\":\n", pkgid); + info = (struct pkginfo *)pkg_list->data; + _D("Add [%s][%s][%s] to preload-rw list", info->pkgid, + info->version, info->type); + snprintf(pkg_info, BUFSZE, "package=\"%s\"\tversion=\"%s\"\t" + "type=\"%s\":\n", + info->pkgid, info->version, info->type); fwrite(pkg_info, 1, strlen(pkg_info), file); } @@ -100,7 +114,7 @@ static int _install_preload_pkg(const char *backend, const char *directory, char err_buf[BUFSZE]; GList *preload_rw_pkg_list = NULL; package_manager_pkg_detail_info_t *pkg_info; - char *pkgid; + struct pkginfo *info; dir = opendir(directory); if (!dir) { @@ -135,7 +149,7 @@ static int _install_preload_pkg(const char *backend, const char *directory, } else if (pid < 0) { _E("failed to fork and execute %s!", backend); closedir(dir); - g_list_free_full(preload_rw_pkg_list, free); + g_list_free_full(preload_rw_pkg_list, __free_pkginfo); return -1; } @@ -152,8 +166,35 @@ static int _install_preload_pkg(const char *backend, const char *directory, continue; } - pkgid = strdup(pkg_info->pkgid); - preload_rw_pkg_list = g_list_append(preload_rw_pkg_list, pkgid); + info = calloc(1, sizeof(struct pkginfo)); + if (info == NULL) { + _E("out of memory"); + pkgmgr_client_free_pkginfo(pkg_info); + continue; + } + info->pkgid = strdup(pkg_info->pkgid); + if (info->pkgid == NULL) { + _E("out of memory"); + __free_pkginfo((struct pkginfo *)info); + pkgmgr_client_free_pkginfo(pkg_info); + continue; + } + info->version = strdup(pkg_info->version); + if (info->version == NULL) { + _E("out of memory"); + __free_pkginfo((struct pkginfo *)info); + pkgmgr_client_free_pkginfo(pkg_info); + continue; + } + info->type = strdup(pkg_info->pkg_type); + if (info->type == NULL) { + _E("out of memory"); + __free_pkginfo((struct pkginfo *)info); + pkgmgr_client_free_pkginfo(pkg_info); + continue; + } + preload_rw_pkg_list = g_list_append(preload_rw_pkg_list, + info); pkgmgr_client_free_pkginfo(pkg_info); pkg_info = NULL; } @@ -173,7 +214,7 @@ static int _install_preload_pkg(const char *backend, const char *directory, closedir(dir); __make_preload_rw_list(preload_rw_pkg_list); - g_list_free_full(preload_rw_pkg_list, free); + g_list_free_full(preload_rw_pkg_list, __free_pkginfo); return 0; } diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index a5c484e..115b8a0 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -52,18 +52,33 @@ tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ "pkgmgr/fota/pkgid_list_from_xml.txt") #define PRELOAD_RW_PKG_LIST \ - tzplatform_mkpath(TZ_SYS_RO_APP, \ - ".preload_rw_pkg_list") + tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ + "pkgmgr/fota/.all_preload_rw_list") #define DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_parser.db") #define OPT_ZIP_FILE "/usr/system/RestoreDir/opt.zip" #define ALL_PRELOAD_RW_PKG_LIST "/opt/usr/share/.all_preload_rw_list" +struct pkginfo { + char *pkgid; + char *version; + char *type; +}; + static char *unzip_path[BUF_SIZE] = { "opt/usr/globalapps", "opt/etc/skel/apps_rw", NULL }; +static void __free_pkginfo(gpointer data) +{ + struct pkginfo *info = (struct pkginfo *)data; + free(info->pkgid); + free(info->version); + free(info->type); + free(info); +} + float __get_elapsed_time() { static long start_time = 0; @@ -141,15 +156,37 @@ static void __iter_cb(gpointer key, gpointer value, gpointer user_data) FILE *file; char *pkgid; + char *version; + char *type; char pkg_info[BUF_SIZE]; + pkgmgrinfo_pkginfo_h info; if (user_data == NULL || key == NULL) return; file = user_data; pkgid = key; - snprintf(pkg_info, BUF_SIZE, "package=\"%s\":\n", pkgid); + + if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &info)) { + _LOGE("failed to get pkginfo of %s\n", pkgid); + return; + } + + if (pkgmgrinfo_pkginfo_get_version(info, &version)) { + pkgmgrinfo_pkginfo_destroy_pkginfo(info); + return; + } + + if (pkgmgrinfo_pkginfo_get_type(info, &type)) { + pkgmgrinfo_pkginfo_destroy_pkginfo(info); + return; + } + + snprintf(pkg_info, BUF_SIZE, + "package=\"%s\"\tversion=\"%s\"\ttype=\"%s\":\n", + pkgid, version, type); fwrite(pkg_info, 1, strlen(pkg_info), file); + pkgmgrinfo_pkginfo_destroy_pkginfo(info); } static void __make_preload_rw_list(GHashTable *preload_rw_table) @@ -288,14 +325,57 @@ static int __make_pkgid_list(const char *file_path, char *pkgid, } static int __insert_preload_rw_table(GHashTable *preload_rw_table, - const char *pkgid) + const char *pkgid, const char *version, const char *type) { - char *package = strdup(pkgid); - retvm_if(package == NULL, -1, "strdup failed\n"); - g_hash_table_insert(preload_rw_table, package, NULL); + struct pkginfo *info; + char *package; + + info = calloc(1, sizeof(struct pkginfo)); + if (info == NULL) { + _LOGE("out of memory"); + return -1; + } + + info->pkgid = strdup(pkgid); + if (info->pkgid == NULL) { + _LOGE("out of memory"); + __free_pkginfo((struct pkginfo *)info); + return -1; + } + + info->version = strdup(version); + if (info->version == NULL) { + _LOGE("out of memory"); + __free_pkginfo((struct pkginfo *)info); + return -1; + } + + info->type = strdup(type); + if (info->type == NULL) { + _LOGE("out of memory"); + __free_pkginfo((struct pkginfo *)info); + return -1; + } + + package = strdup(pkgid); + if (info->type == NULL) { + _LOGE("out of memory"); + __free_pkginfo((struct pkginfo *)info); + return -1; + } + + g_hash_table_insert(preload_rw_table, package, info); return 0; } +static int __delete_preload_rw_table(GHashTable *preload_rw_table, + const char *pkgid) +{ + gboolean removed; + removed = g_hash_table_remove(preload_rw_table, pkgid); + return removed ? 0 : -1; +} + static int __pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) { int ret = -1; @@ -326,13 +406,34 @@ static int __preload_rw_pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, { int ret; char *pkgid; + char *version; + char *type; GHashTable *preload_rw_table = (GHashTable *)user_data; ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); - retvm_if(ret < 0, -1, "pkgmgrinfo_pkginfo_get_pkgid failed"); + if (ret < 0) { + _LOGE("pkgmgrinfo_pkginfo_get_pkgid failed\n"); + return -1; + } + + ret = pkgmgrinfo_pkginfo_get_version(handle, &version); + if (ret < 0) { + _LOGE("pkgmgrinfo_pkginfo_get_version failed\n"); + return -1; + } + + ret = pkgmgrinfo_pkginfo_get_type(handle, &type); + if (ret < 0) { + _LOGE("pkgmgrinfo_pkginfo_get_type failed\n"); + return -1; + } + + ret = __insert_preload_rw_table(preload_rw_table, pkgid, version, type); + if (ret < 0) { + _LOGE("__insert_preload_rw_table failed\n"); + return -1; + } - ret = __insert_preload_rw_table(preload_rw_table, pkgid); - retvm_if(ret < 0, -1, "__insert_preload_rw_table fail\n"); return 0; } @@ -934,6 +1035,15 @@ static bool __find_pkgid_from_rw_list(const char *pkgid) return ret; } +static int __unzip_file_only_to_path(char *dest_path, char *unzip_to) +{ + const char *unzip_argv[] = { "/usr/bin/unzip", "-joXqq", + OPT_ZIP_FILE, dest_path, "-d", unzip_to, NULL }; + int ret = __xsystem(unzip_argv); + + return ret; +} + static int __unzip_files(char *dest_path) { const char *unzip_argv[] = { "/usr/bin/unzip", "-oXqq", @@ -943,10 +1053,10 @@ static int __unzip_files(char *dest_path) return ret; } -static int __install_preload_rw(const char *pkgid, const char *pkgtype, - GHashTable *preload_rw_table) +static int __install_preload_rw(const char *pkgid, const char *version, + const char *pkgtype, GHashTable *preload_rw_table) { - if (pkgid == NULL || pkgtype == NULL) + if (pkgid == NULL || version == NULL || pkgtype == NULL) return -1; int index; @@ -984,17 +1094,18 @@ static int __install_preload_rw(const char *pkgid, const char *pkgtype, } } - ret = __insert_preload_rw_table(preload_rw_table, pkgid); + ret = __insert_preload_rw_table(preload_rw_table, pkgid, version, + pkgtype); retvm_if(ret < 0, -1, "__insert_preload_rw_table fail\n"); __send_args_to_backend(pkgid, pkgtype, PKG_NEED_PRELOADRW_INSTALL); return ret; } -static void __convert_preload_to_rw(const char *pkgid, const char *pkgtype, - GHashTable *preload_rw_table) +static void __convert_preload_to_rw(const char *pkgid, const char *version, + const char *pkgtype, GHashTable *preload_rw_table) { - if (pkgid == NULL || pkgtype == NULL) + if (pkgid == NULL || version == NULL || pkgtype == NULL) return; char buf[BUF_SIZE] = {0}; int ret; @@ -1007,7 +1118,7 @@ static void __convert_preload_to_rw(const char *pkgid, const char *pkgtype, if (ret != 0) _LOG("Failed to remove directory[%s]\n", buf); - ret = __install_preload_rw(pkgid, pkgtype, preload_rw_table); + ret = __install_preload_rw(pkgid, version, pkgtype, preload_rw_table); if (ret != 0) { _LOG("Failed install preload rw pkg[%s]\n", pkgid); return; @@ -1067,7 +1178,7 @@ static int __find_deleted_pkgid_from_list(const char *source_file, if (!strncmp(update, "false", strlen("false"))) { if (is_preload_rw_pkg) { - __convert_preload_to_rw(pkgid, + __convert_preload_to_rw(pkgid, version, pkgtype, preload_rw_table); modified_pkg_cnt++; @@ -1083,7 +1194,7 @@ static int __find_deleted_pkgid_from_list(const char *source_file, if (is_preload_rw_pkg) { __send_args_to_backend(pkgid, pkgtype, PKG_NEED_RWUNINSTALL); - __install_preload_rw(pkgid, + __install_preload_rw(pkgid, version, pkgtype, preload_rw_table); } @@ -1117,6 +1228,7 @@ static int __get_pkgid_list_from_db_and_xml() _LOG("=======================================================\n"); int ret = 0; + char updated_preload_rw_list[BUF_SIZE]; /*get pkg info on pkgmgr db, it means old version */ ret = __find_preload_pkgid_from_db(PKGID_LIST_FROM_DB_FILE); @@ -1131,6 +1243,20 @@ static int __get_pkgid_list_from_db_and_xml() _LOG("Make pkgid list from xml success!! \n"); + + /*get preload rw pkg info on xml from opt.zip, it means new version */ + snprintf(updated_preload_rw_list, sizeof(updated_preload_rw_list), "%s", + ALL_PRELOAD_RW_PKG_LIST); + ret = __unzip_file_only_to_path(updated_preload_rw_list + 1, + (char *)PKGMGR_FOTA_PATH); + if (ret != 0) { + _LOG("Failed to unzip file from backup[%s]\n", + updated_preload_rw_list); + return ret; + } + + _LOG("Make rw pkgid list from xml success!! \n"); + return 0; } @@ -1177,6 +1303,7 @@ static int __process_rw_fota(GHashTable *preload_rw_table) char *list_version = NULL; char *db_stored_version = NULL; char *pkgtype = NULL; + char *version = NULL; pkgmgrinfo_pkginfo_h handle = NULL; int compare = PMINFO_VERSION_SAME; long total_time = 0; @@ -1224,45 +1351,36 @@ static int __process_rw_fota(GHashTable *preload_rw_table) if (compare != PMINFO_VERSION_NEW) { /* package version is not update on FOTA. */ - _LOG("pkg is not updated\n"); + _LOG("pkgid[%s] is not updated\n", pkgid); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); handle = NULL; - - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + - tv.tv_usec / 1000l; - total_time += (int)(endtime - starttime); - _LOG("finish request [time : %d ms]\n", - (int)(endtime - starttime)); - ret = __insert_preload_rw_table(preload_rw_table, pkgid); - if (ret < 0) { - _LOG("__insert_preload_rw_table fail\n"); - free(pkgid); - free(list_version); - fclose(fp); - return -1; - } FREE_AND_NULL(pkgid); FREE_AND_NULL(list_version); continue; } - _LOG("pkg is updated, need to upgrade\n"); + _LOG("pkgid[%s] is updated, need to upgrade " + "from version [%s] to [%s]\n", + pkgid, db_stored_version, list_version); } else { is_deleted_pkg = __check_deleted_pkg(preload_rw_table, pkgid); if (is_deleted_pkg) { _LOG("pkgid[%s] is deleted pkg\n", pkgid); + __delete_preload_rw_table(preload_rw_table, + pkgid); FREE_AND_NULL(pkgid); continue; } _LOG("pkgid[%s] is new\n", pkgid); } + version = __getvalue(buf, TOKEN_VERSION_STR, 1); pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); - __install_preload_rw(pkgid, pkgtype, preload_rw_table); + __install_preload_rw(pkgid, version, pkgtype, preload_rw_table); FREE_AND_NULL(pkgid); FREE_AND_NULL(pkgtype); + FREE_AND_NULL(version); if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle); @@ -1298,6 +1416,8 @@ static int __fill_preload_rw_table(GHashTable *preload_rw_table) FILE *fp; char buf[BUF_SIZE]; char *pkgid; + char *version; + char *type; fp = fopen(ALL_PRELOAD_RW_PKG_LIST, "r"); retvm_if(fp == NULL, -1, "Fail get : %s\n", ALL_PRELOAD_RW_PKG_LIST); @@ -1311,8 +1431,34 @@ static int __fill_preload_rw_table(GHashTable *preload_rw_table) continue; } - __insert_preload_rw_table(preload_rw_table, pkgid); + version = __getvalue(buf, TOKEN_VERSION_STR, 1); + if (version == NULL) { + _LOG("version is null\n"); + version = strdup(""); + if (version == NULL) { + _LOGE("out of memory\n"); + FREE_AND_NULL(pkgid); + continue; + } + } + + type = __getvalue(buf, TOKEN_TYPE_STR, 1); + if (type == NULL) { + _LOG("type is null\n"); + type = strdup(""); + if (type == NULL) { + _LOGE("out of memory\n"); + FREE_AND_NULL(version); + FREE_AND_NULL(pkgid); + continue; + } + } + + __insert_preload_rw_table(preload_rw_table, pkgid, version, + type); FREE_AND_NULL(pkgid); + FREE_AND_NULL(version); + FREE_AND_NULL(type); } fclose(fp); @@ -1343,7 +1489,7 @@ int main(int argc, char *argv[]) "__check_tmp_all_preload_rw_pkg_list is failed.\n"); preload_rw_table = g_hash_table_new_full( - g_str_hash, g_str_equal, free, NULL); + g_str_hash, g_str_equal, free, __free_pkginfo); if (__fill_preload_rw_table(preload_rw_table) < 0) { ret = __find_preload_rw_pkgid_from_db(preload_rw_table); retvm_if(ret < 0, -1, "__find_preload_rw_pkgid_from_db is failed\n"); -- 2.7.4 From fdd2deaa6b2ea6889ead29969d1ddef6cd24e993 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Fri, 22 May 2020 15:04:00 +0900 Subject: [PATCH 03/16] Convert relative path to absolute path for multi pkg install Change-Id: I42fd0540935c2538d5e982a8581e8a1ac71201d0 Signed-off-by: Sangyoon Jang --- src/pkg_cmd.c | 52 ++++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index ff3ec65..930c051 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -296,48 +296,37 @@ static int __app_return_cb(uid_t target_uid, int req_id, const char *pkg_type, static int __convert_to_absolute_path(pm_tool_args *data) { char abs[PATH_MAX] = {'\0'}; - char temp[PATH_MAX] = {'\0'}; + char *temp; char *ptr = NULL; int ret; - if (data->pkg_path[0] == '\0') { - printf("path is NULL\n"); + GList *list; + + ptr = realpath(data->pkg_path, abs); + if (ptr == NULL) { + printf("realpath fail: %d\n", errno); return -1; } - ret = snprintf(temp, PATH_MAX - 1, "%s", data->pkg_path); - if (ret < 0 || ret > PATH_MAX - 1) { + ret = snprintf(data->pkg_path, PKG_NAME_STRING_LEN_MAX - 1, "%s", abs); + if (ret < 0 || ret > PKG_NAME_STRING_LEN_MAX - 1) { printf("snprintf fail\n"); return -1; } - if (strchr(data->pkg_path, '/') == NULL) { - if (getcwd(abs, PKG_NAME_STRING_LEN_MAX - 1) == NULL) { - printf("getcwd() failed\n"); - return -1; - } - memset(data->pkg_path, '\0', PKG_NAME_STRING_LEN_MAX); - ret = snprintf(data->pkg_path, PKG_NAME_STRING_LEN_MAX - 1, - "%s/%s", abs, temp); - if (ret < 0 || ret > PKG_NAME_STRING_LEN_MAX - 1) { - printf("snprintf fail\n"); - return -1; - } - return 0; - } - if (strncmp(data->pkg_path, "./", 2) == 0) { - ptr = temp; - if (getcwd(abs, PKG_NAME_STRING_LEN_MAX - 1) == NULL) { - printf("getcwd() failed\n"); + + for (list = data->pkgs; list; list = list->next) { + ptr = realpath(list->data, abs); + if (ptr == NULL) { + printf("realpath fail: %d\n", errno); return -1; } - ptr = ptr + 2; - memset(data->pkg_path, '\0', PKG_NAME_STRING_LEN_MAX); - ret = snprintf(data->pkg_path, PKG_NAME_STRING_LEN_MAX - 1, - "%s/%s", abs, ptr); - if (ret < 0 || ret > PKG_NAME_STRING_LEN_MAX - 1) { - printf("snprintf fail\n"); + temp = list->data; + list->data = strdup(abs); + if (list->data == NULL) { + printf("out of memory\n"); return -1; } - return 0; + free(temp); } + return 0; } @@ -1693,6 +1682,7 @@ int main(int argc, char *argv[]) if (optarg) snprintf(data.pkg_path, sizeof(data.pkg_path), "%s", optarg); + __parse_multiple_pkgs(&data, argc, argv); ret = __convert_to_absolute_path(&data); if (ret == -1) { printf("conversion of relative path to absolute path failed\n"); @@ -1700,8 +1690,6 @@ int main(int argc, char *argv[]) return -1; } printf("path is %s\n", data.pkg_path); - - __parse_multiple_pkgs(&data, argc, argv); break; case 'X': /* old_tpk */ -- 2.7.4 From 954006a1451c7b9d32a5584168fc831a8efb29dc Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Fri, 22 May 2020 16:17:55 +0900 Subject: [PATCH 04/16] Fix error handling when multi pkg install Exit with PACKAGE_NOT_FOUND error when the input package does not exist. Change-Id: I5b7119012efa08b7022f8f6ea60171d868b87610 Signed-off-by: Sangyoon Jang --- src/pkg_cmd.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 930c051..b60eba2 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -646,6 +646,8 @@ static int __install_req_dispatcher(pm_tool_args *data, uid_t target_uid) { int ret; pkgmgr_client *pc; + GList *list; + char *pkg; if (data->pkg_path[0] == '\0') { __invalid_arg_handler(data); @@ -677,6 +679,13 @@ static int __install_req_dispatcher(pm_tool_args *data, uid_t target_uid) data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; if (access(data->pkg_path, F_OK) != 0) data->result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + for (list = data->pkgs; list; list = list->next) { + pkg = (char *)list->data; + if (access(pkg, F_OK) != 0) { + data->result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + break; + } + } pkgmgr_client_free(pc); return ret; } @@ -839,6 +848,8 @@ static int __mount_install_req_dispatcher(pm_tool_args *data, uid_t target_uid) { int ret; pkgmgr_client *pc; + GList *list; + char *pkg; if (data->pkg_path[0] == '\0') { __invalid_arg_handler(data); @@ -870,6 +881,13 @@ static int __mount_install_req_dispatcher(pm_tool_args *data, uid_t target_uid) data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; if (access(data->pkg_path, F_OK) != 0) data->result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + for (list = data->pkgs; list; list = list->next) { + pkg = (char *)list->data; + if (access(pkg, F_OK) != 0) { + data->result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + break; + } + } pkgmgr_client_free(pc); return ret; } @@ -1684,11 +1702,8 @@ int main(int argc, char *argv[]) "%s", optarg); __parse_multiple_pkgs(&data, argc, argv); ret = __convert_to_absolute_path(&data); - if (ret == -1) { + if (ret == -1) printf("conversion of relative path to absolute path failed\n"); - __free_data(&data); - return -1; - } printf("path is %s\n", data.pkg_path); break; -- 2.7.4 From cb3c60c683b891d695350bc7ed5e1ee5ff2e131e Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Fri, 22 May 2020 16:22:32 +0900 Subject: [PATCH 05/16] Print entire given package path list Change-Id: I7bdd6b8a0aa1e0c055c3197b5e375dc93e0629c1 Signed-off-by: Sangyoon Jang --- src/pkg_cmd.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index b60eba2..21d23b9 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -1548,6 +1548,7 @@ int main(int argc, char *argv[]) struct timeval tv; bool is_root_cmd = false; pm_tool_args data = { 0 }; + GList *list; /* Supported options */ /* Note: 'G' is reserved */ const char *short_options = "iurwmcgxCkaADL:lsd:p:t:n:T:e:M:X:Y:Z:qhGS"; @@ -1704,7 +1705,16 @@ int main(int argc, char *argv[]) ret = __convert_to_absolute_path(&data); if (ret == -1) printf("conversion of relative path to absolute path failed\n"); - printf("path is %s\n", data.pkg_path); + printf("path is "); + if (g_list_length(data.pkgs)) { + for (list = data.pkgs; list; + list = list->next) { + printf("%s ", (char *)list->data); + } + printf("\n"); + } else { + printf("%s\n", data.pkg_path); + } break; case 'X': /* old_tpk */ -- 2.7.4 From 916b5726c03c1f52aaed2e2c7c2055c3bf1e7661 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Fri, 29 May 2020 19:11:21 +0900 Subject: [PATCH 06/16] Fix memory leak preload_rw_list's element should be freed by __free_pkginfo() Change-Id: Ide3118860f4d2bd048964180b09dae380d63a8b9 Signed-off-by: Ilho Kim --- src/install_preload_pkg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/install_preload_pkg.c b/src/install_preload_pkg.c index d73894d..71e5542 100644 --- a/src/install_preload_pkg.c +++ b/src/install_preload_pkg.c @@ -206,7 +206,7 @@ static int _install_preload_pkg(const char *backend, const char *directory, strerror_r(errno, err_buf, sizeof(err_buf))); closedir(dir); - g_list_free_full(preload_rw_pkg_list, free); + g_list_free_full(preload_rw_pkg_list, __free_pkginfo); return -1; } } -- 2.7.4 From 51b31bb386b995c473b94fd75de02388cafe113a Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Mon, 1 Jun 2020 10:54:55 +0900 Subject: [PATCH 07/16] Fix allocation check logic correctly Change-Id: I144e4ce617584e82a8558056f4863d8c9ca206d6 Signed-off-by: Ilho Kim --- src/pkg_upgrade.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 115b8a0..a4ed1b8 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -358,7 +358,7 @@ static int __insert_preload_rw_table(GHashTable *preload_rw_table, } package = strdup(pkgid); - if (info->type == NULL) { + if (package == NULL) { _LOGE("out of memory"); __free_pkginfo((struct pkginfo *)info); return -1; -- 2.7.4 From d528d29801cce17e36eef6d981736928d5fad8c6 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Mon, 1 Jun 2020 11:27:23 +0900 Subject: [PATCH 08/16] Release version 0.6.1 Changes: - Remove preload-rw pkgs after install - Fix preload-rw update - Convert relative path to absolute path for multi pkg install - Fix error handling when multi pkg install - Print entire given package path list - Fix memory leak - Fix allocation check logic correctly Change-Id: Ic9149d4d8b55e900edebbc2e4fd841c3028150ee Signed-off-by: Ilho Kim --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 9e4fab7..ba745d8 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.0 +Version: 0.6.1 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 6d3a47135e451dc22a0edd77befba7c4583f08ba Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Tue, 2 Jun 2020 10:09:05 +0900 Subject: [PATCH 09/16] Fix definition of length of pkg path Change-Id: I01afa342c3b1867268269d02767584b412803da2 Signed-off-by: Junghyun Yeon --- src/pkg_cmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 21d23b9..b113333 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -306,8 +306,8 @@ static int __convert_to_absolute_path(pm_tool_args *data) printf("realpath fail: %d\n", errno); return -1; } - ret = snprintf(data->pkg_path, PKG_NAME_STRING_LEN_MAX - 1, "%s", abs); - if (ret < 0 || ret > PKG_NAME_STRING_LEN_MAX - 1) { + ret = snprintf(data->pkg_path, PATH_MAX - 1, "%s", abs); + if (ret < 0 || ret > PATH_MAX - 1) { printf("snprintf fail\n"); return -1; } -- 2.7.4 From 0b4714d1aea2ad7253ce28935b12d2a71704ba5a Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Tue, 2 Jun 2020 10:15:14 +0900 Subject: [PATCH 10/16] Release version 0.6.2 Changes: - Fix definition of length of pkg path Change-Id: Ia1d307fd8c14ad9b7021418f1059a60a6ddfcf68 Signed-off-by: Ilho Kim --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index ba745d8..8e17555 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.1 +Version: 0.6.2 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 495bcf6a040d47a2c850962eb9528b6ba5d05b07 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 18 Jun 2020 14:32:26 +0900 Subject: [PATCH 11/16] Add semicolon at the end of query Change-Id: I1dd6e73c331f070c68643178ef7ee3ac703472d7 Signed-off-by: Sangyoon Jang --- data/updates/upgrade_to_30002.sh.in | 2 +- data/updates/upgrade_to_30003.sh.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/updates/upgrade_to_30002.sh.in b/data/updates/upgrade_to_30002.sh.in index f77086f..c65763b 100644 --- a/data/updates/upgrade_to_30002.sh.in +++ b/data/updates/upgrade_to_30002.sh.in @@ -13,7 +13,7 @@ function migrate_cert_db() { function migrate_parser_db() { local dbpath=$1 - echo -e "ALTER TABLE package_app_app_control ADD visibility TEXT NOT NULL DEFAULT 'local-only'" | sqlite3 $dbpath + echo -e "ALTER TABLE package_app_app_control ADD visibility TEXT NOT NULL DEFAULT 'local-only';" | sqlite3 $dbpath echo "PRAGMA user_version=30002;" | sqlite3 $dbpath } diff --git a/data/updates/upgrade_to_30003.sh.in b/data/updates/upgrade_to_30003.sh.in index b33bdf6..525c6d7 100644 --- a/data/updates/upgrade_to_30003.sh.in +++ b/data/updates/upgrade_to_30003.sh.in @@ -13,7 +13,7 @@ function migrate_cert_db() { function migrate_parser_db() { local dbpath=$1 - echo -e "ALTER TABLE package_app_app_control ADD app_control_id TEXT NOT NULL DEFAULT 'no-name-app-control'" | sqlite3 $dbpath + echo -e "ALTER TABLE package_app_app_control ADD app_control_id TEXT NOT NULL DEFAULT 'no-name-app-control';" | sqlite3 $dbpath echo "PRAGMA user_version=30003;" | sqlite3 $dbpath } -- 2.7.4 From 193ff55f0232786de15a925ef5f9daee3ad2d7f1 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 18 Jun 2020 14:46:19 +0900 Subject: [PATCH 12/16] Release version 0.6.3 Changes: - Add semicolon at the end of query Change-Id: Ib48c69e01f6dccf3b1aa4ca8e932c330c9fccd0f Signed-off-by: Sangyoon Jang --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 8e17555..caeed09 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.2 +Version: 0.6.3 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From deab067a459e37cda5e1a84ae058fd465d9f2ff0 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 4 Dec 2019 15:13:41 +0900 Subject: [PATCH 13/16] Separate pkg related tools into directory hierachy Change-Id: Ib62eae0ca92796c33f5a2a55953f7187bd3a3f72 Signed-off-by: Junghyun Yeon --- CMakeLists.txt | 14 +++++++------- src/{ => install_preload_pkg}/install_preload_pkg.c | 0 src/{ => pkg_cleardata}/pkg_cleardata.c | 0 src/{ => pkg_getsize}/pkg_getsize.c | 0 src/{ => pkg_upgrade/include}/pkg_upgrade.h | 0 src/{ => pkg_upgrade}/pkg_upgrade.c | 2 +- src/{ => pkgcmd}/delta.c | 0 src/{ => pkgcmd}/delta.h | 0 src/{ => pkgcmd}/pkg_cmd.c | 0 src/{ => pkginfo}/pkg_info.c | 0 src/{ => rsc-slice}/pkg_rsc_slice.c | 0 11 files changed, 8 insertions(+), 8 deletions(-) rename src/{ => install_preload_pkg}/install_preload_pkg.c (100%) rename src/{ => pkg_cleardata}/pkg_cleardata.c (100%) rename src/{ => pkg_getsize}/pkg_getsize.c (100%) rename src/{ => pkg_upgrade/include}/pkg_upgrade.h (100%) rename src/{ => pkg_upgrade}/pkg_upgrade.c (99%) rename src/{ => pkgcmd}/delta.c (100%) rename src/{ => pkgcmd}/delta.h (100%) rename src/{ => pkgcmd}/pkg_cmd.c (100%) rename src/{ => pkginfo}/pkg_info.c (100%) rename src/{ => rsc-slice}/pkg_rsc_slice.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e1a5471..c099b48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,31 +35,31 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE") SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE") -ADD_EXECUTABLE(pkgcmd src/pkg_cmd.c src/delta.c) +ADD_EXECUTABLE(pkgcmd src/pkgcmd/pkg_cmd.c src/pkgcmd/delta.c) TARGET_LINK_LIBRARIES(pkgcmd ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkgcmd DESTINATION bin) -ADD_EXECUTABLE(pkginfo src/pkg_info.c) +ADD_EXECUTABLE(pkginfo src/pkginfo/pkg_info.c) TARGET_LINK_LIBRARIES(pkginfo ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkginfo DESTINATION bin) -ADD_EXECUTABLE(pkg_getsize src/pkg_getsize.c) +ADD_EXECUTABLE(pkg_getsize src/pkg_getsize/pkg_getsize.c) TARGET_LINK_LIBRARIES(pkg_getsize ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkg_getsize DESTINATION bin) -ADD_EXECUTABLE(pkg_cleardata src/pkg_cleardata.c) +ADD_EXECUTABLE(pkg_cleardata src/pkg_cleardata/pkg_cleardata.c) TARGET_LINK_LIBRARIES(pkg_cleardata ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkg_cleardata DESTINATION bin) -ADD_EXECUTABLE(install_preload_pkg src/install_preload_pkg.c) +ADD_EXECUTABLE(install_preload_pkg src/install_preload_pkg/install_preload_pkg.c) TARGET_LINK_LIBRARIES(install_preload_pkg ${pkgs_test_LDFLAGS}) INSTALL(TARGETS install_preload_pkg DESTINATION bin) -ADD_EXECUTABLE(pkg_upgrade src/pkg_upgrade.c) +ADD_EXECUTABLE(pkg_upgrade src/pkg_upgrade/pkg_upgrade.c) TARGET_LINK_LIBRARIES(pkg_upgrade ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkg_upgrade DESTINATION bin) -ADD_EXECUTABLE(rsc-slice src/pkg_rsc_slice.c) +ADD_EXECUTABLE(rsc-slice src/rsc-slice/pkg_rsc_slice.c) TARGET_LINK_LIBRARIES(rsc-slice ${pkgs_test_LDFLAGS}) INSTALL(TARGETS rsc-slice DESTINATION bin) diff --git a/src/install_preload_pkg.c b/src/install_preload_pkg/install_preload_pkg.c similarity index 100% rename from src/install_preload_pkg.c rename to src/install_preload_pkg/install_preload_pkg.c diff --git a/src/pkg_cleardata.c b/src/pkg_cleardata/pkg_cleardata.c similarity index 100% rename from src/pkg_cleardata.c rename to src/pkg_cleardata/pkg_cleardata.c diff --git a/src/pkg_getsize.c b/src/pkg_getsize/pkg_getsize.c similarity index 100% rename from src/pkg_getsize.c rename to src/pkg_getsize/pkg_getsize.c diff --git a/src/pkg_upgrade.h b/src/pkg_upgrade/include/pkg_upgrade.h similarity index 100% rename from src/pkg_upgrade.h rename to src/pkg_upgrade/include/pkg_upgrade.h diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c similarity index 99% rename from src/pkg_upgrade.c rename to src/pkg_upgrade/pkg_upgrade.c index a4ed1b8..1b859d1 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade/pkg_upgrade.c @@ -38,7 +38,7 @@ #include #include #include -#include "pkg_upgrade.h" +#include "include/pkg_upgrade.h" #include diff --git a/src/delta.c b/src/pkgcmd/delta.c similarity index 100% rename from src/delta.c rename to src/pkgcmd/delta.c diff --git a/src/delta.h b/src/pkgcmd/delta.h similarity index 100% rename from src/delta.h rename to src/pkgcmd/delta.h diff --git a/src/pkg_cmd.c b/src/pkgcmd/pkg_cmd.c similarity index 100% rename from src/pkg_cmd.c rename to src/pkgcmd/pkg_cmd.c diff --git a/src/pkg_info.c b/src/pkginfo/pkg_info.c similarity index 100% rename from src/pkg_info.c rename to src/pkginfo/pkg_info.c diff --git a/src/pkg_rsc_slice.c b/src/rsc-slice/pkg_rsc_slice.c similarity index 100% rename from src/pkg_rsc_slice.c rename to src/rsc-slice/pkg_rsc_slice.c -- 2.7.4 From dc9d5030e7a8303086fe8e10b02db3142d7f2c4b Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 13 Jul 2020 14:23:08 +0900 Subject: [PATCH 14/16] Fix realpath buffer overflow issue Change-Id: I076d1c238f4fb942d09fc32b29e6d751d4be50fa Signed-off-by: Sangyoon Jang --- src/pkgcmd/pkg_cmd.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/pkgcmd/pkg_cmd.c b/src/pkgcmd/pkg_cmd.c index b113333..75e1ef4 100644 --- a/src/pkgcmd/pkg_cmd.c +++ b/src/pkgcmd/pkg_cmd.c @@ -295,31 +295,26 @@ static int __app_return_cb(uid_t target_uid, int req_id, const char *pkg_type, static int __convert_to_absolute_path(pm_tool_args *data) { - char abs[PATH_MAX] = {'\0'}; + char *abs; char *temp; - char *ptr = NULL; int ret; GList *list; - ptr = realpath(data->pkg_path, abs); - if (ptr == NULL) { + abs = realpath(data->pkg_path, NULL); + if (abs == NULL) { printf("realpath fail: %d\n", errno); return -1; } ret = snprintf(data->pkg_path, PATH_MAX - 1, "%s", abs); + free(abs); if (ret < 0 || ret > PATH_MAX - 1) { printf("snprintf fail\n"); return -1; } for (list = data->pkgs; list; list = list->next) { - ptr = realpath(list->data, abs); - if (ptr == NULL) { - printf("realpath fail: %d\n", errno); - return -1; - } temp = list->data; - list->data = strdup(abs); + list->data = realpath(list->data, NULL); if (list->data == NULL) { printf("out of memory\n"); return -1; -- 2.7.4 From e99e0f31c4ee936ad4e9f889cc3953827d9238bd Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 30 Jun 2020 14:11:50 +0900 Subject: [PATCH 15/16] Remove directories of preload-rw package removed by user In some cases, there may be directories by upgrade module. Change-Id: I63f867c8bdd3a7f756f83a37b52581364edad4c6 Signed-off-by: Sangyoon Jang --- src/pkg_upgrade/pkg_upgrade.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/pkg_upgrade/pkg_upgrade.c b/src/pkg_upgrade/pkg_upgrade.c index 1b859d1..0b0277d 100644 --- a/src/pkg_upgrade/pkg_upgrade.c +++ b/src/pkg_upgrade/pkg_upgrade.c @@ -43,6 +43,9 @@ #include #define USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RO_PACKAGES) +#define OPT_USR_MANIFEST_DIRECTORY tzplatform_getenv(TZ_SYS_RW_PACKAGES) +#define RW_PKG_DIRECTORY tzplatform_getenv(TZ_SYS_RW_APP) +#define SKEL_DIRECTORY tzplatform_mkpath(TZ_SYS_ETC, "skel/apps_rw") #define PKGMGR_FOTA_PATH tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ "pkgmgr/fota") @@ -1294,6 +1297,31 @@ static int __process_ro_fota(GHashTable *preload_rw_table) return 0; } +static void __remove_pkg_directories(const char *pkgid) +{ + int i; + int ret; + char buf[BUF_SIZE]; + const char *base_dirs[] = { + OPT_USR_MANIFEST_DIRECTORY, + RW_PKG_DIRECTORY, + SKEL_DIRECTORY, + NULL + }; + + for (i = 0; base_dirs[i] != NULL; i++) { + ret = snprintf(buf, sizeof(buf), "%s/%s", base_dirs[i], pkgid); + if (ret < 0 || ret > sizeof(buf)) { + printf("snprintf fail\n"); + continue; + } + if (!access(buf, F_OK)) { + if (remove_directory(buf)) + _LOGE("failed to remove directory: %s", buf); + } + } +} + static int __process_rw_fota(GHashTable *preload_rw_table) { FILE *fp = NULL; @@ -1368,6 +1396,10 @@ static int __process_rw_fota(GHashTable *preload_rw_table) _LOG("pkgid[%s] is deleted pkg\n", pkgid); __delete_preload_rw_table(preload_rw_table, pkgid); + /* maybe there are pkg directories which are + * extracted from opt.zip by FOTA + */ + __remove_pkg_directories(pkgid); FREE_AND_NULL(pkgid); continue; } -- 2.7.4 From 3560a76d124fe451c1ffdd4d9ca9c0d53df02dee Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 16 Jul 2020 12:51:02 +0900 Subject: [PATCH 16/16] Release version 0.6.4 Changes: - Add semicolon at the end of query - Separate pkg related tools into directory hierachy - Fix realpath buffer overflow issue - Remove directories of preload-rw package removed by user Change-Id: I105f15f1ca73f2d187973bca15513557510b529e Signed-off-by: Sangyoon Jang --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index caeed09..9de69da 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.6.3 +Version: 0.6.4 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4