db.c
changeset 18 d4ce82194b64
parent 17 bd746609ba46
child 22 822094314703
--- a/db.c	Mon Nov 07 10:43:09 2011 -0800
+++ b/db.c	Wed Nov 09 15:54:37 2011 -0800
@@ -80,13 +80,11 @@
 unsigned short int
 db_create_new( char *txt )
 {
+	FILE *txt_f  = NULL;
+	parsed *rule = NULL;
+	char buf[ LINE_BUFSIZE*10 ], tmpfile[25];
+	int  tmp_fd, linenum = 0, parsed = 0, error = 0;
 	struct cdb_make cdbm;
-
-	char buf[ LINE_BUFSIZE*10 ];
-	char tmpfile[25];
-	int  tmp_fd;
-	FILE *txt_f = NULL;
-	int  linenum = 0, parsed = 0;
 	struct db_input *dbline;
 
 	/* open temporary file */
@@ -112,19 +110,33 @@
 		/* skip blank lines and comments */
 		if ( strlen(buf) == 1 || buf[0] == '#' ) continue;
 
-		/* validate and add! */
+		/* validate line */
 		dbline = parse_dbinput( buf );
 		if ( dbline == NULL ) {
-			debug( 0, LOC, "Invalid rule (line %d), skipping: %s", linenum, buf );
-			continue;
+			debug( 0, LOC, "Invalid rule (line %d), stopping: %s", linenum, buf );
+			error = 1;
+			break;
 		}
 
+		/* validate rule */
+		rule = parse_rule( dbline->val );
+		if ( rule == NULL ||
+			( rule->negate == 1 && rule->host != NULL ) ||
+			( rule->negate == 0 && rule->host == NULL )) {
+
+			debug( 0, LOC, "Invalid rule (line %d), stopping: %s", linenum, buf );
+			error = 1;
+			break;
+		}
+
+		/* looking good, add rule */
 		cdb_make_add( &cdbm, dbline->key, dbline->klen, dbline->val, dbline->vlen );
 		parsed++;
 
 		free( dbline->key );
 		free( dbline->val );
-		free( dbline );
+		free( dbline ), dbline = NULL;
+		finish_parsed( rule ), rule = NULL;
 	}
 
 	/* write indexes */
@@ -132,13 +144,22 @@
 	cdb_make_finish( &cdbm );
 	close( tmp_fd );
 
-	/* move cdb into place */
-	if ( (rename( tmpfile, v.dbname )) == -1 ) {
-		debug( 0, LOC, "Unable to move temp cdb into place: %s", strerror(errno) );
-		return( 1 );
+	if ( error == 1 ) {
+		/* delete the tmp db on errors */
+		if ( (unlink( tmpfile )) != 0 ) {
+			debug( 0, LOC, "Unable to remove temp cdb: %s", strerror(errno) );
+			return( 1 );
+		}
+	}
+	else {
+		/* move cdb into place */
+		if ( (rename( tmpfile, v.dbname )) == -1 ) {
+			debug( 0, LOC, "Unable to move temp cdb into place: %s", strerror(errno) );
+			return( 1 );
+		}
+		debug( 0, LOC, "Added %d rules to %s.\n", parsed, v.dbname );
 	}
 
-	debug( 0, LOC, "Added %d rules to %s.\n", parsed, v.dbname );
 	return( 0 );
 }
 
@@ -169,7 +190,7 @@
 		vlen = cdb_datalen( &v.db );
 
 		/* pull the value from the db */
-		if ( (val = calloc( vlen, sizeof(char) )) == NULL ) {
+		if ( (val = calloc( vlen+1, sizeof(char) )) == NULL ) {
 			debug( 5, LOC, "Unable to allocate memory for DB value storage: %s\n",
 					strerror(errno) );
 			return( NULL );
@@ -179,6 +200,7 @@
 		/* check it against the request */
 		debug( 4, LOC, "DB match for key '%s': %s\n", key, val );
 		rule = parse_rule( val );
+
 		free( val );
 		if ( rule != NULL ) {
 			if ( check_rule( rule, p_request ) == 0 ) {