Fix after change of default coredump format 83/200383/4
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>
Wed, 27 Feb 2019 09:45:45 +0000 (10:45 +0100)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Wed, 27 Feb 2019 09:48:22 +0000 (10:48 +0100)
* Update system tests
* Fix remove coredump if DumpCore is set to 0

Change-Id: Ic0254f8592b1951b72866ae588fe83954646c0b7

src/crash-manager/crash-manager.c
tests/system/check_minicore_mem/check_minicore_mem.sh.template
tests/system/cmp_backtraces/cmp_backtraces.sh.template
tests/system/crash_root_path/crash_root_path.sh.template
tests/system/time_test/time_test.sh.template
tests/system/utils/minicore-utils.sh
tests/system/without_core/without_core.sh.template

index dee6e62..cbe4b65 100644 (file)
@@ -15,7 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
@@ -33,6 +32,7 @@
 #include <sys/vfs.h>
 #include <fcntl.h>
 #include <gio/gio.h>
+#include <dirent.h>
 #include <iniparser.h>
 #include <tzplatform_config.h>
 #include <pkgmgr-info.h>
@@ -712,6 +712,38 @@ static void save_so_info(const struct crash_info *cinfo)
        get_and_save_so_info(maps_path, so_info_path);
 }
 
+/* remove a file whose name begins with 'beggining_of_name'. This is needed
+ * when we don't want to include coredump in report, but we only know the
+ * beginning of the coredump file name. */
+static int remove_file_in_dir(const char *directory, const char *beginning_of_name)
+{
+       int ret = -1;
+       int errno_unlink = 0;
+
+       DIR *dir = opendir(directory);
+       if (dir == NULL)
+               goto end;
+
+       int dir_fd = dirfd(dir);
+       if (dir_fd == -1) {
+               closedir(dir);
+               goto end;
+       }
+
+       struct dirent* file_info;
+       while ((file_info = readdir(dir)) != NULL) {
+               if (strstr(file_info->d_name, beginning_of_name) == file_info->d_name) {
+                       ret = unlinkat(dir_fd, file_info->d_name, 0);
+                       errno_unlink = errno;
+                       break;
+               }
+       }
+       closedir(dir);
+       errno = errno_unlink; /* for %m */
+end:
+       return ret;
+}
+
 // These macros are used in execute_minicoredump() and execute_crash_stack()
 #define SNPRINTF_OR_EXIT_W(name, format, member) if (snprintf(name##_str, sizeof(name##_str), format, cinfo->member) < 0) goto out;
 #define SNPRINTF_OR_EXIT(name, format) SNPRINTF_OR_EXIT_W(name, format, name##_info)
@@ -768,16 +800,7 @@ static int execute_minicoredump(struct crash_info *cinfo)
        /* Minicoredumper must be executed to dump at least PRSTATUS for
           other tools, coredump, however, might have been disabled. */
        if (!dump_core) {
-               int ret = -1;
-               int errno_unlink = 0;
-               int dirfd = open(cinfo->pfx, O_DIRECTORY);
-               if (dirfd != -1) {
-                       ret = unlinkat(dirfd, coredump_name, 0);
-                       errno_unlink = errno;
-                       close(dirfd);
-                       errno = errno_unlink; /* for %m below */
-               }
-
+               ret = remove_file_in_dir(cinfo->pfx, coredump_name);
                if (ret != 0)
                        _E("Saving core disabled - removing coredump %s/%s failed: %m",
                           cinfo->pfx, coredump_name);
index 5ad2382..bdfeb11 100755 (executable)
@@ -16,7 +16,7 @@ MEM_LIMIT='102400'
 save_core_pattern
 
 echo "|${CRASH_WORKER_SYSTEM_TESTS}/check_minicore_mem/cp.sh %p %u %g %s %t %h %e ${BASE_DIR} ${CORE_MINI} ${MEM_LIMIT}" > /proc/sys/kernel/core_pattern
-rm -f ${BASE_DIR}/${CORE_MINI}
+rm -f ${BASE_DIR}/${CORE_MINI}*
 
 {
     ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny &
@@ -28,8 +28,9 @@ sleep 2
 
 restore_core_pattern
 
-wait_for_file ${BASE_DIR}/${CORE_MINI}
+wait_for_file ${BASE_DIR}/${CORE_MINI}.tar
 
+untar_file ${BASE_DIR} ${CORE_MINI}.tar
 RESULT=`gdb ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny ${BASE_DIR}/${CORE_MINI} --batch -ex "thread apply all bt"`
 
 check "MAGICNAME.*id=.*kenny.cpp:31"
index ecf3d77..8a579ef 100755 (executable)
@@ -24,7 +24,7 @@ save_core_pattern
 
 echo "|${CRASH_WORKER_SYSTEM_TESTS}/cmp_backtraces/cp.sh %p %u %g %s %t %h %e ${BASE_DIR} ${CORE_ORIG} ${CORE_MINI}" > /proc/sys/kernel/core_pattern
 
-rm -f ${BASE_DIR}/${CORE_MINI}
+rm -f ${BASE_DIR}/${CORE_MINI}*
 rm -f ${BASE_DIR}/${CORE_ORIG}
 rm -f ${BASE_DIR}/${THREADS_MINI}
 rm -f ${BASE_DIR}/${THREADS_ORIG}
@@ -40,9 +40,11 @@ sleep 2
 restore_core_pattern
 
 wait_for_file ${BASE_DIR}/${CORE_ORIG}
-wait_for_file ${BASE_DIR}/${CORE_MINI}
+wait_for_file ${BASE_DIR}/${CORE_MINI}.tar
 wait_for_app minicoredumper
 
+untar_file ${BASE_DIR} ${CORE_MINI}.tar
+
 gdb ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny ${BASE_DIR}/${CORE_ORIG}  -ex "thread apply all bt" -ex "q" 2> /dev/null | grep -e '^#' > ${BASE_DIR}/${THREADS_ORIG}
 gdb ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny ${BASE_DIR}/${CORE_MINI}  -ex "thread apply all bt" -ex "q" 2> /dev/null | grep -e '^#' > ${BASE_DIR}/${THREADS_MINI}
 
index 625ae36..4afbad8 100644 (file)
@@ -45,7 +45,7 @@ if ! unzip kenny*zip > /dev/null; then
 fi
 popd
 
-check_file_exists coredump
+check_file_exists coredump.tar
 check_file_exists info
 check_file_exists so_info
 check_file_exists log
index 5df1cee..596b3cc 100755 (executable)
@@ -24,7 +24,7 @@ save_core_pattern
 
 echo "|${CRASH_WORKER_SYSTEM_TESTS}/time_test/cp.sh %p %u %g %s %t %h %e ${TEMP_DIR} ${CORE_ORIG} ${CORE_MINI} ${MINICORE_TIME_FILE}" > /proc/sys/kernel/core_pattern
 
-rm -f ${TEMP_DIR}/${CORE_MINI}
+rm -f ${TEMP_DIR}/${CORE_MINI}*
 rm -f ${TEMP_DIR}/${CORE_ORIG}
 rm -f ${TEMP_DIR}/${CORE_ORIG}
 rm -f ${TEMP_DIR}/${MINICORE_TIME_FILE}
index 36e6d59..a00e277 100644 (file)
@@ -130,3 +130,9 @@ function backup_file {
 function restore_file {
     mv ${1}.backup ${1}
 }
+
+function untar_file {
+    pushd ${1}
+    tar xf ${2}
+    popd
+}
index 5e99dba..a1d5d86 100644 (file)
@@ -35,7 +35,7 @@ if ! unzip kenny*zip > /dev/null; then
 fi
 popd
 
-if ls ${CRASH_DUMP_PATH}/kenny*/kenny*.coredump > /dev/null; then
+if ls ${CRASH_DUMP_PATH}/kenny*/kenny*.coredump.tar > /dev/null; then
     exit_with_code "FAIL: coredump file exists" 1
 fi