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