inspired by the 'ipaddr.py' library from Cendio Systems AB. */
#include "secnet.h"
+#include <limits.h>
+#include <assert.h>
#include <stdio.h>
+#include <string.h>
#include "ipaddr.h"
#define DEFAULT_ALLOC 2
r=safe_malloc(sizeof(*r),"subnet_list_new:list");
r->entries=0;
r->alloc=DEFAULT_ALLOC;
- r->list=safe_malloc(sizeof(*r->list)*r->alloc,"subnet_list_new:data");
+ r->list=safe_malloc_ary(sizeof(*r->list),r->alloc,"subnet_list_new:data");
return r;
}
free(a);
}
-static void subnet_list_set_len(struct subnet_list *a, uint32_t l)
+static void subnet_list_set_len(struct subnet_list *a, int32_t l)
{
struct subnet *nd;
- uint32_t na;
+ int32_t na;
if (l>a->alloc) {
+ assert(a->alloc < (int)(INT_MAX/sizeof(*nd))-EXTEND_ALLOC_BY);
na=a->alloc+EXTEND_ALLOC_BY;
nd=realloc(a->list,sizeof(*nd)*na);
if (!nd) {
a->entries=l;
}
-void subnet_list_append(struct subnet_list *a, uint32_t prefix, uint32_t len)
+void subnet_list_append(struct subnet_list *a, uint32_t prefix, int len)
{
struct subnet *sn;
+ assert(a->entries < INT_MAX);
subnet_list_set_len(a,a->entries+1);
sn=&a->list[a->entries-1];
sn->prefix=prefix;
#ifdef DEBUG
static void ipset_dump(struct ipset *a, string_t name)
{
- uint32_t i;
+ int32_t i;
printf("%s: ",name);
for (i=0; i<a->l; i++) {
struct ipset *ipset_from_subnet_list(struct subnet_list *l)
{
struct ipset *r, *a, *b;
- uint32_t i;
+ int32_t i;
r=ipset_new();
for (i=0; i<l->entries; i++) {
return r;
}
-static void ipset_set_len(struct ipset *a, uint32_t l)
+static void ipset_set_len(struct ipset *a, int32_t l)
{
struct iprange *nd;
- uint32_t na;
+ int32_t na;
if (l>a->a) {
+ assert(a->a < INT_MAX-EXTEND_ALLOC_BY);
na=a->a+EXTEND_ALLOC_BY;
nd=realloc(a->d,sizeof(*nd)*na);
if (!nd) {
{
struct ipset *c;
struct iprange r;
- uint32_t ia,ib;
+ int32_t ia,ib;
c=ipset_new();
ia=0; ib=0;
{
struct ipset *r;
struct iprange ra, rb;
- uint32_t ia,ib;
+ int32_t ia,ib;
r=ipset_new();
ia=0; ib=0;
struct ipset *r;
struct iprange n;
int64_t pre;
- uint32_t i,lo,hi;
+ int32_t i;
+ uint32_t lo,hi;
r=ipset_new();
pre=-1;
bool_t ipset_contains_addr(struct ipset *a, uint32_t addr)
{
- uint32_t i;
+ int32_t i;
struct iprange r;
for (i=0; i<a->l; i++) {
{
struct subnet_list *r;
int64_t a,b,lobit,himask,lomask;
- int32_t bits;
- uint32_t i;
+ int bits;
+ int32_t i;
r=subnet_list_new();
for (i=0; i<is->l; i++) {
{
struct subnet s;
uint32_t a, b, c, d, n;
- uint32_t match;
+ int match;
cstring_t in;
*invert=False;
uint32_t string_item_to_ipaddr(item_t *i, cstring_t desc)
{
uint32_t a, b, c, d;
- uint32_t match;
+ int match;
/* i is not guaranteed to be a string */
if (i->type!=t_string) {