Browse code

Split out the ldb loader core into a helper, so that it can be used in the bytecode loader.

Török Edvin authored on 2009/09/22 02:28:15
Showing 2 changed files
... ...
@@ -420,7 +420,9 @@ static int parseLSig(struct cli_bc *bc, unsigned char *buffer)
420 420
 	return CL_EMALFDB;
421 421
     }
422 422
     bc->lsig = NULL;
423
-    bc->lsig = cli_strdup(buffer + 1);
423
+    if (!buffer[1])
424
+	return CL_SUCCESS;
425
+    bc->lsig = cli_strdup(buffer);
424 426
     return CL_SUCCESS;
425 427
 }
426 428
 
... ...
@@ -848,153 +848,150 @@ static int lsigattribs(char *attribs, struct cli_lsig_tdb *tdb)
848 848
   } while(0);
849 849
 
850 850
 #define LDB_TOKENS 67
851
-static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
851
+static int load_oneldb(char *buffer, int chkpua, int chkign, struct cl_engine *engine, unsigned int options, const char *dbname, unsigned line, unsigned *sigs)
852 852
 {
853
-	char *tokens[LDB_TOKENS];
854
-	char buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1], *pt;
855
-	const char *sig, *virname, *offset, *logic;
856
-	struct cli_matcher *root;
857
-	unsigned int line = 0, sigs = 0;
858
-	unsigned short target = 0;
859
-	struct cli_ac_lsig **newtable, *lsig;
860
-	uint32_t lsigid[2];
861
-	int ret = CL_SUCCESS, i, subsigs, tokens_count;
862
-	struct cli_lsig_tdb tdb;
853
+    const char *sig, *virname, *offset, *logic;
854
+    struct cli_ac_lsig **newtable, *lsig;
855
+    char *tokens[LDB_TOKENS], *pt;
856
+    int i, subsigs, tokens_count;
857
+    unsigned short target = 0;
858
+    struct cli_matcher *root;
859
+    struct cli_lsig_tdb tdb;
860
+    uint32_t lsigid[2];
861
+    int ret;
862
+
863
+    tokens_count = cli_strtokenize(buffer, ';', LDB_TOKENS, (const char **) tokens);
864
+    if(tokens_count < 4) {
865
+	return CL_EMALFDB;
866
+    }
867
+    virname = tokens[0];
868
+    logic = tokens[2];
863 869
 
870
+    if (chkpua && cli_chkpua(virname, engine->pua_cats, options))
871
+	    return CL_SUCCESS;
864 872
 
865
-    if((ret = cli_initroots(engine, options)))
866
-	return ret;
873
+    if (chkign && cli_chkign(engine->ignored, dbname, line, virname))
874
+	return CL_SUCCESS;
867 875
 
868
-    while(cli_dbgets(buffer, sizeof(buffer), fs, dbio)) {
869
-	line++;
870
-	sigs++;
871
-	cli_chomp(buffer);
876
+    subsigs = cli_ac_chklsig(logic, logic + strlen(logic), NULL, NULL, NULL, 1);
877
+    if(subsigs == -1) {
878
+	return CL_EMALFDB;
879
+    }
880
+    subsigs++;
881
+    if(subsigs > 64) {
882
+	cli_errmsg("cli_loadldb: Broken logical expression or too many subsignatures\n");
883
+	return CL_EMALFDB;
884
+    }
872 885
 
873
-	tokens_count = cli_strtokenize(buffer, ';', LDB_TOKENS, (const char **) tokens);
874
-	if(tokens_count < 4) {
875
-	    ret = CL_EMALFDB;
876
-	    break;
877
-	}
886
+    /* TDB */
887
+    memset(&tdb, 0, sizeof(tdb));
888
+#ifdef USE_MPOOL
889
+    tdb.mempool = engine->mempool;
890
+#endif
891
+    if(lsigattribs(tokens[1], &tdb) == -1) {
892
+	FREE_TDB(tdb);
893
+	return CL_EMALFDB;
894
+    }
895
+    if(!tdb.target) {
896
+	cli_errmsg("cli_loadldb: No target specified in TDB\n");
897
+	FREE_TDB(tdb);
898
+	return CL_EMALFDB;
899
+    } else if(tdb.target[0] >= CLI_MTARGETS) {
900
+	cli_dbgmsg("cli_loadldb: Not supported target type in logical signature for %s\n", virname);
901
+	FREE_TDB(tdb);
902
+	*sigs--;
903
+	return CL_SUCCESS;
904
+    }
878 905
 
879
-	virname = tokens[0];
880
-	logic = tokens[2];
906
+    root = engine->root[tdb.target[0]];
881 907
 
882
-	if(engine->pua_cats && (options & CL_DB_PUA_MODE) && (options & (CL_DB_PUA_INCLUDE | CL_DB_PUA_EXCLUDE)))
883
-	    if(cli_chkpua(virname, engine->pua_cats, options))
884
-		continue;
908
+    lsig = (struct cli_ac_lsig *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_ac_lsig));
909
+    if(!lsig) {
910
+	cli_errmsg("cli_loadldb: Can't allocate memory for lsig\n");
911
+	FREE_TDB(tdb);
912
+	return CL_EMEM;
913
+    }
885 914
 
886
-	if(engine->ignored && cli_chkign(engine->ignored, dbname, line, virname))
887
-	    continue;
915
+    lsig->logic = cli_mpool_strdup(engine->mempool, logic);
916
+    if(!lsig->logic) {
917
+	cli_errmsg("cli_loadldb: Can't allocate memory for lsig->logic\n");
918
+	FREE_TDB(tdb);
919
+	mpool_free(engine->mempool, lsig);
920
+	return CL_EMEM;
921
+    }
888 922
 
889
-	subsigs = cli_ac_chklsig(logic, logic + strlen(logic), NULL, NULL, NULL, 1);
890
-	if(subsigs == -1) {
891
-	    ret = CL_EMALFDB;
892
-	    break;
893
-	}
894
-	subsigs++;
923
+    lsigid[0] = lsig->id = root->ac_lsigs;
924
+    memcpy(&lsig->tdb, &tdb, sizeof(tdb));
895 925
 
896
-	if(subsigs > 64) {
897
-	    cli_errmsg("cli_loadldb: Broken logical expression or too many subsignatures\n");
898
-	    ret = CL_EMALFDB;
899
-	    break;
926
+    root->ac_lsigs++;
927
+    newtable = (struct cli_ac_lsig **) mpool_realloc(engine->mempool, root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
928
+    if(!newtable) {
929
+	root->ac_lsigs--;
930
+	cli_errmsg("cli_loadldb: Can't realloc root->ac_lsigtable\n");
931
+	FREE_TDB(tdb);
932
+	mpool_free(engine->mempool, lsig);
933
+	return CL_EMEM;
934
+    }
935
+    newtable[root->ac_lsigs - 1] = lsig;
936
+    root->ac_lsigtable = newtable;
937
+
938
+    for(i = 0; i < subsigs; i++) {
939
+	if(i >= tokens_count) {
940
+	    cli_errmsg("cli_loadldb: Missing subsignature id %u\n", i);
941
+	    return CL_EMALFDB;
900 942
 	}
943
+	lsigid[1] = i;
944
+	sig = tokens[3 + i];
901 945
 
902
-	/* TDB */
903
-	memset(&tdb, 0, sizeof(tdb));
904
-#ifdef USE_MPOOL
905
-	tdb.mempool = engine->mempool;
906
-#endif
946
+	if((pt = strchr(tokens[3 + i], ':'))) {
947
+	    *pt = 0;
948
+	    sig = ++pt;
949
+	    offset = tokens[3 + i];
950
+	} else {
951
+	    offset = "*";
952
+	    sig = tokens[3 + i];
953
+	}
907 954
 
908
-	if(lsigattribs(tokens[1], &tdb) == -1) {
909
-	    FREE_TDB(tdb);
910
-	    ret = CL_EMALFDB;
911
-	    break;
955
+	if((ret = cli_parse_add(root, virname, sig, 0, 0, offset, target, lsigid, options))) {
956
+	    return CL_EMALFDB;
912 957
 	}
913 958
 
914 959
 	if(tdb.engine) {
915 960
 	    if(tdb.engine[0] > cl_retflevel()) {
916 961
 		cli_dbgmsg("cli_loadldb: Signature for %s not loaded (required f-level: %u)\n", virname, tdb.engine[0]);
917 962
 		FREE_TDB(tdb);
918
-		sigs--;
919
-		continue;
963
+		*sigs--;
964
+		return CL_SUCCESS;
920 965
 	    } else if(tdb.engine[1] < cl_retflevel()) {
921 966
 		FREE_TDB(tdb);
922
-		sigs--;
923
-		continue;
967
+		*sigs--;
968
+		return CL_SUCCESS;
924 969
 	    }
925 970
 	}
971
+    }
972
+    return CL_SUCCESS;
973
+}
926 974
 
927
-	if(!tdb.target) {
928
-	    cli_errmsg("cli_loadldb: No target specified in TDB\n");
929
-	    FREE_TDB(tdb);
930
-	    ret = CL_EMALFDB;
931
-	    break;
932
-	} else if(tdb.target[0] >= CLI_MTARGETS) {
933
-	    cli_dbgmsg("cli_loadldb: Not supported target type in logical signature for %s\n", virname);
934
-	    FREE_TDB(tdb);
935
-	    sigs--;
936
-	    continue;
937
-	}
938
-
939
-	root = engine->root[tdb.target[0]];
940
-
941
-	lsig = (struct cli_ac_lsig *) mpool_calloc(engine->mempool, 1, sizeof(struct cli_ac_lsig));
942
-	if(!lsig) {
943
-	    cli_errmsg("cli_loadldb: Can't allocate memory for lsig\n");
944
-	    FREE_TDB(tdb);
945
-	    ret = CL_EMEM;
946
-	    break;
947
-	}
948
-
949
-	lsig->logic = cli_mpool_strdup(engine->mempool, logic);
950
-	if(!lsig->logic) {
951
-	    cli_errmsg("cli_loadldb: Can't allocate memory for lsig->logic\n");
952
-	    FREE_TDB(tdb);
953
-	    ret = CL_EMEM;
954
-	    mpool_free(engine->mempool, lsig);
955
-	    break;
956
-	}
957
-
958
-	lsigid[0] = lsig->id = root->ac_lsigs;
959
-	memcpy(&lsig->tdb, &tdb, sizeof(tdb));
975
+static int cli_loadldb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
976
+{
977
+	char buffer[CLI_DEFAULT_LSIG_BUFSIZE + 1];
978
+	unsigned int line = 0, sigs = 0;
979
+	int ret;
960 980
 
961
-	root->ac_lsigs++;
962
-	newtable = (struct cli_ac_lsig **) mpool_realloc(engine->mempool, root->ac_lsigtable, root->ac_lsigs * sizeof(struct cli_ac_lsig *));
963
-	if(!newtable) {
964
-	    root->ac_lsigs--;
965
-	    cli_errmsg("cli_loadldb: Can't realloc root->ac_lsigtable\n");
966
-	    FREE_TDB(tdb);
967
-	    mpool_free(engine->mempool, lsig);
968
-	    ret = CL_EMEM;
969
-	    break;
970
-	}
971
-	newtable[root->ac_lsigs - 1] = lsig;
972
-	root->ac_lsigtable = newtable;
973 981
 
974
-	for(i = 0; i < subsigs; i++) {
975
-	    if(i >= tokens_count) {
976
-		cli_errmsg("cli_loadldb: Missing subsignature id %u\n", i);
977
-		ret = CL_EMALFDB;
978
-		break;
979
-	    }
980
-	    lsigid[1] = i;
981
-	    sig = tokens[3 + i];
982
+    if((ret = cli_initroots(engine, options)))
983
+	return ret;
982 984
 
983
-	    if((pt = strchr(tokens[3 + i], ':'))) {
984
-		*pt = 0;
985
-		sig = ++pt;
986
-		offset = tokens[3 + i];
987
-	    } else {
988
-		offset = "*";
989
-		sig = tokens[3 + i];
990
-	    }
985
+    while(cli_dbgets(buffer, sizeof(buffer), fs, dbio)) {
986
+	line++;
987
+	sigs++;
988
+	cli_chomp(buffer);
991 989
 
992
-	    if((ret = cli_parse_add(root, virname, sig, 0, 0, offset, target, lsigid, options))) {
993
-		ret = CL_EMALFDB;
994
-		break;
995
-	    }
996
-	}
997
-	if(ret)
990
+	ret = load_oneldb(buffer,
991
+			  engine->pua_cats && (options & CL_DB_PUA_MODE) && (options & (CL_DB_PUA_INCLUDE | CL_DB_PUA_EXCLUDE)),
992
+			  !!engine->ignored,
993
+			  engine, options, dbname, line, &sigs);
994
+	if (ret)
998 995
 	    break;
999 996
     }
1000 997
 
... ...
@@ -1034,6 +1031,10 @@ static int cli_loadcbc(FILE *fs, struct cl_engine *engine, unsigned int *signo,
1034 1034
 	fprintf(stderr,"Unable to load %s bytecode: %s\n", dbname, cl_strerror(rc));
1035 1035
 	return rc;
1036 1036
     }
1037
+    if (bc->lsig) {
1038
+	cli_dbgmsg("Bytecode %s has logical signature: %s\n", dbname, bc->lsig);
1039
+      	
1040
+    }
1037 1041
     return CL_SUCCESS;
1038 1042
 }
1039 1043