Skip to content

Commit d4808a7

Browse files
authored
Merge pull request #8389 from hvitved/ruby/regex-unique-get-value
Ruby: Avoid multiple `RegExpEscape::getValue` results
2 parents 5de2e24 + 76663f8 commit d4808a7

File tree

6 files changed

+100
-2
lines changed

6 files changed

+100
-2
lines changed

ruby/ql/consistency-queries/RegExpConsistency.ql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ query predicate nonConsecutive(RegExpParent parent, int i) {
1212
i > 0 and
1313
not exists(parent.getChild(i - 1))
1414
}
15+
16+
query predicate regExpNormalNonUniqueCharValue(RegExpNormalChar term, string value) {
17+
value = term.getValue() and
18+
strictcount(term.getValue()) > 1
19+
}

ruby/ql/lib/codeql/ruby/security/performance/RegExpTreeView.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,9 @@ class RegExpEscape extends RegExpNormalChar {
405405
result = this.getUnicode()
406406
}
407407

408-
predicate isIdentityEscape() { not this.getUnescaped() in ["n", "r", "t"] }
408+
predicate isIdentityEscape() {
409+
not this.getUnescaped() in ["n", "r", "t"] and not this.isUnicode()
410+
}
409411

410412
/**
411413
* Gets the text for this escape. That is e.g. "\w".

ruby/ql/test/library-tests/regexp/parse.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,3 +485,5 @@ regexp.rb:
485485
# 75| [RegExpNamedCharacterProperty] [:digit:]
486486

487487
# 79| [RegExpConstant, RegExpNormalChar] abc
488+
489+
# 82| [RegExpConstant, RegExpEscape] \u{987

ruby/ql/test/library-tests/regexp/regexp.expected

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,85 @@ term
189189
| regexp.rb:72:17:72:17 | f | RegExpConstant,RegExpNormalChar |
190190
| regexp.rb:75:2:75:10 | [:digit:] | RegExpNamedCharacterProperty |
191191
| regexp.rb:79:2:79:4 | abc | RegExpConstant,RegExpNormalChar |
192+
| regexp.rb:82:2:82:7 | \\u{987 | RegExpConstant,RegExpEscape |
193+
regExpNormalCharValue
194+
| regexp.rb:5:2:5:4 | abc | abc |
195+
| regexp.rb:8:2:8:2 | a | a |
196+
| regexp.rb:8:4:8:4 | b | b |
197+
| regexp.rb:8:6:8:6 | c | c |
198+
| regexp.rb:8:8:8:8 | d | d |
199+
| regexp.rb:9:2:9:2 | a | a |
200+
| regexp.rb:10:2:10:2 | a | a |
201+
| regexp.rb:11:2:11:2 | a | a |
202+
| regexp.rb:12:2:12:2 | a | a |
203+
| regexp.rb:15:2:15:4 | foo | foo |
204+
| regexp.rb:15:6:15:8 | bar | bar |
205+
| regexp.rb:18:3:18:3 | a | a |
206+
| regexp.rb:18:4:18:4 | b | b |
207+
| regexp.rb:18:5:18:5 | c | c |
208+
| regexp.rb:19:3:19:3 | a | a |
209+
| regexp.rb:19:5:19:5 | f | f |
210+
| regexp.rb:19:6:19:6 | A | A |
211+
| regexp.rb:19:8:19:8 | F | F |
212+
| regexp.rb:19:9:19:9 | 0 | 0 |
213+
| regexp.rb:19:11:19:11 | 9 | 9 |
214+
| regexp.rb:19:12:19:12 | _ | _ |
215+
| regexp.rb:20:5:20:5 | + | + |
216+
| regexp.rb:20:6:20:6 | - | - |
217+
| regexp.rb:20:9:20:10 | \\d | d |
218+
| regexp.rb:21:3:21:4 | \\w | w |
219+
| regexp.rb:22:2:22:3 | \\[ | [ |
220+
| regexp.rb:22:4:22:5 | \\] | ] |
221+
| regexp.rb:22:7:22:7 | 1 | 1 |
222+
| regexp.rb:22:8:22:8 | 2 | 2 |
223+
| regexp.rb:22:9:22:9 | 3 | 3 |
224+
| regexp.rb:23:4:23:4 | A | A |
225+
| regexp.rb:23:6:23:6 | Z | Z |
226+
| regexp.rb:24:3:24:3 | ] | ] |
227+
| regexp.rb:25:4:25:4 | ] | ] |
228+
| regexp.rb:26:4:26:4 | - | - |
229+
| regexp.rb:27:3:27:3 | \| | \| |
230+
| regexp.rb:30:3:30:3 | [ | [ |
231+
| regexp.rb:30:4:30:4 | a | a |
232+
| regexp.rb:30:6:30:6 | f | f |
233+
| regexp.rb:30:8:30:11 | A-F] | A-F] |
234+
| regexp.rb:35:2:35:3 | \\w | w |
235+
| regexp.rb:35:5:35:6 | \\W | W |
236+
| regexp.rb:36:2:36:3 | \\s | s |
237+
| regexp.rb:36:4:36:5 | \\S | S |
238+
| regexp.rb:37:2:37:3 | \\d | d |
239+
| regexp.rb:37:4:37:5 | \\D | D |
240+
| regexp.rb:38:2:38:3 | \\h | h |
241+
| regexp.rb:38:4:38:5 | \\H | H |
242+
| regexp.rb:39:2:39:3 | \\n | \n |
243+
| regexp.rb:39:4:39:5 | \\r | \r |
244+
| regexp.rb:39:6:39:7 | \\t | \t |
245+
| regexp.rb:42:4:42:6 | abc | abc |
246+
| regexp.rb:43:4:43:5 | !a | !a |
247+
| regexp.rb:46:3:46:5 | foo | foo |
248+
| regexp.rb:46:8:46:10 | bar | bar |
249+
| regexp.rb:47:2:47:3 | fo | fo |
250+
| regexp.rb:47:5:47:5 | o | o |
251+
| regexp.rb:47:7:47:7 | b | b |
252+
| regexp.rb:47:9:47:10 | ar | ar |
253+
| regexp.rb:48:3:48:3 | a | a |
254+
| regexp.rb:48:5:48:5 | b | b |
255+
| regexp.rb:48:7:48:8 | cd | cd |
256+
| regexp.rb:48:10:48:10 | e | e |
257+
| regexp.rb:49:5:49:5 | : | : |
258+
| regexp.rb:49:8:49:9 | \\w | w |
259+
| regexp.rb:52:8:52:9 | \\w | w |
260+
| regexp.rb:53:9:53:9 | f | f |
261+
| regexp.rb:53:10:53:10 | o | o |
262+
| regexp.rb:56:3:56:3 | a | a |
263+
| regexp.rb:56:6:56:6 | b | b |
264+
| regexp.rb:57:9:57:9 | q | q |
265+
| regexp.rb:57:12:57:13 | \\s | s |
266+
| regexp.rb:63:3:63:3 | a | a |
267+
| regexp.rb:63:5:63:5 | f | f |
268+
| regexp.rb:72:3:72:3 | A | A |
269+
| regexp.rb:72:5:72:5 | F | F |
270+
| regexp.rb:72:15:72:15 | a | a |
271+
| regexp.rb:72:17:72:17 | f | f |
272+
| regexp.rb:79:2:79:4 | abc | abc |
273+
| regexp.rb:82:2:82:7 | \\u{987 | \u0987 |

ruby/ql/test/library-tests/regexp/regexp.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ query predicate groupName(RegExpGroup g, string name) { name = g.getName() }
55
query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() }
66

77
query predicate term(RegExpTerm term, string c) { c = term.getPrimaryQlClasses() }
8+
9+
query predicate regExpNormalCharValue(RegExpNormalChar term, string value) {
10+
value = term.getValue()
11+
}

ruby/ql/test/library-tests/regexp/regexp.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,7 @@
7676

7777
# Simple constant interpolation
7878
A = "a"
79-
/#{A}bc/
79+
/#{A}bc/
80+
81+
# unicode
82+
/\u{9879}/

0 commit comments

Comments
 (0)