Jiří Moskovčák 07ee5f
commit a6daecbb32cf5fb0f71bdc14dddd35e7422dd4bb
Jiří Moskovčák 07ee5f
Author: Karel Klic <kklic@redhat.com>
Jiří Moskovčák 07ee5f
Date:   Tue Apr 13 14:57:20 2010 +0200
Jiří Moskovčák 07ee5f
Jiří Moskovčák 07ee5f
    do not catch perl/python crashes when the script is not of known package origin
Jiří Moskovčák 07ee5f
Jiří Moskovčák 07ee5f
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
Jiří Moskovčák 07ee5f
index a0ead47..5c9ecb7 100644
Jiří Moskovčák 07ee5f
--- a/src/Daemon/MiddleWare.cpp
Jiří Moskovčák 07ee5f
+++ b/src/Daemon/MiddleWare.cpp
Jiří Moskovčák 07ee5f
@@ -594,43 +594,51 @@ void LoadOpenGPGPublicKey(const char* key)
Jiří Moskovčák 07ee5f
 }
Jiří Moskovčák 07ee5f
 
Jiří Moskovčák 07ee5f
 /**
Jiří Moskovčák 07ee5f
- * Get a package name from executable name and save
Jiří Moskovčák 07ee5f
- * package description to particular debugdump directory of a crash.
Jiří Moskovčák 07ee5f
- * @param pExecutable A name of crashed application.
Jiří Moskovčák 07ee5f
- * @param pDebugDumpDir A debugdump dir containing all necessary data.
Jiří Moskovčák 07ee5f
- * @return It return results of operation. See mw_result_t.
Jiří Moskovčák 07ee5f
+ * Returns the first full path argument in the command line or NULL.
Jiří Moskovčák 07ee5f
+ * Skips options are in form "-XXX".
Jiří Moskovčák 07ee5f
+ * Caller must delete the returned string using free().
Jiří Moskovčák 07ee5f
  */
Jiří Moskovčák 07ee5f
 static char *get_argv1_if_full_path(const char* cmdline)
Jiří Moskovčák 07ee5f
 {
Jiří Moskovčák 07ee5f
-    char *argv1 = (char*) strchr(cmdline, ' ');
Jiří Moskovčák 07ee5f
+    const char *argv1 = strpbrk(cmdline, " \t");
Jiří Moskovčák 07ee5f
     while (argv1 != NULL)
Jiří Moskovčák 07ee5f
     {
Jiří Moskovčák 07ee5f
         /* we found space in cmdline, so it might contain
Jiří Moskovčák 07ee5f
          * path to some script like:
Jiří Moskovčák 07ee5f
          * /usr/bin/python [-XXX] /usr/bin/system-control-network
Jiří Moskovčák 07ee5f
          */
Jiří Moskovčák 07ee5f
-        argv1++;
Jiří Moskovčák 07ee5f
-        if (*argv1 == '-')
Jiří Moskovčák 07ee5f
+        argv1++; /* skip the space */
Jiří Moskovčák 07ee5f
+        if (*argv1 == '-') /* skip arguments */
Jiří Moskovčák 07ee5f
         {
Jiří Moskovčák 07ee5f
             /* looks like -XXX in "perl -XXX /usr/bin/script.pl", skip */
Jiří Moskovčák 07ee5f
-            argv1 = strchr(argv1, ' ');
Jiří Moskovčák 07ee5f
+            argv1 = strpbrk(argv1, " \t");
Jiří Moskovčák 07ee5f
             continue;
Jiří Moskovčák 07ee5f
         }
Jiří Moskovčák 07ee5f
-        /* if the string following the space doesn't start
Jiří Moskovčák 07ee5f
-         * with '/' it's probably not a full path to script
Jiří Moskovčák 07ee5f
-         * and we can't use it to determine the package name
Jiří Moskovčák 07ee5f
-         */
Jiří Moskovčák 07ee5f
-        if (*argv1 != '/')
Jiří Moskovčák 07ee5f
+        else if (*argv1 == ' ' || *argv1 == '\t') /* skip multiple spaces */
Jiří Moskovčák 07ee5f
+            continue;
Jiří Moskovčák 07ee5f
+        else if (*argv1 != '/')
Jiří Moskovčák 07ee5f
         {
Jiří Moskovčák 07ee5f
-            return NULL;
Jiří Moskovčák 07ee5f
+            /* if the string following the space doesn't start
Jiří Moskovčák 07ee5f
+             * with '/' it's probably not a full path to script
Jiří Moskovčák 07ee5f
+             * and we can't use it to determine the package name
Jiří Moskovčák 07ee5f
+             */
Jiří Moskovčák 07ee5f
+            break;
Jiří Moskovčák 07ee5f
         }
Jiří Moskovčák 07ee5f
+
Jiří Moskovčák 07ee5f
+        /* cut the rest of cmdline arguments */
Jiří Moskovčák 07ee5f
         int len = strchrnul(argv1, ' ') - argv1;
Jiří Moskovčák 07ee5f
-        /* cut the cmdline arguments */
Jiří Moskovčák 07ee5f
-        argv1 = xstrndup(argv1, len);
Jiří Moskovčák 07ee5f
-        break;
Jiří Moskovčák 07ee5f
+        return xstrndup(argv1, len);
Jiří Moskovčák 07ee5f
     }
Jiří Moskovčák 07ee5f
-    return argv1;
Jiří Moskovčák 07ee5f
+    return NULL;
Jiří Moskovčák 07ee5f
 }
Jiří Moskovčák 07ee5f
+
Jiří Moskovčák 07ee5f
+/**
Jiří Moskovčák 07ee5f
+ * Get a package name from executable name and save
Jiří Moskovčák 07ee5f
+ * package description to particular debugdump directory of a crash.
Jiří Moskovčák 07ee5f
+ * @param pExecutable A name of crashed application.
Jiří Moskovčák 07ee5f
+ * @param pDebugDumpDir A debugdump dir containing all necessary data.
Jiří Moskovčák 07ee5f
+ * @return It return results of operation. See mw_result_t.
Jiří Moskovčák 07ee5f
+ */
Jiří Moskovčák 07ee5f
 static mw_result_t SavePackageDescriptionToDebugDump(
Jiří Moskovčák 07ee5f
                 const char *pExecutable,
Jiří Moskovčák 07ee5f
                 const char *cmdline,
Jiří Moskovčák 07ee5f
@@ -692,6 +700,7 @@ static mw_result_t SavePackageDescriptionToDebugDump(
Jiří Moskovčák 07ee5f
              * This will work only if the cmdline contains the whole path.
Jiří Moskovčák 07ee5f
              * Example: python /usr/bin/system-control-network
Jiří Moskovčák 07ee5f
              */
Jiří Moskovčák 07ee5f
+            bool knownOrigin = false;
Jiří Moskovčák 07ee5f
             char *script_name = get_argv1_if_full_path(cmdline);
Jiří Moskovčák 07ee5f
             if (script_name)
Jiří Moskovčák 07ee5f
             {
Jiří Moskovčák 07ee5f
@@ -707,9 +716,16 @@ static mw_result_t SavePackageDescriptionToDebugDump(
Jiří Moskovčák 07ee5f
                     rpm_pkg = script_pkg;
Jiří Moskovčák 07ee5f
                     scriptName = script_name;
Jiří Moskovčák 07ee5f
                     pExecutable = scriptName.c_str();
Jiří Moskovčák 07ee5f
+                    knownOrigin = true;
Jiří Moskovčák 07ee5f
                 }
Jiří Moskovčák 07ee5f
                 free(script_name);
Jiří Moskovčák 07ee5f
             }
Jiří Moskovčák 07ee5f
+
Jiří Moskovčák 07ee5f
+            if (!knownOrigin && !g_settings_bProcessUnpackaged)
Jiří Moskovčák 07ee5f
+            {
Jiří Moskovčák 07ee5f
+                log("Interpreter crashed, but no packaged script detected: '%s'", cmdline);
Jiří Moskovčák 07ee5f
+                return MW_PACKAGE_ERROR;
Jiří Moskovčák 07ee5f
+            }
Jiří Moskovčák 07ee5f
         }
Jiří Moskovčák 07ee5f
 
Jiří Moskovčák 07ee5f
         package = rpm_pkg;
Jiří Moskovčák 07ee5f
@@ -717,7 +733,7 @@ static mw_result_t SavePackageDescriptionToDebugDump(
Jiří Moskovčák 07ee5f
         VERB2 log("Package:'%s' short:'%s'", rpm_pkg, packageName.c_str());
Jiří Moskovčák 07ee5f
         free(rpm_pkg);
Jiří Moskovčák 07ee5f
 
Jiří Moskovčák 07ee5f
-	if (g_setBlackList.find(packageName) != g_setBlackList.end())
Jiří Moskovčák 07ee5f
+        if (g_setBlackList.find(packageName) != g_setBlackList.end())
Jiří Moskovčák 07ee5f
         {
Jiří Moskovčák 07ee5f
             log("Blacklisted package '%s'", packageName.c_str());
Jiří Moskovčák 07ee5f
             return MW_BLACKLISTED;
Jiří Moskovčák 07ee5f
@@ -838,8 +854,8 @@ static void RunAnalyzerActions(const char *pAnalyzer, const char *pDebugDumpDir,
Jiří Moskovčák 07ee5f
             if (!action)
Jiří Moskovčák 07ee5f
             {
Jiří Moskovčák 07ee5f
                 /* GetAction() already complained if no such plugin.
Jiří Moskovčák 07ee5f
-		 * If plugin exists but isn't an Action, it's not an error.
Jiří Moskovčák 07ee5f
-		 */
Jiří Moskovčák 07ee5f
+                 * If plugin exists but isn't an Action, it's not an error.
Jiří Moskovčák 07ee5f
+                 */
Jiří Moskovčák 07ee5f
                 continue;
Jiří Moskovčák 07ee5f
             }
Jiří Moskovčák 07ee5f
             try