# HG changeset patch # User Andre Heinecke # 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 #include @@ -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);