... | ... |
@@ -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 |
|