Add gcc hardening options to OLSRd makefile
authorHenning Rogge <hrogge@googlemail.com>
Sun, 13 Jun 2010 16:30:32 +0000 (18:30 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 13 Jun 2010 16:30:32 +0000 (18:30 +0200)
Makefile.inc
lib/cl_roam/src/cl_roam.c

index 096459c..c8211f4 100644 (file)
@@ -18,6 +18,11 @@ REMOVE_LOG_ERROR ?= 0
 # you need a recent enough gcc and the libmudflap installed
 MUDFLAP ?= 0
 
+# enables several security features like exec ASLR,
+# stack protector, fortify source, RELRO and BIND_NOW
+# only for linux at the moment
+HARDENING ?= 1
+
 # enable static linking of plugins (list of plugin directory names) 
 STATIC_PLUGINS ?= lq_etx_ff
 
@@ -77,8 +82,29 @@ ifeq ($(REMOVE_LOG_ERROR),1)
 endif
 
 ##############
+# OS detection
+##############
+ifeq ($(OS),Windows_NT)
+  OS := win32
+endif
+ifeq ($(OS),)
+  OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
+endif
+
+#################
+# OLSRd hardening
+#################
+# -D_FORTIFY_SOURCE=2 need at least -O2
+ifeq ($(HARDENING),1)
+ifeq ($(OPTIMIZE),)
+OPTIMIZE := -O2
+endif
+endif
+
+##############
 # add gcc warnings and optimizations if CFLAGS not set
 ##############
+
 ifndef CFLAGS
   ifndef WARNINGS
     ALL_WARNINGS +=    -Wall
@@ -119,6 +145,8 @@ ifndef CFLAGS
 
     ALL_WARNINGS +=    -Winline
     ALL_WARNINGS +=    -Wdisabled-optimization
+               ALL_WARNINGS += -Wformat
+               ALL_WARNINGS += -Wformat-security
     ALL_WARNINGS +=    -Werror
     ALL_WARNINGS +=    -finline-functions-called-once
     ALL_WARNINGS +=    -funit-at-a-time
@@ -176,6 +204,10 @@ ifdef OLSRD_PLUGIN
   LDFLAGS +=   -Wl,--version-script=version-script.txt
 else
   # c and ld flags for main
+  ifeq ($(HARDENING),1)
+    CFLAGS +=  -fPIE
+    LDFLAGS += -pie
+  endif
   ifeq ($(LD_HAS_DYN), yes)
     LDFLAGS_EXE +=     -Wl,--dynamic-list=$(EXENAME).exports
   else
@@ -207,13 +239,12 @@ HDRS +=           $(wildcard src/common/*.h src/*.h)
 STATIC_PLUGIN_SRCS += $(foreach dir,$(STATIC_PLUGINS),$(wildcard lib/$(dir)/src/*.c))
 STATIC_PLUGIN_OBJS += $(STATIC_PLUGIN_SRCS:%.c=%.o)
 
-# OS detection
-ifeq ($(OS),Windows_NT)
-  OS := win32
-endif
-ifeq ($(OS),)
-  OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
+ifdef OLSRD_PLUGIN
+  # this must be run after the OS-specific makefile
+  CPPFLAGS +=  -DPLUGIN_FULLNAME="\"$(PLUGIN_FULLNAME)\""
 endif
+
+# load os-specific makefiles
 ifeq ($(OS),UNKNOWN)
 all: help
 else
@@ -222,11 +253,6 @@ all: default_target
 include $(TOPDIR)/make/Makefile.$(OS)
 endif
 
-ifdef OLSRD_PLUGIN
-  # this must be run after the OS-specific makefile
-  CPPFLAGS +=  -DPLUGIN_FULLNAME="\"$(PLUGIN_FULLNAME)\""
-endif
-
 # one object for each source file
 OBJS +=                $(SRCS:%.c=%.o)
 
index 5284c43..7b9eb88 100644 (file)
@@ -266,6 +266,8 @@ void olsr_parser(struct olsr_message *msg, struct interface *in_if __attribute__
   if (guest != NULL) {
     if ((guest->is_announced) != 0) {
       char route_command[50];
+      int ret;
+
       OLSR_INFO(LOG_PLUGINS, "Having to revoke announcement for %s\n", inet_ntoa(guest->ip.v4));
       guest->is_announced = 0;
       guest->last_seen = 90.0;
@@ -274,7 +276,9 @@ void olsr_parser(struct olsr_message *msg, struct interface *in_if __attribute__
       ip_prefix_list_remove(&olsr_cnf->hna_entries, &(guest->ip), olsr_netmask_to_prefix(&gw_netmask),
           olsr_cnf->ip_version);
       snprintf(route_command, sizeof(route_command), "route del %s dev ath0 metric 0", inet_ntoa(guest->ip.v4));
-      system(route_command);
+      if ((ret = system(route_command))) {
+        OLSR_WARN(LOG_PLUGINS, "cl_roam: Warning, system '%s' returned %d\n", route_command, ret);
+      }
       single_hna(&ip, 0);
     }
   }
@@ -344,8 +348,11 @@ static  __attribute__ ((noreturn)) void* ping_thread_infinite(void * target_void
   char ping_command[50];
   struct guest_client * target = (struct guest_client*) target_void;
   while (1) {
+    int ret;
     snprintf(ping_command, sizeof(ping_command), "arping -I ath0 -q -c 10 %s", inet_ntoa(target->ip.v4));
-    system(ping_command);
+    if ((ret = system(ping_command))) {
+      OLSR_WARN(LOG_PLUGINS, "cl_roam: Warning, system '%s' returned %d\n", ping_command, ret);
+    }
     pthread_testcancel();
   }
 }
@@ -381,6 +388,7 @@ static void check_ping_result(void *foo) {
     host->ping_thread_done = 0;
     if (ping_res == 0) {
       char route_command[50];
+      int ret;
       OLSR_INFO(LOG_PLUGINS, "Adding Route for %s\n", inet_ntoa(host->ip.v4));
 
       ip_prefix_list_add(&olsr_cnf->hna_entries, &(host->ip), olsr_netmask_to_prefix(&gw_netmask));
@@ -388,7 +396,10 @@ static void check_ping_result(void *foo) {
       host->remaing_announcements = 15;
 
       snprintf(route_command, sizeof(route_command), "route add %s dev ath0 metric 0", inet_ntoa(host->ip.v4));
-      system(route_command);
+      if ((ret = system(route_command))) {
+        OLSR_WARN(LOG_PLUGINS, "cl_roam: Warning, system '%s' returned %d\n", route_command, ret);
+      }
+
       host->master_ip = olsr_cnf->router_id;
 
       spread_host(host);
@@ -418,11 +429,13 @@ static void check_for_route(struct guest_client * host) {
     rc = pthread_create(&(host->ping_thread_add), NULL, ping_thread, (void *) host);
   } else if ((host->last_seen > 60.0) && host->is_announced) {
     char route_command[50];
-
+    int ret;
     OLSR_INFO(LOG_PLUGINS, "Removing Route for %s\n", inet_ntoa(host->ip.v4));
     ip_prefix_list_remove(&olsr_cnf->hna_entries, &host->ip, olsr_netmask_to_prefix(&gw_netmask), olsr_cnf->ip_version);
     snprintf(route_command, sizeof(route_command), "route del %s dev ath0 metric 0", inet_ntoa(host->ip.v4));
-    system(route_command);
+    if ((ret = system(route_command))) {
+      OLSR_WARN(LOG_PLUGINS, "cl_roam: Warning, system '%s' returned %d\n", route_command, ret);
+    }
     host->is_announced = 0;
   } else if (host->is_announced && host->remaing_announcements > 0) {
     host->remaing_announcements--;