diff --git a/src/defaults.h b/src/defaults.h
index c34e4be..1c81bfe 100644
--- a/src/defaults.h
+++ b/src/defaults.h
@@ -13,7 +13,7 @@
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
-*/
+*/
#ifndef DEFAULTS_H
# define DEFAULTS_H 1
@@ -22,15 +22,12 @@
static const int MAXLEN = 1024;
/* Total number of characters in all shared network names */
-static const int SHARED_NETWORKS_NAMES = 65536;
+static const unsigned int SHARED_NETWORKS_NAMES = 65536;
/* Maximum number of shared networks */
-static const int SHARED_NETWORKS = 8192;
+static const unsigned int SHARED_NETWORKS = 8192;
/* Maximum number of ranges */
-static const unsigned int RANGES = 65536;
+unsigned int RANGES;
-/* Merge sort split size */
-static const int MIN_MERGE_SIZE = 8;
-
-#endif /* DEFAULTS_H */
+#endif /* DEFAULTS_H */
diff --git a/src/dhcpd-pools.c b/src/dhcpd-pools.c
index 00b7efc..db8495b 100644
--- a/src/dhcpd-pools.c
+++ b/src/dhcpd-pools.c
@@ -213,6 +213,7 @@ int main(int argc, char **argv)
/* Global allocations, counter resets etc */
int prepare_memory()
{
+ RANGES = 64;
num_ranges = num_shared_networks = 0;
shared_networks =
safe_malloc(sizeof(struct shared_network_t) * SHARED_NETWORKS);
diff --git a/src/dhcpd-pools.h b/src/dhcpd-pools.h
index 4bb9d2b..e3835ad 100644
--- a/src/dhcpd-pools.h
+++ b/src/dhcpd-pools.h
@@ -148,6 +148,7 @@ void *safe_malloc(const size_t size)
#endif
#endif
;
+void *safe_realloc(void *ptr, const size_t size);
char *safe_strdup(const char *str) __attribute__ ((nonnull(1)));
void print_version(void) __attribute__ ((noreturn));
void usage(int status) __attribute__ ((noreturn));
diff --git a/src/getdata.c b/src/getdata.c
index c57d2c7..1334855 100644
--- a/src/getdata.c
+++ b/src/getdata.c
@@ -386,9 +386,14 @@ char *parse_config(int is_include, char *config_file,
range_p->backups = 0;
range_p->shared_net = shared_p;
num_ranges++;
- if (RANGES < num_ranges) {
- errx(EXIT_FAILURE,
- "parse_config: increase default.h RANGES and recompile.");
+ if (RANGES < num_ranges + 1) {
+ RANGES *= 2;
+ ranges =
+ safe_realloc(ranges,
+ sizeof(struct
+ range_t) *
+ RANGES);
+ range_p = ranges + num_ranges;
}
newclause = true;
break;
@@ -429,13 +434,14 @@ char *parse_config(int is_include, char *config_file,
errx(EXIT_FAILURE,
"parse_config: increase default.h SHARED_NETWORKS_NAMES and recompile");
}
- if (SHARED_NETWORKS < num_shared_networks) {
- /* FIXME: make this go
+ if (SHARED_NETWORKS <
+ num_shared_networks + 2) {
+ /* FIXME: make this
* away by reallocationg
* more space. */
errx(EXIT_FAILURE,
"parse_config: increase default.h SHARED_NETWORKS and recompile");
- }
+ }
argument = 0;
braces_shared = braces;
break;
diff --git a/src/other.c b/src/other.c
index d8f9ac4..21a763a 100644
--- a/src/other.c
+++ b/src/other.c
@@ -41,7 +41,6 @@ extern char *malloc();
void *safe_malloc(const size_t size)
{
void *ret = malloc(size);
-
if (ret == NULL) {
err(EXIT_FAILURE,
"safe_malloc: cannot allocate %lu bytes: ", size);
@@ -50,6 +49,17 @@ void *safe_malloc(const size_t size)
return ret;
}
+/* Simple memory reallocation wrapper */
+void *safe_realloc(void *ptr, const size_t size)
+{
+ void *ret = realloc(ptr, size);
+
+ if (!ret && size)
+ err(EXIT_FAILURE,
+ "safe_realloc: cannot allocate %zu bytes", size);
+ return ret;
+}
+
/* Simple strdup wrapper */
char *safe_strdup(const char *str)
{
@@ -108,7 +118,7 @@ void print_version(void)
"This is free software: you are free to change and redistribute it.\n");
fprintf(stdout,
"There is NO WARRANTY, to the extent permitted by law.\n");
- exit(EXIT_SUCCESS);
+ exit(EXIT_SUCCESS);
}
void usage(int status)
diff --git a/src/sort.c b/src/sort.c
index c222c51..e436f5a 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -26,7 +26,6 @@
#include
#include "dhcpd-pools.h"
-#include "defaults.h"
/* Sort functions for range sorting */
int intcomp(const void *x, const void *y)
@@ -167,6 +166,8 @@ void mergesort_ranges(struct range_t *orig, int size, struct range_t *temp)
{
int left, right, i;
struct range_t hold;
+ /* Merge sort split size */
+ static const int MIN_MERGE_SIZE = 8;
if (size < MIN_MERGE_SIZE) {
for (left = 0; left < size; left++) {