File tree Expand file tree Collapse file tree 2 files changed +69
-2
lines changed
lib/codeql/ruby/frameworks/core
test/library-tests/dataflow/hash-flow Expand file tree Collapse file tree 2 files changed +69
-2
lines changed Original file line number Diff line number Diff line change @@ -337,7 +337,11 @@ private class FetchValuesUnknownSummary extends FetchValuesSummary {
337
337
}
338
338
339
339
private class MergeSummary extends SimpleSummarizedCallable {
340
- MergeSummary ( ) { this = "merge" }
340
+ MergeSummary ( ) {
341
+ // deep_merge is an ActiveSupport extension
342
+ // https://api.rubyonrails.org/classes/Hash.html#method-i-deep_merge
343
+ this = [ "merge" , "deep_merge" ]
344
+ }
341
345
342
346
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
343
347
(
@@ -352,7 +356,11 @@ private class MergeSummary extends SimpleSummarizedCallable {
352
356
}
353
357
354
358
private class MergeBangSummary extends SimpleSummarizedCallable {
355
- MergeBangSummary ( ) { this = [ "merge!" , "update" ] }
359
+ MergeBangSummary ( ) {
360
+ // deep_merge! is an ActiveSupport extension
361
+ // https://api.rubyonrails.org/classes/Hash.html#method-i-deep_merge-21
362
+ this = [ "merge!" , "deep_merge!" , "update" ]
363
+ }
356
364
357
365
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
358
366
(
Original file line number Diff line number Diff line change @@ -783,3 +783,62 @@ def m46(x)
783
783
end
784
784
785
785
m46 ( :c )
786
+
787
+ def m47 ( )
788
+ hash1 = {
789
+ :a => taint ( 47.1 ) ,
790
+ :b => 1 ,
791
+ :c => taint ( 47.2 )
792
+ }
793
+ hash2 = {
794
+ :d => taint ( 47.3 ) ,
795
+ :e => 1 ,
796
+ :f => taint ( 47.4 )
797
+ }
798
+ hash = hash1 . deep_merge ( hash2 ) do |key , old_value , new_value |
799
+ sink key
800
+ sink old_value # $ hasValueFlow=47.1 $ hasValueFlow=47.2 $ hasValueFlow=47.3 $ hasValueFlow=47.4
801
+ sink new_value # $ hasValueFlow=47.1 $ hasValueFlow=47.2 $ hasValueFlow=47.3 $ hasValueFlow=47.4
802
+ end
803
+ sink ( hash [ :a ] ) # $ hasValueFlow=47.1
804
+ sink ( hash [ :b ] )
805
+ sink ( hash [ :c ] ) # $ hasValueFlow=47.2
806
+ sink ( hash [ :d ] ) # $ hasValueFlow=47.3
807
+ sink ( hash [ :e ] )
808
+ sink ( hash [ :f ] ) # $ hasValueFlow=47.4
809
+ end
810
+
811
+ m47 ( )
812
+
813
+ def m48 ( )
814
+ hash1 = {
815
+ :a => taint ( 48.1 ) ,
816
+ :b => 1 ,
817
+ :c => taint ( 48.2 )
818
+ }
819
+ hash2 = {
820
+ :d => taint ( 48.3 ) ,
821
+ :e => 1 ,
822
+ :f => taint ( 48.4 )
823
+ }
824
+ hash = hash1 . deep_merge! ( hash2 ) do |key , old_value , new_value |
825
+ sink key
826
+ sink old_value # $ hasValueFlow=48.1 $ hasValueFlow=48.2 $ hasValueFlow=48.3 $ hasValueFlow=48.4
827
+ sink new_value # $ hasValueFlow=48.1 $ hasValueFlow=48.2 $ hasValueFlow=48.3 $ hasValueFlow=48.4
828
+ end
829
+ sink ( hash [ :a ] ) # $ hasValueFlow=48.1
830
+ sink ( hash [ :b ] )
831
+ sink ( hash [ :c ] ) # $ hasValueFlow=48.2
832
+ sink ( hash [ :d ] ) # $ hasValueFlow=48.3
833
+ sink ( hash [ :e ] )
834
+ sink ( hash [ :f ] ) # $ hasValueFlow=48.4
835
+
836
+ sink ( hash1 [ :a ] ) # $ hasValueFlow=48.1
837
+ sink ( hash1 [ :b ] )
838
+ sink ( hash1 [ :c ] ) # $ hasValueFlow=48.2
839
+ sink ( hash1 [ :d ] ) # $ hasValueFlow=48.3
840
+ sink ( hash1 [ :e ] )
841
+ sink ( hash1 [ :f ] ) # $ hasValueFlow=48.4
842
+ end
843
+
844
+ m48 ( )
You can’t perform that action at this time.
0 commit comments