diff ui/main.cpp @ 631:edf269b6e499

Add self test as first opertation on start
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 23 Jun 2014 13:05:08 +0200
parents 2ea11a95aa4a
children 6c090638b2b4
line wrap: on
line diff
--- a/ui/main.cpp	Mon Jun 23 13:04:50 2014 +0200
+++ b/ui/main.cpp	Mon Jun 23 13:05:08 2014 +0200
@@ -7,6 +7,9 @@
  */
 #include "mainwindow.h"
 #include "processhelp.h"
+#include "binverify.h"
+#include "logging.h"
+#include "strhelp.h"
 
 #include <QApplication>
 #include <QSystemTrayIcon>
@@ -36,6 +39,54 @@
 
 int main(int argc, char **argv)
 {
+    /* First verify integrity even before calling QApplication*/
+#ifdef Q_OS_WIN
+  DWORD sizeNeeded = GetModuleFileNameW (NULL, NULL, 0);
+  wchar_t wPath[sizeNeeded + 1];
+  char *utf8path = NULL;
+
+  if (sizeNeeded == 0) {
+      PRINTLASTERROR ("Failed to obtain module file name");
+      syslog_error_printf ("Integrity check failed.");
+      return -1;
+  }
+
+  DWORD realSize = GetModuleFileNameW (NULL, wPath, sizeNeeded + 1);
+
+  if (realSize != sizeNeeded) {
+      ERRORPRINTF ("Module name changed");
+      syslog_error_printf ("Integrity check failed.");
+      return -1;
+  }
+
+  utf8path = wchar_to_utf8 (wPath, sizeNeeded + 1);
+
+  if (utf8path == NULL) {
+      ERRORPRINTF ("Failed to convert module path to utf-8");
+      syslog_error_printf ("Integrity check failed.");
+      return -1;
+  }
+
+  if (!verify_binary (utf8path, strlen(utf8path)) != VerifyValid)
+    {
+      syslog_error_printf ("Integrity check failed.");
+      xfree(utf8path);
+#ifdef RELEASE_BUILD
+      return -1;
+#endif
+    }
+
+  xfree(utf8path);
+#else
+    if (!verify_binary ("/proc/self/exe", 14) != VerifyValid)
+      {
+        syslog_error_printf ("Integrity check failed.");
+#ifdef RELEASE_BUILD
+        return -1;
+#endif
+      }
+#endif
+
     QApplication app (argc, argv);
 
     QApplication::setQuitOnLastWindowClosed(false);

http://wald.intevation.org/projects/trustbridge/