Просмотр исходного кода

ncd: NCDIfConfig: fix buffer overflow. Add functions for blackhole routes.

ambrop7 14 лет назад
Родитель
Сommit
faf29a78e5
2 измененных файлов с 38 добавлено и 4 удалено
  1. 35 4
      ncd/NCDIfConfig.c
  2. 3 0
      ncd/NCDIfConfig.h

+ 35 - 4
ncd/NCDIfConfig.c

@@ -165,14 +165,20 @@ int NCDIfConfig_remove_ipv4_addr (const char *ifname, struct ipv4_ifaddr ifaddr)
     return !run_command(cmd);
 }
 
-static int route_cmd (const char *cmdtype, struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *device)
+static int route_cmd (const char *cmdtype, struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *ifname)
 {
+    ASSERT(!strcmp(cmdtype, "add") || !strcmp(cmdtype, "del"))
     ASSERT(dest.prefix >= 0)
     ASSERT(dest.prefix <= 32)
     
+    if (strlen(ifname) >= IFNAMSIZ) {
+        BLog(BLOG_ERROR, "ifname too long");
+        return 0;
+    }
+    
     uint8_t *d_addr = (uint8_t *)&dest.addr;
     
-    char gwstr[60];
+    char gwstr[30];
     if (gateway) {
         const uint8_t *g_addr = (uint8_t *)gateway;
         sprintf(gwstr, " via %"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, g_addr[0], g_addr[1], g_addr[2], g_addr[3]);
@@ -180,9 +186,9 @@ static int route_cmd (const char *cmdtype, struct ipv4_ifaddr dest, const uint32
         gwstr[0] = '\0';
     }
     
-    char cmd[100];
+    char cmd[120 + IFNAMSIZ];
     sprintf(cmd, IP_CMD" route %s %"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"/%d%s metric %d dev %s",
-            cmdtype, d_addr[0], d_addr[1], d_addr[2], d_addr[3], dest.prefix, gwstr, metric, device);
+            cmdtype, d_addr[0], d_addr[1], d_addr[2], d_addr[3], dest.prefix, gwstr, metric, ifname);
     
     return !run_command(cmd);
 }
@@ -197,6 +203,31 @@ int NCDIfConfig_remove_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gate
     return route_cmd("del", dest, gateway, metric, device);
 }
 
+static int blackhole_route_cmd (const char *cmdtype, struct ipv4_ifaddr dest, int metric)
+{
+    ASSERT(!strcmp(cmdtype, "add") || !strcmp(cmdtype, "del"))
+    ASSERT(dest.prefix >= 0)
+    ASSERT(dest.prefix <= 32)
+    
+    uint8_t *d_addr = (uint8_t *)&dest.addr;
+    
+    char cmd[120];
+    sprintf(cmd, IP_CMD" route %s blackhole %"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"/%d metric %d",
+            cmdtype, d_addr[0], d_addr[1], d_addr[2], d_addr[3], dest.prefix, metric);
+    
+    return !run_command(cmd);
+}
+
+int NCDIfConfig_add_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric)
+{
+    return blackhole_route_cmd("add", dest, metric);
+}
+
+int NCDIfConfig_remove_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric)
+{
+    return blackhole_route_cmd("del", dest, metric);
+}
+
 int NCDIfConfig_set_dns_servers (uint32_t *servers, size_t num_servers)
 {
     FILE *temp_file = fopen(RESOLVCONF_TEMP_FILE, "w");

+ 3 - 0
ncd/NCDIfConfig.h

@@ -42,6 +42,9 @@ int NCDIfConfig_remove_ipv4_addr (const char *ifname, struct ipv4_ifaddr ifaddr)
 int NCDIfConfig_add_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *device);
 int NCDIfConfig_remove_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *device);
 
+int NCDIfConfig_add_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric);
+int NCDIfConfig_remove_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric);
+
 int NCDIfConfig_set_dns_servers (uint32_t *servers, size_t num_servers);
 
 int NCDIfConfig_make_tuntap (const char *ifname, const char *owner, int tun);