cleanup
diff --git a/libebtc.c b/libebtc.c
index 6760dbc..3e39512 100644
--- a/libebtc.c
+++ b/libebtc.c
@@ -109,22 +109,22 @@
         struct ebt_u_watcher *w = ebt_watchers;
 
 	PRINT_VERSION;
-	printf("Supported userspace extensions:\n\nSupported tables:\n");
+	printf("Loaded userspace extensions:\n\nLoaded tables:\n");
         while (tbl) {
 		printf("%s\n", tbl->name);
                 tbl = tbl->next;
 	}
-	printf("\nSupported targets:\n");
+	printf("\nLoaded targets:\n");
         while (t) {
 		printf("%s\n", t->name);
                 t = t->next;
 	}
-	printf("\nSupported matches:\n");
+	printf("\nLoaded matches:\n");
         while (m) {
 		printf("%s\n", m->name);
                 m = m->next;
 	}
-	printf("\nSupported watchers:\n");
+	printf("\nLoaded watchers:\n");
         while (w) {
 		printf("%s\n", w->name);
                 w = w->next;
@@ -191,14 +191,10 @@
 	replace->flags = 0;
 	replace->command = 0;
 	replace->selected_chain = -1;
-	if (replace->filename) {
-		free(replace->filename);
-		replace->filename = NULL;
-	}
-	if (replace->counters) {
-		free(replace->counters);
-		replace->counters = NULL;
-	}
+	free(replace->filename);
+	replace->filename = NULL;
+	free(replace->counters);
+	replace->counters = NULL;
 
 	i = -1;
 	while (1) {
@@ -218,11 +214,10 @@
 			u_e1 = u_e2;
 		}
 	}
-	for (i = 0; i < NF_BR_NUMHOOKS; i++)
-		if (replace->hook_entry[i]) {
-			free(replace->hook_entry[i]);
-			replace->hook_entry[i] = NULL;
-		}
+	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
+		free(replace->hook_entry[i]);
+		replace->hook_entry[i] = NULL;
+	}
 	udc1 = replace->udc;
 	while (udc1) {
 		free(udc1->udc);
@@ -234,7 +229,7 @@
 	cc1 = replace->counterchanges;
 	while (cc1) {
 		cc2 = cc1->next;
-		free(cc2);
+		free(cc1);
 		cc1 = cc2;
 	}
 	replace->counterchanges = NULL;
@@ -251,8 +246,8 @@
 	/* The init functions should determine by themselves whether they are
 	 * called for the first time or not (when necessary). */
 	for (m = ebt_matches; m; m = m->next) {
-		size = EBT_ALIGN(m->size) + sizeof(struct ebt_entry_match);
 		if (m->used) {
+			size = EBT_ALIGN(m->size) + sizeof(struct ebt_entry_match);
 			m->m = (struct ebt_entry_match *)malloc(size);
 			if (!m->m)
 				ebt_print_memory();
@@ -264,8 +259,8 @@
 		m->init(m->m);
 	}
 	for (w = ebt_watchers; w; w = w->next) {
-		size = EBT_ALIGN(w->size) + sizeof(struct ebt_entry_watcher);
 		if (w->used) {
+			size = EBT_ALIGN(w->size) + sizeof(struct ebt_entry_watcher);
 			w->w = (struct ebt_entry_watcher *)malloc(size);
 			if (!w->w)
 				ebt_print_memory();
@@ -277,8 +272,8 @@
 		w->init(w->w);
 	}
 	for (t = ebt_targets; t; t = t->next) {
-		size = EBT_ALIGN(t->size) + sizeof(struct ebt_entry_target);
 		if (t->used) {
+			size = EBT_ALIGN(t->size) + sizeof(struct ebt_entry_target);
 			t->t = (struct ebt_entry_target *)malloc(size);
 			if (!t->t)
 				ebt_print_memory();
@@ -327,7 +322,9 @@
 	if (ret) {
 		if (read(procfile, ret, 1024) == -1)
 			goto fail;
-		ret[1023] = '\0';
+		/* The kernel adds a '\n' */
+		ret[1023] = '\n';
+		*strchr(ret, '\n') = '\0';
 		close(procfile);
 		return ret;
 	}
@@ -344,12 +341,12 @@
 	char *buf = NULL;
 	char *argv[3];
 
-	/* If they don't explicitly set it, read out of kernel */
+	/* If they don't explicitly set it, read out of /proc */
 	if (!ebt_modprobe) {
 		buf = get_modprobe();
 		if (!buf)
 			return -1;
-		ebt_modprobe = buf;
+		ebt_modprobe = buf; /* Keep the value for possible later use */
 	}
 
 	switch (fork()) {
@@ -368,7 +365,6 @@
 		wait(NULL);
 	}
 
-	free(buf);
 	return 0;
 }
 
@@ -775,7 +771,8 @@
 }
 
 /* If *begin==*end==0 then find the rule corresponding to new_entry,
- * else make the rule numbers positive and check for bad rule numbers. */
+ * else make the rule numbers positive (starting from 0) and check
+ * for bad rule numbers. */
 static int check_and_change_rule_number(struct ebt_u_replace *replace,
    struct ebt_u_entry *new_entry, int *begin, int *end)
 {
@@ -794,7 +791,7 @@
 	if ((*begin * *end == 0) && (*begin + *end != 0))
 		ebt_print_bug("begin and end should be either both zero, "
 			      "either both non-zero");
-	if (*begin != 0 && *end != 0) {
+	if (*begin != 0) {
 		(*begin)--;
 		(*end)--;
 	} else {