76 static void *SCHInfoAllocUserDataOSPolicy(
const char *host_os)
81 SCLogError(
"Invalid enum map inside SCHInfoAddHostOSInfo()");
85 int *user_data =
SCMalloc(
sizeof(
int));
86 if (user_data == NULL) {
87 FatalError(
"Error allocating memory. Exiting");
90 return (
void *)user_data;
98 static void SCHInfoFreeUserDataOSPolicy(
void *data)
104 static const SCRadix4Config ospolicy_radix4_config = { SCHInfoFreeUserDataOSPolicy, NULL };
105 static const SCRadix6Config ospolicy_radix6_config = { SCHInfoFreeUserDataOSPolicy, NULL };
124 char *ip_str_rem = NULL;
125 int *user_data = NULL;
126 bool recursive =
false;
128 if (host_os == NULL || host_os_ip_range == NULL ||
129 strlen(host_os_ip_range) == 0) {
135 if ( (user_data = SCHInfoAllocUserDataOSPolicy(host_os)) == NULL) {
142 if ( (strcasecmp(host_os_ip_range,
"default")) == 0) {
144 host_os_ip_range =
"0.0.0.0/0";
146 host_os_ip_range =
"::/0";
149 if ( (ip_str =
SCStrdup(host_os_ip_range)) == NULL) {
154 if ((ip_str_rem = strchr(ip_str,
',')) != NULL) {
155 ip_str_rem[0] =
'\0';
160 if (strchr(ip_str,
':') == NULL) {
162 &sc_hinfo_tree4, &ospolicy_radix4_config, ip_str, user_data)) {
164 SCLogError(
"duplicate ipv4 address '%s'", ip_str);
166 SCLogError(
"invalid ipv4 address '%s'", ip_str);
168 SCHInfoFreeUserDataOSPolicy(user_data);
174 &sc_hinfo_tree6, &ospolicy_radix6_config, ip_str, user_data)) {
176 SCLogError(
"duplicate ipv6 address '%s'", ip_str);
178 SCLogError(
"invalid ipv6 address '%s'", ip_str);
180 SCHInfoFreeUserDataOSPolicy(user_data);
202 static int SCHInfoGetHostOSFlavour(
const char *
str)
204 void *user_data = NULL;
206 if (
str == NULL || strchr(
str,
'/') != NULL)
209 if (strchr(
str,
':') != NULL) {
210 struct in6_addr addr;
211 if (inet_pton(AF_INET6,
str, &addr) <= 0) {
216 if (user_data == NULL)
219 return *((
int *)user_data);
222 if (inet_pton(AF_INET,
str, &addr) <= 0) {
227 if (user_data == NULL)
230 return *((
int *)user_data);
245 void *user_data = NULL;
247 if (user_data == NULL)
249 return *((
int *)user_data);
262 void *user_data = NULL;
264 if (user_data == NULL)
266 return *((
int *)user_data);
291 if (host->
val != NULL && strchr(host->
val,
':') != NULL)
294 FatalError(
"Failed to add host \"%s\" with policy \"%s\" to host "
308 static void SCHInfoCreateContextBackup(
void)
310 sc_hinfo_tree_backup4 = sc_hinfo_tree4;
312 sc_hinfo_tree_backup6 = sc_hinfo_tree6;
316 static void SCHInfoRestoreContextBackup(
void)
318 sc_hinfo_tree4 = sc_hinfo_tree_backup4;
320 sc_hinfo_tree6 = sc_hinfo_tree_backup6;
328 static int SCHInfoTestInvalidOSFlavour01(
void)
330 SCHInfoCreateContextBackup();
357 SCHInfoRestoreContextBackup();
366 static int SCHInfoTestInvalidIPV4Address02(
void)
368 SCHInfoCreateContextBackup();
395 SCHInfoRestoreContextBackup();
404 static int SCHInfoTestInvalidIPV6Address03(
void)
406 SCHInfoCreateContextBackup();
426 "1921.6311:6241:6422:7352:ABBB:DDDD:EEEE/129",
435 SCHInfoRestoreContextBackup();
446 static int SCHInfoTestValidIPV4Address04(
void)
448 SCHInfoCreateContextBackup();
489 if (SCHInfoGetHostOSFlavour(
"192.168.1.1") !=
493 if (SCHInfoGetHostOSFlavour(
"192.168.1.2") != -1) {
496 if (SCHInfoGetHostOSFlavour(
"192.168.1.100") !=
500 if (SCHInfoGetHostOSFlavour(
"192.192.2.4") != -1) {
503 if (SCHInfoGetHostOSFlavour(
"192.168.2.4") !=
507 if (SCHInfoGetHostOSFlavour(
"192.192.1.5") !=
511 if (SCHInfoGetHostOSFlavour(
"192.168.10.20") !=
515 if (SCHInfoGetHostOSFlavour(
"111.163.151.62") !=
519 if (SCHInfoGetHostOSFlavour(
"11.1.120.210") !=
523 if (SCHInfoGetHostOSFlavour(
"19.18.110.210") !=
527 if (SCHInfoGetHostOSFlavour(
"19.18.120.110") !=
531 if (SCHInfoGetHostOSFlavour(
"191.168.11.128") !=
535 if (SCHInfoGetHostOSFlavour(
"191.168.11.192") !=
539 if (SCHInfoGetHostOSFlavour(
"191.168.11.224") != -1) {
547 SCHInfoRestoreContextBackup();
558 static int SCHInfoTestValidIPV4Address05(
void)
560 SCHInfoCreateContextBackup();
602 if (SCHInfoGetHostOSFlavour(
"192.168.1.1") !=
606 if (SCHInfoGetHostOSFlavour(
"192.168.1.2") != -1) {
609 if (SCHInfoGetHostOSFlavour(
"192.168.1.100") !=
613 if (SCHInfoGetHostOSFlavour(
"192.192.2.4") != -1) {
616 if (SCHInfoGetHostOSFlavour(
"192.168.2.4") !=
620 if (SCHInfoGetHostOSFlavour(
"192.192.1.5") !=
624 if (SCHInfoGetHostOSFlavour(
"192.168.10.20") !=
628 if (SCHInfoGetHostOSFlavour(
"111.163.151.62") !=
632 if (SCHInfoGetHostOSFlavour(
"111.162.208.0") !=
636 if (SCHInfoGetHostOSFlavour(
"111.162.210.1") !=
640 if (SCHInfoGetHostOSFlavour(
"111.162.214.1") !=
644 if (SCHInfoGetHostOSFlavour(
"111.162.0.0") != -1) {
647 if (SCHInfoGetHostOSFlavour(
"111.162.240.112") != -1) {
650 if (SCHInfoGetHostOSFlavour(
"111.162.240.1") !=
654 if (SCHInfoGetHostOSFlavour(
"111.162.214.100") !=
658 if (inet_pton(AF_INET,
"111.162.208.100", &in) < 0) {
665 if (SCHInfoGetHostOSFlavour(
"111.162.194.112") !=
669 if (SCHInfoGetHostOSFlavour(
"111.162.208.200") !=
673 if (inet_pton(AF_INET,
"111.162.208.200", &in) < 0) {
680 if (SCHInfoGetHostOSFlavour(
"111.162.200.201") != -1) {
688 SCHInfoRestoreContextBackup();
699 static int SCHInfoTestValidIPV6Address06(
void)
701 SCHInfoCreateContextBackup();
706 "2351:2512:6211:6246:235A:6242:2352:62AD",
711 "6961:6121:2132:6241:423A:2135:2461:621D",
716 "DD13:613D:F312:62DD:6213:421A:6212:2652",
721 "9891:2131:2151:6426:1342:674D:622F:2342",
726 "3525:2351:4223:6211:2311:2667:6242:2154",
731 "1511:6211:6726:7777:1212:2333:6222:7722",
736 "2666:6222:7222:2335:6223:7722:3425:2362",
741 "8762:2352:6241:7245:EE23:21AD:2312:622C",
746 "6422:EE1A:2621:34AD:2462:432D:642E:E13A",
751 "3521:7622:6241:6242:7277:1234:2352:6234",
756 "2141:6232:6252:2223:7734:2345:6245:6222",
761 "5222:6432:6432:2322:6662:3423:4322:3245",
766 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:62AD") !=
770 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:6FFFE") != -1) {
773 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2652") !=
777 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2222") != -1) {
780 if (SCHInfoGetHostOSFlavour(
"9891:2131:2151:6426:1342:674D:622F:2342") !=
784 if (SCHInfoGetHostOSFlavour(
"3525:2351:4223:6211:2311:2667:6242:2154") !=
788 if (SCHInfoGetHostOSFlavour(
"1511:6211:6726:7777:1212:2333:6222:7722") !=
792 if (SCHInfoGetHostOSFlavour(
"2666:6222:7222:2335:6223:7722:3425:2362") !=
796 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:622C") !=
800 if (SCHInfoGetHostOSFlavour(
"6422:EE1A:2621:34AD:2462:432D:642E:E13A") !=
804 if (SCHInfoGetHostOSFlavour(
"3521:7622:6241:6242:7277:1234:2352:6234") !=
808 if (SCHInfoGetHostOSFlavour(
"2141:6232:6252:2223:7734:2345:6245:6222") !=
812 if (SCHInfoGetHostOSFlavour(
"5222:6432:6432:2322:6662:3423:4322:3245") !=
816 if (SCHInfoGetHostOSFlavour(
"5222:6432:6432:2322:6662:3423:4322:DDDD") != -1) {
824 SCHInfoRestoreContextBackup();
835 static int SCHInfoTestValidIPV6Address07(
void)
837 SCHInfoCreateContextBackup();
842 "2351:2512:6211:6246:235A:6242:2352:62AD",
847 "6961:6121:2132:6241:423A:2135:2461:621D",
852 "DD13:613D:F312:62DD:6213:421A:6212:2652",
857 "9891:2131:2151:6426:1342:674D:622F:2342",
862 "3525:2351:4223:6211:2311:2667:6242:2154",
867 "1511:6211:6726:7777:1212:2333:6222:7722",
872 "2666:6222:7222:2335:6223:7722:3425:2362",
877 "8762:2352:6241:7245:EE23:21AD:2312:622C/68",
882 "8762:2352:6241:7245:EE23:21AD:2412:622C",
887 "8762:2352:6241:7245:EE23:21AD:FFFF:622C",
892 "8762:2352:6241:7245:EE23:21AD:2312:62FF",
897 "8762:2352:6241:7245:EE23:21AD:2121:1212",
902 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:62AD") !=
906 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:6FFFE") != -1) {
909 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2652") !=
913 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2222") != -1) {
916 if (SCHInfoGetHostOSFlavour(
"9891:2131:2151:6426:1342:674D:622F:2342") !=
920 if (SCHInfoGetHostOSFlavour(
"3525:2351:4223:6211:2311:2667:6242:2154") !=
924 if (SCHInfoGetHostOSFlavour(
"1511:6211:6726:7777:1212:2333:6222:7722") !=
928 if (SCHInfoGetHostOSFlavour(
"2666:6222:7222:2335:6223:7722:3425:2362") !=
932 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:622C") !=
936 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2412:622C") !=
940 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:FFFF:622C") !=
944 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:62FF") !=
948 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2121:1212") !=
952 if (SCHInfoGetHostOSFlavour(
"5222:6432:6432:2322:6662:3423:4322:DDDD") != -1) {
955 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2121:1DDD") !=
959 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:FFFF:2121:1DDD") !=
963 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:622C") !=
967 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE00:0000:0000:0000") !=
971 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:E000:0000:0000:0000") !=
980 SCHInfoRestoreContextBackup();
991 static int SCHInfoTestValidIPV6Address08(
void)
993 SCHInfoCreateContextBackup();
999 "2351:2512:6211:6246:235A:6242:2352:62AD",
1004 "6961:6121:2132:6241:423A:2135:2461:621D",
1009 "DD13:613D:F312:62DD:6213:421A:6212:2652",
1014 "9891:2131:2151:6426:1342:674D:622F:2342",
1019 "3525:2351:4223:6211:2311:2667:6242:2154",
1024 "1511:6211:6726:7777:1212:2333:6222:7722",
1029 "2666:6222:7222:2335:6223:7722:3425:2362",
1034 "8762:2352:6241:7245:EE23:21AD:2312:622C/68",
1039 "8762:2352:6241:7245:EE23:21AD:2412:622C",
1044 "8762:2352:6241:7245:EE23:21AD:FFFF:622C",
1049 "8762:2352:6241:7245:EE23:21AD:2312:62FF",
1054 "8762:2352:6241:7245:EE23:21AD:2121:1212",
1065 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:62AD") !=
1069 if (SCHInfoGetHostOSFlavour(
"2351:2512:6211:6246:235A:6242:2352:6FFF") !=
1073 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2652") !=
1077 if (SCHInfoGetHostOSFlavour(
"DD13:613D:F312:62DD:6213:421A:6212:2222") !=
1081 if (SCHInfoGetHostOSFlavour(
"9891:2131:2151:6426:1342:674D:622F:2342") !=
1085 if (SCHInfoGetHostOSFlavour(
"3525:2351:4223:6211:2311:2667:6242:2154") !=
1089 if (SCHInfoGetHostOSFlavour(
"1511:6211:6726:7777:1212:2333:6222:7722") !=
1093 if (SCHInfoGetHostOSFlavour(
"2666:6222:7222:2335:6223:7722:3425:2362") !=
1097 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:622C") !=
1101 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2412:622C") !=
1105 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:FFFF:622C") !=
1109 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:62FF") !=
1113 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2121:1212") !=
1117 if (SCHInfoGetHostOSFlavour(
"5222:6432:6432:2322:6662:3423:4322:DDDD") !=
1121 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2121:1DDD") !=
1125 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:FFFF:2121:1DDD") !=
1129 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE23:21AD:2312:622C") !=
1133 if (SCHInfoGetHostOSFlavour(
"8762:2352:6241:7245:EE00:0000:0000:0000") !=
1137 if (inet_pton(AF_INET6,
"8762:2352:6241:7245:E000:0000:0000:0000", &in6) < 0) {
1144 if (inet_pton(AF_INET6,
"AD23:2DDA:6D1D:A223:E235:0232:1241:1666", &in6) < 0) {
1151 if (SCHInfoGetHostOSFlavour(
"8.8.8.8") !=
1159 SCHInfoRestoreContextBackup();
1170 static int SCHInfoTestValidIPV4Address09(
void)
1172 SCHInfoCreateContextBackup();
1176 FAIL_IF(SCHInfoGetHostOSFlavour(
"192.168.1.0") !=
1180 FAIL_IF(SCHInfoGetHostOSFlavour(
"192.168.1.0") !=
1183 FAIL_IF(SCHInfoGetHostOSFlavour(
"192.168.50.128") !=
1186 FAIL_IF(SCHInfoGetHostOSFlavour(
"192.168.50.128") !=
1188 FAIL_IF(SCHInfoGetHostOSFlavour(
"192.168.1.100") !=
1192 SCHInfoRestoreContextBackup();
1199 static int SCHInfoTestLoadFromConfig01(
void)
1206 windows: [10.0.0.0/8, 192.168.1.0/24]\n\
1207 linux: [10.0.0.5/32]\n\
1212 SCHInfoCreateContextBackup();
1225 if (SCHInfoGetHostOSFlavour(
"172.168.1.1") !=
OS_POLICY_BSD)
1235 SCHInfoRestoreContextBackup();
1243 static int SCHInfoTestLoadFromConfig02(
void)
1249 one-two: [0.0.0.0/0]\n\
1252 six-seven_eight: [10.0.0.0/8, 192.168.1.0/24]\n\
1253 nine_ten_eleven: [10.0.0.5/32]\n\
1258 SCHInfoCreateContextBackup();
1274 if (strcmp(
"one-two", policy->
name) != 0)
1278 if (strcmp(
"one-two-three", policy->
name) != 0)
1282 if (strcmp(
"four-five", policy->
name) != 0)
1286 if (strcmp(
"six-seven-eight", policy->
name) != 0)
1290 if (strcmp(
"nine-ten-eleven", policy->
name) != 0)
1304 SCHInfoRestoreContextBackup();
1312 static int SCHInfoTestLoadFromConfig03(
void)
1318 bsd-right: [0.0.0.1]\n\
1319 old-linux: [0.0.0.2]\n\
1320 old-solaris: [0.0.0.3]\n\
1321 windows: [0.0.0.4]\n\
1327 SCHInfoCreateContextBackup();
1340 printf(
"Invalid enum map inside\n");
1352 SCHInfoRestoreContextBackup();
1359 static int SCHInfoTestLoadFromConfig04(
void)
1365 bsd_right: [0.0.0.1]\n\
1366 old_linux: [0.0.0.2]\n\
1367 old_solaris: [0.0.0.3]\n\
1368 windows: [0.0.0.4]\n\
1374 SCHInfoCreateContextBackup();
1387 printf(
"Invalid enum map inside\n");
1399 SCHInfoRestoreContextBackup();
1406 static int SCHInfoTestLoadFromConfig05(
void)
1412 bsd_right: [0.0.0.1]\n\
1413 old_linux: [0.0.0.2]\n\
1414 old-solaris: [0.0.0.3]\n\
1415 windows: [0.0.0.4]\n\
1419 SCHInfoCreateContextBackup();
1431 FAIL_IF (SCHInfoGetHostOSFlavour(
"0.0.0.0") != -1);
1432 FAIL_IF (SCHInfoGetHostOSFlavour(
"0.0.0.6") != -1);
1437 SCHInfoRestoreContextBackup();
1448 UtRegisterTest(
"SCHInfoTestInvalidOSFlavour01", SCHInfoTestInvalidOSFlavour01);
1450 SCHInfoTestInvalidIPV4Address02);
1452 SCHInfoTestInvalidIPV6Address03);
1454 SCHInfoTestValidIPV4Address04);
1456 SCHInfoTestValidIPV4Address05);
1458 SCHInfoTestValidIPV6Address06);
1460 SCHInfoTestValidIPV6Address07);
1462 SCHInfoTestValidIPV6Address08);
1464 SCHInfoTestValidIPV4Address09);
1466 UtRegisterTest(
"SCHInfoTestLoadFromConfig01", SCHInfoTestLoadFromConfig01);
1467 UtRegisterTest(
"SCHInfoTestLoadFromConfig02", SCHInfoTestLoadFromConfig02);
1468 UtRegisterTest(
"SCHInfoTestLoadFromConfig03", SCHInfoTestLoadFromConfig03);
1469 UtRegisterTest(
"SCHInfoTestLoadFromConfig04", SCHInfoTestLoadFromConfig04);
1470 UtRegisterTest(
"SCHInfoTestLoadFromConfig05", SCHInfoTestLoadFromConfig05);