[PATCH 3 of 3] Add self test as first opertation on start

Wald Commits scm-commit at wald.intevation.org
Mon Jun 23 13:05:13 CEST 2014


# HG changeset patch
# User Andre Heinecke <andre.heinecke at intevation.de>
# Date 1403521508 -7200
# Node ID edf269b6e499500ba6c34811e4d9e0cfb6ff73fc
# Parent  aa48ea7ead1fe1b7be9fcd9c1d3e2995bf519181
Add self test as first opertation on start

diff -r aa48ea7ead1f -r edf269b6e499 ui/main.cpp
--- 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);


More information about the Trustbridge-commits mailing list