diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-10-26 17:20:02 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-10-26 17:20:02 +0000 |
commit | 84b11c83de28c606157a210e679f3519a41921b9 (patch) | |
tree | a2893eee89ff2d3731cdcd13edb030f22b1c9fbc /src | |
parent | 5272b27b9373a21884fde643a7d582df6b3b421b (diff) | |
download | gnunet-84b11c83de28c606157a210e679f3519a41921b9.tar.gz gnunet-84b11c83de28c606157a210e679f3519a41921b9.zip |
-improvements to parsers
Diffstat (limited to 'src')
-rw-r--r-- | src/tun/regex.c | 22 | ||||
-rw-r--r-- | src/util/strings.c | 31 |
2 files changed, 44 insertions, 9 deletions
diff --git a/src/tun/regex.c b/src/tun/regex.c index 478132f4e..5baad60ee 100644 --- a/src/tun/regex.c +++ b/src/tun/regex.c | |||
@@ -126,7 +126,7 @@ nibble_to_regex (uint8_t value, | |||
126 | return ret; | 126 | return ret; |
127 | default: | 127 | default: |
128 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 128 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
129 | "Bad mask: %d\n", | 129 | _("Bad mask: %d\n"), |
130 | mask); | 130 | mask); |
131 | GNUNET_break (0); | 131 | GNUNET_break (0); |
132 | return NULL; | 132 | return NULL; |
@@ -203,6 +203,8 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp) | |||
203 | pp->start_port); | 203 | pp->start_port); |
204 | return ret; | 204 | return ret; |
205 | } | 205 | } |
206 | if (pp->end_port < pp->start_port) | ||
207 | return NULL; | ||
206 | cnt = pp->end_port - pp->start_port + 1; | 208 | cnt = pp->end_port - pp->start_port + 1; |
207 | if (GNUNET_YES == pp->negate_portrange) | 209 | if (GNUNET_YES == pp->negate_portrange) |
208 | cnt = 0xFFFF - cnt; | 210 | cnt = 0xFFFF - cnt; |
@@ -305,6 +307,11 @@ ipv4_to_regex (const struct GNUNET_STRINGS_IPv4NetworkPolicy *v4) | |||
305 | if (NULL == reg) | 307 | if (NULL == reg) |
306 | return NULL; | 308 | return NULL; |
307 | pp = port_to_regex (&v4->pp); | 309 | pp = port_to_regex (&v4->pp); |
310 | if (NULL == pp) | ||
311 | { | ||
312 | GNUNET_free (reg); | ||
313 | return NULL; | ||
314 | } | ||
308 | GNUNET_asprintf (&ret, | 315 | GNUNET_asprintf (&ret, |
309 | "4-%s-%s", | 316 | "4-%s-%s", |
310 | pp, reg); | 317 | pp, reg); |
@@ -333,6 +340,11 @@ ipv6_to_regex (const struct GNUNET_STRINGS_IPv6NetworkPolicy *v6) | |||
333 | if (NULL == reg) | 340 | if (NULL == reg) |
334 | return NULL; | 341 | return NULL; |
335 | pp = port_to_regex (&v6->pp); | 342 | pp = port_to_regex (&v6->pp); |
343 | if (NULL == pp) | ||
344 | { | ||
345 | GNUNET_free (reg); | ||
346 | return NULL; | ||
347 | } | ||
336 | GNUNET_asprintf (&ret, | 348 | GNUNET_asprintf (&ret, |
337 | "6-%s-%s", | 349 | "6-%s-%s", |
338 | pp, reg); | 350 | pp, reg); |
@@ -364,7 +376,7 @@ GNUNET_TUN_ipv4policy2regex (const char *policy) | |||
364 | if (NULL == np) | 376 | if (NULL == np) |
365 | return NULL; | 377 | return NULL; |
366 | reg = NULL; | 378 | reg = NULL; |
367 | for (i=0; 0 != np[i].network.s_addr; i++) | 379 | for (i=0; (0 == i) || (0 != np[i].network.s_addr); i++) |
368 | { | 380 | { |
369 | line = ipv4_to_regex (&np[i]); | 381 | line = ipv4_to_regex (&np[i]); |
370 | if (NULL == line) | 382 | if (NULL == line) |
@@ -385,6 +397,8 @@ GNUNET_TUN_ipv4policy2regex (const char *policy) | |||
385 | GNUNET_free (line); | 397 | GNUNET_free (line); |
386 | reg = tmp; | 398 | reg = tmp; |
387 | } | 399 | } |
400 | if (0 == np[i].network.s_addr) | ||
401 | break; | ||
388 | } | 402 | } |
389 | return reg; | 403 | return reg; |
390 | } | 404 | } |
@@ -414,7 +428,7 @@ GNUNET_TUN_ipv6policy2regex (const char *policy) | |||
414 | return NULL; | 428 | return NULL; |
415 | reg = NULL; | 429 | reg = NULL; |
416 | memset (&zero, 0, sizeof (struct in6_addr)); | 430 | memset (&zero, 0, sizeof (struct in6_addr)); |
417 | for (i=0; 0 != memcmp (&zero, &np[i].network, sizeof (struct in6_addr)); i++) | 431 | for (i=0; (0 == i) || (0 != memcmp (&zero, &np[i].network, sizeof (struct in6_addr))); i++) |
418 | { | 432 | { |
419 | line = ipv6_to_regex (&np[i]); | 433 | line = ipv6_to_regex (&np[i]); |
420 | if (NULL == line) | 434 | if (NULL == line) |
@@ -435,6 +449,8 @@ GNUNET_TUN_ipv6policy2regex (const char *policy) | |||
435 | GNUNET_free (line); | 449 | GNUNET_free (line); |
436 | reg = tmp; | 450 | reg = tmp; |
437 | } | 451 | } |
452 | if (0 == memcmp (&zero, &np[i].network, sizeof (struct in6_addr))) | ||
453 | break; | ||
438 | } | 454 | } |
439 | return reg; | 455 | return reg; |
440 | } | 456 | } |
diff --git a/src/util/strings.c b/src/util/strings.c index 2fc647f7b..60c667ca4 100644 --- a/src/util/strings.c +++ b/src/util/strings.c | |||
@@ -1354,6 +1354,7 @@ parse_port_policy (const char *port_policy, | |||
1354 | const char *pos; | 1354 | const char *pos; |
1355 | int s; | 1355 | int s; |
1356 | int e; | 1356 | int e; |
1357 | char eol[2]; | ||
1357 | 1358 | ||
1358 | pos = port_policy; | 1359 | pos = port_policy; |
1359 | if ('!' == *pos) | 1360 | if ('!' == *pos) |
@@ -1362,17 +1363,35 @@ parse_port_policy (const char *port_policy, | |||
1362 | pos++; | 1363 | pos++; |
1363 | } | 1364 | } |
1364 | if (2 == sscanf (pos, | 1365 | if (2 == sscanf (pos, |
1365 | "%u-%u", | 1366 | "%u-%u%1s", |
1366 | &s, &e)) | 1367 | &s, &e, eol)) |
1367 | { | 1368 | { |
1369 | if ( (0 == s) || | ||
1370 | (s > 0xFFFF) || | ||
1371 | (e < s) || | ||
1372 | (e > 0xFFFF) ) | ||
1373 | { | ||
1374 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
1375 | _("Port not in range\n")); | ||
1376 | return GNUNET_SYSERR; | ||
1377 | } | ||
1368 | pp->start_port = (uint16_t) s; | 1378 | pp->start_port = (uint16_t) s; |
1369 | pp->end_port = (uint16_t) e; | 1379 | pp->end_port = (uint16_t) e; |
1370 | return GNUNET_OK; | 1380 | return GNUNET_OK; |
1371 | } | 1381 | } |
1372 | if (1 == sscanf (pos, | 1382 | if (1 == sscanf (pos, |
1373 | "%u", | 1383 | "%u%1s", |
1374 | &s)) | 1384 | &s, |
1385 | eol)) | ||
1375 | { | 1386 | { |
1387 | if ( (0 == s) || | ||
1388 | (s > 0xFFFF) ) | ||
1389 | { | ||
1390 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
1391 | _("Port not in range\n")); | ||
1392 | return GNUNET_SYSERR; | ||
1393 | } | ||
1394 | |||
1376 | pp->start_port = (uint16_t) s; | 1395 | pp->start_port = (uint16_t) s; |
1377 | pp->end_port = (uint16_t) s; | 1396 | pp->end_port = (uint16_t) s; |
1378 | return GNUNET_OK; | 1397 | return GNUNET_OK; |
@@ -1571,8 +1590,8 @@ GNUNET_STRINGS_parse_ipv4_policy (const char *routeListX) | |||
1571 | if (pos < strlen (routeList)) | 1590 | if (pos < strlen (routeList)) |
1572 | { | 1591 | { |
1573 | LOG (GNUNET_ERROR_TYPE_ERROR, | 1592 | LOG (GNUNET_ERROR_TYPE_ERROR, |
1574 | _("Invalid format for IP: `%s'\n"), | 1593 | _("Invalid format: `%s'\n"), |
1575 | &routeList[pos]); | 1594 | &routeListX[pos]); |
1576 | GNUNET_free (result); | 1595 | GNUNET_free (result); |
1577 | GNUNET_free (routeList); | 1596 | GNUNET_free (routeList); |
1578 | return NULL; /* oops */ | 1597 | return NULL; /* oops */ |