Add tizen-manifest.xml to crash-reports 03/225403/23
authorWiktor Gerstenstein <w.gerstenste@partner.samsung.com>
Wed, 19 Feb 2020 16:37:21 +0000 (17:37 +0100)
committerWiktor Gerstenstein <w.gerstenste@partner.samsung.com>
Fri, 3 Apr 2020 22:47:50 +0000 (00:47 +0200)
Change-Id: I6fc7f723ad33cd825e2c5f85b42c7b134a0f1f8b

packaging/crash-worker.manifest
packaging/crash-worker.spec
src/crash-manager/crash-manager.c
src/crash-manager/crash-manager.h
tests/system/CMakeLists.txt
tests/system/copy_tizen_manifest/copy_tizen_manifest.sh.template [new file with mode: 0644]

index 1ed60c3..0b9ab26 100644 (file)
@@ -21,6 +21,7 @@
                <filesystem path="/usr/lib/crash-worker/system-tests/report_type_info/report_type_info.sh" label="User::Shell" exec_label="User::Shell"/>
                <filesystem path="/usr/lib/crash-worker/system-tests/without_core/without_core.sh" label="User::Shell" exec_label="User::Shell"/>
                <filesystem path="/usr/lib/crash-worker/system-tests/crash_root_path/crash_root_path.sh" label="User::Shell" exec_label="User::Shell"/>
+               <filesystem path="/usr/lib/crash-worker/system-tests/copy_tizen_manifest/copy_tizen_manifest.sh" label="User::Shell" exec_label="User::Shell"/>
                <filesystem path="/usr/lib/crash-worker/system-tests/utils/btee" label="User::Shell" exec_label="User::Shell"/>
                <filesystem path="/usr/lib/crash-worker/system-tests/utils/kenny" label="User::Shell" exec_label="User::Shell"/>
                <filesystem path="/usr/lib/crash-worker/system-tests/utils/minicore-utils.sh" label="User::Shell" exec_label="User::Shell"/>
index 5717544..58e9041 100644 (file)
@@ -245,6 +245,7 @@ mkdir -p %{buildroot}%{crash_temp}
 %{_libdir}/crash-worker/system-tests/check_minicore_mem/cp.sh
 %{_libdir}/crash-worker/system-tests/cmp_backtraces/cmp_backtraces.sh
 %{_libdir}/crash-worker/system-tests/cmp_backtraces/cp.sh
+%{_libdir}/crash-worker/system-tests/copy_tizen_manifest/copy_tizen_manifest.sh
 %{_libdir}/crash-worker/system-tests/crash_root_path/crash_root_path.sh
 %{_libdir}/crash-worker/system-tests/critical_process/critical_process.sh
 %{_libdir}/crash-worker/system-tests/dbus_notify/dbus_notify.sh
index 0f4cdae..682da09 100644 (file)
@@ -59,6 +59,7 @@
 #define CRASH_TEMP_SUBDIR    "/temp/"
 #define CRASH_PATH_SUBDIR    "/dump/"
 #define LIVE_PATH_SUBDIR     "/livedump/"
+#define APP_PATH_SUBDIR      "/app/"
 
 #define WAIT_FOR_OPT_TIMEOUT_SEC 60
 
@@ -152,6 +153,30 @@ out_free:
        return have_pkgid && *pkgid != NULL;
 }
 
+static char *get_app_root_path(const char *pkgid)
+{
+       char *root_path = NULL;
+       pkgmgrinfo_pkginfo_h handle;
+       int ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
+       if (ret != PMINFO_R_OK)
+               return NULL;
+
+       ret = pkgmgrinfo_pkginfo_get_root_path(handle, &root_path);
+       if (ret != PMINFO_R_OK) {
+               _E("Unable to get app root path for %s", pkgid);
+               pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+               return NULL;
+       }
+
+       char *path = root_path ? strdup(root_path) : NULL;
+       if (path == NULL && root_path != NULL)
+               _E("Failed to get app root path for %s. strdup() error: %m", pkgid);
+
+       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+
+       return path;
+}
+
 static bool set_appinfo(char *exepath, char **appid, char **pkgid)
 {
        char *a = NULL, *p = NULL;
@@ -381,6 +406,8 @@ bool set_crash_info(struct crash_info *cinfo)
         || -1 == asprintf(&cinfo->result_path, "%s/%s%s",        crash_dump_path, cinfo->name, suffix))
                goto out_oom;
 
+       if (is_app)
+               cinfo->app_root_path = get_app_root_path(cinfo->pkgid);
 
        if (mkdir(cinfo->pfx, 0775) < 0) {
                _E("Failed to mkdir %s: %m", cinfo->pfx);
@@ -689,6 +716,47 @@ static bool process_continue(const pid_t pid)
        return kill_pid(pid, SIGCONT, false);
 }
 
+static bool copy_application_data(struct crash_info *cinfo, const char *filename)
+{
+       bool is_ok = false;
+       char *src_filepath = NULL;
+       char *dst_filepath = NULL;
+       char *dst_dirpath = NULL;
+
+       if (cinfo->app_root_path &&
+               (asprintf(&src_filepath, "%s/%s", cinfo->app_root_path, filename) == -1
+               || asprintf(&dst_filepath, "%s%s%s", cinfo->pfx, APP_PATH_SUBDIR, filename) == -1)) {
+               _E("Failed to asprintf for %s file in %s path", filename,
+                               !src_filepath ? cinfo->app_root_path : cinfo->pfx);
+               goto out;
+       }
+
+       if (!src_filepath || access(src_filepath, F_OK))
+               goto out;
+
+       dst_dirpath = strdup(dst_filepath);
+       if (dst_dirpath == NULL) {
+               _E("Failed to copy dst_filepath: %s", dst_filepath);
+               goto out;
+       }
+       dst_dirpath = dirname(dst_dirpath);
+       if (mkdir(dst_dirpath, 0775) < 0 && errno != EEXIST) {
+               _E("Failed to mkdir %s (%m)", dst_dirpath);
+               goto out;
+       }
+
+       if (copy_file(dst_filepath, src_filepath))
+               _E("Cannot copy %s file to: %s", src_filepath, dst_filepath);
+       else
+               is_ok = true;
+out:
+       free(src_filepath);
+       free(dst_filepath);
+       free(dst_dirpath);
+
+       return is_ok;
+}
+
 static bool execute_crash_modules(struct crash_info *cinfo)
 {
        int exit_code = 0;
@@ -710,6 +778,7 @@ static bool execute_crash_modules(struct crash_info *cinfo)
        }
 
        execute_crash_stack(cinfo, NULL);
+       (void)copy_application_data(cinfo, "tizen-manifest.xml"); // manifest.xml is optional because not every application has that.
        if (cinfo->livedump)
                process_continue(cinfo->pid_info);
 
@@ -1004,6 +1073,7 @@ static void free_crash_info(struct crash_info *cinfo)
        free(cinfo->cmd_path);
        free(cinfo->temp_dir);
        free(cinfo->result_path);
+       free(cinfo->app_root_path);
        free(cinfo->pfx);
        free(cinfo->info_path);
        free(cinfo->core_path);
@@ -1027,7 +1097,8 @@ void crash_info_init(struct crash_info *cinfo)
        cinfo->cmd_line = NULL;
        cinfo->cmd_path = NULL;
        cinfo->temp_dir = NULL;
-       cinfo->pfx =  NULL;
+       cinfo->app_root_path = NULL;
+       cinfo->pfx = NULL;
        cinfo->result_path = NULL;
        cinfo->info_path = NULL;
        cinfo->core_path = NULL;
index 1e26941..6e66af1 100644 (file)
@@ -38,6 +38,7 @@ struct crash_info {
        char *cmd_path;
        char *temp_dir;
        char *name;
+       char *app_root_path;
        char *result_path;
        char *pfx;
        char *info_path;
index c17c517..37fe6ff 100644 (file)
@@ -19,6 +19,7 @@ endmacro()
 
 configure_test("check_minicore_mem")
 configure_test("cmp_backtraces" "cp")
+configure_test("copy_tizen_manifest")
 configure_test("crash_root_path")
 configure_test("critical_process")
 configure_test("dbus_notify")
diff --git a/tests/system/copy_tizen_manifest/copy_tizen_manifest.sh.template b/tests/system/copy_tizen_manifest/copy_tizen_manifest.sh.template
new file mode 100644 (file)
index 0000000..2e52e6e
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+# Check the report for tizen-manifest.xml file
+
+if [ -z "${CRASH_WORKER_SYSTEM_TESTS}" ]; then
+    CRASH_WORKER_SYSTEM_TESTS="@CRASH_SYSTEM_TESTS_PATH@"
+fi
+
+. ${CRASH_WORKER_SYSTEM_TESTS}/utils/minicore-utils.sh
+
+CRASH_MANAGER_CONF=/etc/crash-manager.conf
+
+clean_crash_dump
+clean_temp
+
+pid=0
+psout=$(ps -ewo pid,cmd | awk -v OFS=$' ' '$cmd ~ "/apps/" || $cmd ~ "org."')
+if [ $(wc -l <<< "$psout") -le 1 ]; then
+       skip "no run application found"
+fi
+
+while IFS=$' ' read -r pidd cmd
+do
+       cmd=${cmd%%[[:space:]]*}
+       for VARIABLE in 1 2 #   path levels count to check
+       do
+               cmd=$(dirname $cmd)
+               if [ -f "$cmd/tizen-manifest.xml" ]; then
+                       pid=$pidd
+                       break 2
+               fi
+       done
+done <<< "$psout"
+
+test $pid -ne 0 || fail "no running application has a tizen-manifest file"
+
+kill -6 $pid
+
+sleep 2
+
+wait_for_app crash-manager
+
+pushd ${CRASH_DUMP_PATH}
+name=$(echo *_${pid}_*)
+name=${name%.zip}
+
+test -f "${name}.zip" || fail "crash report not found"
+unzip "${name}.zip" || fail "unable to extract archive"
+
+test -s "${name}/app/tizen-manifest.xml" || fail "tizen-manifest corrupt or not found"
+
+for i in ${CRASH_TEMP_PATH}/*; do
+    test -a "${i}" && fail "temp directory not cleaned up"
+done
+
+exit_ok