durable_rules 2.0.22 → 2.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea83e9efc9d1e06b799a9408e24dc95126cadcdc
4
- data.tar.gz: 9334d4fb5bbe5c97d8e46cf00a624adcd782af86
3
+ metadata.gz: 718b325b66f1671880337e82b9c0733e69d86710
4
+ data.tar.gz: 8b76eef7e27b274415db71c511ceab15b982b7ad
5
5
  SHA512:
6
- metadata.gz: 9240234e76cf597c487320d53ec9ebe9ba9a7ba65a0f64a685de3eb2b037457a11eb89fd61eca7dc4135aa473ae86dc92aebea8eb941d504270c4de29416e974
7
- data.tar.gz: 1056a380df74c2a30b266d33a09c6745bcd41b1b255e2f6a9628fb5c5d30db65c83606b45e7758d679f36a50026a9ea1ba98c94a308f51a323ace387ee3fd68e
6
+ metadata.gz: ee85bce7113af542f36608b2bec47e3f00397f8c5bff5b6ed123b55512d5504f40a151df58b04d7f2970ae9a814c0625c8831e41194fe1433a7b7e8292638b28
7
+ data.tar.gz: f4cee04af0c0b941831cdc9fbf0ef2df5403c39c05fc522bd440653ab322b96fad08b051aa4047972a9f3cd77ff3d9ea2f0a4dc8a0c69ba69f96389e46a0ccde
@@ -9,9 +9,12 @@ module Durable
9
9
  @@main_host = Engine::Host.new
10
10
  end
11
11
 
12
- @@main_host.register_rulesets @@rulesets
13
-
14
- @@rulesets = {}
12
+ begin
13
+ @@main_host.register_rulesets @@rulesets
14
+ ensure
15
+ @@rulesets = {}
16
+ end
17
+
15
18
  @@main_host
16
19
  end
17
20
 
@@ -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
- leftProperty->value.s,
491
- leftProperty->valueLength,
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;
@@ -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
  }
@@ -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(&currentState);
1149
+ DEQUEUE(&currentState);
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 = &currentState->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,
@@ -59,6 +59,7 @@
59
59
  } while(0)
60
60
 
61
61
 
62
+ handleEntry handleEntries[MAX_HANDLES];
62
63
  unsigned int firstEmptyEntry = 1;
63
64
  unsigned int lastEmptyEntry = MAX_HANDLES -1;
64
65
  char entriesInitialized = 0;
@@ -1,6 +1,6 @@
1
1
  #include "state.h"
2
2
 
3
- // #define _PRINT 1
3
+ //#define _PRINT 1
4
4
 
5
5
  #define OP_NOP 0
6
6
  #define OP_LT 0x01
@@ -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;
@@ -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 short valueOffset,
1382
- unsigned short valueLength) {
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) {
@@ -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 short valueOffset;
68
- unsigned short valueLength;
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 short valueOffset,
197
- unsigned short valueLength);
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.22
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-03-23 00:00:00.000000000 Z
11
+ date: 2020-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake