durable_rules 2.0.22 → 2.0.27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/librb/durable.rb +6 -3
- data/src/rules/events.c +57 -3
- data/src/rules/json.c +6 -0
- data/src/rules/regex.c +19 -8
- data/src/rules/rete.c +1 -0
- data/src/rules/rete.h +1 -1
- data/src/rules/rules.h +4 -1
- data/src/rules/state.c +11 -2
- data/src/rules/state.h +7 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 718b325b66f1671880337e82b9c0733e69d86710
|
4
|
+
data.tar.gz: 8b76eef7e27b274415db71c511ceab15b982b7ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee85bce7113af542f36608b2bec47e3f00397f8c5bff5b6ed123b55512d5504f40a151df58b04d7f2970ae9a814c0625c8831e41194fe1433a7b7e8292638b28
|
7
|
+
data.tar.gz: f4cee04af0c0b941831cdc9fbf0ef2df5403c39c05fc522bd440653ab322b96fad08b051aa4047972a9f3cd77ff3d9ea2f0a4dc8a0c69ba69f96389e46a0ccde
|
data/librb/durable.rb
CHANGED
data/src/rules/events.c
CHANGED
@@ -486,13 +486,67 @@ static unsigned int reduceExpression(ruleset *tree,
|
|
486
486
|
|
487
487
|
if (currentExpression->right.type == JSON_REGEX || currentExpression->right.type == JSON_IREGEX) {
|
488
488
|
targetProperty->type = JSON_BOOL;
|
489
|
+
targetProperty->value.b = 0;
|
490
|
+
|
491
|
+
char *leftString = "";
|
492
|
+
unsigned short leftLength = 0;
|
493
|
+
switch(leftProperty->type) {
|
494
|
+
case JSON_INT:
|
495
|
+
{
|
496
|
+
#ifdef _WIN32
|
497
|
+
leftString = (char *)_alloca(sizeof(char)*(MAX_INT_LENGTH + 1));
|
498
|
+
sprintf_s(leftString, sizeof(char)*(MAX_INT_LENGTH + 1), "%lld", leftProperty->value.i);
|
499
|
+
#else
|
500
|
+
char newString[MAX_INT_LENGTH + 1];
|
501
|
+
leftString = newString;
|
502
|
+
snprintf(leftString, sizeof(char)*(MAX_INT_LENGTH + 1), "%lld", leftProperty->value.i);
|
503
|
+
#endif
|
504
|
+
leftLength = strlen(leftString);
|
505
|
+
break;
|
506
|
+
}
|
507
|
+
case JSON_DOUBLE:
|
508
|
+
{
|
509
|
+
#ifdef _WIN32
|
510
|
+
leftString = (char *)_alloca(sizeof(char)*(MAX_DOUBLE_LENGTH + 1));
|
511
|
+
sprintf_s(leftString, sizeof(char)*(MAX_DOUBLE_LENGTH + 1), "%f", leftProperty->value.d);
|
512
|
+
#else
|
513
|
+
char newString[MAX_DOUBLE_LENGTH + 1];
|
514
|
+
leftString = newString;
|
515
|
+
snprintf(leftString, sizeof(char)*(MAX_DOUBLE_LENGTH + 1), "%f", leftProperty->value.d);
|
516
|
+
#endif
|
517
|
+
leftLength = strlen(leftString);
|
518
|
+
break;
|
519
|
+
}
|
520
|
+
case JSON_BOOL:
|
521
|
+
if (leftProperty->value.b) {
|
522
|
+
leftString = "true";
|
523
|
+
leftLength = 4;
|
524
|
+
}
|
525
|
+
else {
|
526
|
+
leftString = "false";
|
527
|
+
leftLength = 5;
|
528
|
+
}
|
529
|
+
|
530
|
+
break;
|
531
|
+
case JSON_NIL:
|
532
|
+
leftString = "nil";
|
533
|
+
leftLength = 3;
|
534
|
+
break;
|
535
|
+
case JSON_STRING:
|
536
|
+
leftString = leftProperty->value.s;
|
537
|
+
leftLength = leftProperty->valueLength;
|
538
|
+
break;
|
539
|
+
}
|
540
|
+
|
489
541
|
targetProperty->value.b = evaluateRegex(tree,
|
490
|
-
|
491
|
-
|
542
|
+
leftString,
|
543
|
+
leftLength,
|
492
544
|
(currentExpression->right.type == JSON_REGEX) ? 0 : 1,
|
493
545
|
currentExpression->right.value.regex.vocabularyLength,
|
494
546
|
currentExpression->right.value.regex.statesLength,
|
495
547
|
currentExpression->right.value.regex.stateMachineOffset);
|
548
|
+
|
549
|
+
|
496
550
|
return RULES_OK;
|
497
551
|
}
|
498
552
|
|
@@ -1533,7 +1587,7 @@ static unsigned int isArrayMatch(ruleset *tree,
|
|
1533
1587
|
jsonProperty *currentProperty,
|
1534
1588
|
alpha *arrayAlpha,
|
1535
1589
|
unsigned char *propertyMatch) {
|
1536
|
-
|
1590
|
+
*propertyMatch = 0;
|
1537
1591
|
unsigned int result = RULES_OK;
|
1538
1592
|
if (currentProperty->type != JSON_ARRAY) {
|
1539
1593
|
return RULES_OK;
|
data/src/rules/json.c
CHANGED
@@ -132,6 +132,12 @@ unsigned int readNextArrayValue(char *start, char **first, char **last, unsigned
|
|
132
132
|
}
|
133
133
|
break;
|
134
134
|
case ST_OBJECT_PROP_VAL:
|
135
|
+
if (start[0] == ']') {
|
136
|
+
*first = start;
|
137
|
+
*last = start;
|
138
|
+
return PARSE_END;
|
139
|
+
}
|
140
|
+
|
135
141
|
return getValue(start, first, last, type);
|
136
142
|
break;
|
137
143
|
}
|
data/src/rules/regex.c
CHANGED
@@ -23,6 +23,7 @@
|
|
23
23
|
#define MAX_SET 8192
|
24
24
|
#define MAX_LIST 1024
|
25
25
|
#define MAX_INTERVAL 100
|
26
|
+
#define MAX_REFCOUNT 1000
|
26
27
|
|
27
28
|
|
28
29
|
#define CREATE_QUEUE(type) \
|
@@ -597,10 +598,6 @@ static unsigned int linkStates(state *previousState,
|
|
597
598
|
previousState->transitions[previousState->transitionsLength].next = nextState;
|
598
599
|
++previousState->transitionsLength;
|
599
600
|
++nextState->refCount;
|
600
|
-
if (previousState->transitionsLength == MAX_TRANSITIONS) {
|
601
|
-
return ERR_REGEX_MAX_TRANSITIONS;
|
602
|
-
}
|
603
|
-
|
604
601
|
return RULES_OK;
|
605
602
|
}
|
606
603
|
|
@@ -852,10 +849,18 @@ static unsigned int validateGraph(char **first, char *last) {
|
|
852
849
|
switch (currentToken.type) {
|
853
850
|
case REGEX_SYMBOL:
|
854
851
|
case REGEX_UNION:
|
855
|
-
case REGEX_STAR:
|
856
852
|
case REGEX_PLUS:
|
857
|
-
case REGEX_QUESTION:
|
858
853
|
break;
|
854
|
+
case REGEX_STAR:
|
855
|
+
case REGEX_QUESTION:
|
856
|
+
{
|
857
|
+
char *nextFirst = *first;
|
858
|
+
token nextToken;
|
859
|
+
unsigned int nextResult = readNextToken(&nextFirst, last, &nextToken);
|
860
|
+
if (nextResult == REGEX_PARSE_OK && nextToken.type == REGEX_STAR) {
|
861
|
+
return ERR_REGEX_INVALID;
|
862
|
+
}
|
863
|
+
}
|
859
864
|
case REGEX_REGEX:
|
860
865
|
result = validateGraph(first, last);
|
861
866
|
if (result != REGEX_PARSE_OK) {
|
@@ -1141,7 +1146,7 @@ static unsigned int transformToDFA(state *nfa,
|
|
1141
1146
|
}
|
1142
1147
|
}
|
1143
1148
|
|
1144
|
-
DEQUEUE(¤tState);
|
1149
|
+
DEQUEUE(¤tState);
|
1145
1150
|
}
|
1146
1151
|
|
1147
1152
|
return RULES_OK;
|
@@ -1255,7 +1260,7 @@ static unsigned int packGraph(state *start,
|
|
1255
1260
|
for (int i = 0; i < currentState->transitionsLength; ++ i) {
|
1256
1261
|
transition *currentTransition = ¤tState->transitions[i];
|
1257
1262
|
unsigned int currentTransitionSymbol = currentTransition->symbol;
|
1258
|
-
if (caseInsensitive) {
|
1263
|
+
if (caseInsensitive && currentTransitionSymbol != REGEX_DOT) {
|
1259
1264
|
currentTransitionSymbol = tolower(currentTransitionSymbol);
|
1260
1265
|
}
|
1261
1266
|
|
@@ -1343,6 +1348,12 @@ unsigned int compileRegex(void *tree,
|
|
1343
1348
|
if (result != RULES_OK) {
|
1344
1349
|
return result;
|
1345
1350
|
}
|
1351
|
+
|
1352
|
+
if (!*vocabularyLength || !*statesLength) {
|
1353
|
+
return ERR_REGEX_INVALID;
|
1354
|
+
}
|
1355
|
+
|
1356
|
+
|
1346
1357
|
void *newStateMachine;
|
1347
1358
|
result = storeRegexStateMachine((ruleset *)tree,
|
1348
1359
|
*vocabularyLength,
|
data/src/rules/rete.c
CHANGED
data/src/rules/rete.h
CHANGED
data/src/rules/rules.h
CHANGED
@@ -33,6 +33,8 @@
|
|
33
33
|
#define ERR_NO_ACTION_AVAILABLE 310
|
34
34
|
#define ERR_PROPERTY_NOT_FOUND 311
|
35
35
|
#define ERR_OPERATION_NOT_SUPPORTED 312
|
36
|
+
#define ERR_EVENT_MAX_OBJECT_SIZE 313
|
37
|
+
#define ERR_EVENT_MAX_OBJECT_PROPERTY_SIZE 314
|
36
38
|
#define ERR_PARSE_REGEX 501
|
37
39
|
#define ERR_REGEX_MAX_TRANSITIONS 502
|
38
40
|
#define ERR_REGEX_MAX_STATES 503
|
@@ -40,6 +42,7 @@
|
|
40
42
|
#define ERR_REGEX_LIST_FULL 505
|
41
43
|
#define ERR_REGEX_SET_FULL 506
|
42
44
|
#define ERR_REGEX_CONFLICT 507
|
45
|
+
#define ERR_REGEX_INVALID 508
|
43
46
|
|
44
47
|
#define NEXT_BUCKET_LENGTH 512
|
45
48
|
#define NEXT_LIST_LENGTH 128
|
@@ -63,7 +66,7 @@ typedef struct handleEntry {
|
|
63
66
|
unsigned int nextEmptyEntry;
|
64
67
|
} handleEntry;
|
65
68
|
|
66
|
-
handleEntry handleEntries[MAX_HANDLES];
|
69
|
+
extern handleEntry handleEntries[MAX_HANDLES];
|
67
70
|
extern unsigned int firstEmptyEntry;
|
68
71
|
extern unsigned int lastEmptyEntry;
|
69
72
|
extern char entriesInitialized;
|
data/src/rules/state.c
CHANGED
@@ -1378,8 +1378,17 @@ unsigned int getObjectProperty(jsonObject *jo,
|
|
1378
1378
|
unsigned int setObjectProperty(jsonObject *jo,
|
1379
1379
|
unsigned int hash,
|
1380
1380
|
unsigned char type,
|
1381
|
-
unsigned
|
1382
|
-
unsigned
|
1381
|
+
unsigned int valueOffset,
|
1382
|
+
unsigned int valueLength) {
|
1383
|
+
|
1384
|
+
if (valueLength >= MAX_OBJECT_PROPERTY_SIZE) {
|
1385
|
+
return ERR_EVENT_MAX_OBJECT_PROPERTY_SIZE;
|
1386
|
+
}
|
1387
|
+
|
1388
|
+
if (valueOffset >= (MAX_OBJECT_SIZE - MAX_OBJECT_PROPERTY_SIZE)) {
|
1389
|
+
return ERR_EVENT_MAX_OBJECT_SIZE;
|
1390
|
+
}
|
1391
|
+
|
1383
1392
|
jsonProperty *property = &jo->properties[jo->propertiesLength];
|
1384
1393
|
++jo->propertiesLength;
|
1385
1394
|
if (jo->propertiesLength == MAX_OBJECT_PROPERTIES) {
|
data/src/rules/state.h
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
#include <time.h>
|
2
|
+
#include <time.h>
|
3
3
|
|
4
4
|
#define HASH_ID 926444256
|
5
5
|
#define HASH_SID 3593476751
|
@@ -18,6 +18,8 @@
|
|
18
18
|
|
19
19
|
#define UNDEFINED_HASH_OFFSET 0
|
20
20
|
#define MAX_OBJECT_PROPERTIES 255
|
21
|
+
#define MAX_OBJECT_SIZE 4294967296
|
22
|
+
#define MAX_OBJECT_PROPERTY_SIZE 16777216
|
21
23
|
#define MAX_MESSAGE_FRAMES 16
|
22
24
|
#define MAX_MESSAGE_INDEX_LENGTH 512
|
23
25
|
#define MAX_LEFT_FRAME_INDEX_LENGTH 512
|
@@ -64,8 +66,8 @@ typedef struct pool {
|
|
64
66
|
typedef struct jsonProperty {
|
65
67
|
unsigned int hash;
|
66
68
|
unsigned char type;
|
67
|
-
unsigned
|
68
|
-
unsigned
|
69
|
+
unsigned int valueOffset;
|
70
|
+
unsigned int valueLength;
|
69
71
|
union {
|
70
72
|
long long i;
|
71
73
|
double d;
|
@@ -193,8 +195,8 @@ unsigned int getObjectProperty(jsonObject *jo,
|
|
193
195
|
unsigned int setObjectProperty(jsonObject *jo,
|
194
196
|
unsigned int hash,
|
195
197
|
unsigned char type,
|
196
|
-
unsigned
|
197
|
-
unsigned
|
198
|
+
unsigned int valueOffset,
|
199
|
+
unsigned int valueLength);
|
198
200
|
|
199
201
|
unsigned int constructObject(char *root,
|
200
202
|
char *parentName,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: durable_rules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.27
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesus Ruiz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|