1
+ import org .apache .commons .lang3 .ArrayUtils ;
2
+ import java .io .StringReader ;
3
+ import java .nio .CharBuffer ;
4
+ import java .util .ArrayList ;
5
+ import java .util .List ;
6
+ import java .util .Locale ;
7
+
8
+ class ArrayUtilsTest {
9
+ String taint () { return "tainted" ; }
10
+
11
+ private static class IntSource {
12
+ static int taint () { return 0 ; }
13
+ }
14
+
15
+ void sink (Object o ) {}
16
+
17
+ void test () throws Exception {
18
+
19
+ // All methods of this class copy the input array, so the incoming array should not be assigned taint.
20
+ String [] alreadyTainted = new String [] { taint () };
21
+ String [] clean = new String [] { "Untainted" };
22
+
23
+ sink (ArrayUtils .add (clean , 0 , taint ())); // $hasTaintFlow
24
+ sink (ArrayUtils .add (alreadyTainted , 0 , "clean" )); // $hasTaintFlow
25
+ sink (ArrayUtils .add (clean , IntSource .taint (), "clean" )); // Index argument does not contribute taint
26
+ sink (ArrayUtils .add (clean , taint ())); // $hasTaintFlow
27
+ sink (ArrayUtils .add (alreadyTainted , "clean" )); // $hasTaintFlow
28
+ sink (ArrayUtils .addAll (clean , "clean" , taint ())); // $hasTaintFlow
29
+ sink (ArrayUtils .addAll (clean , taint (), "clean" )); // $hasTaintFlow
30
+ sink (ArrayUtils .addAll (alreadyTainted , "clean" , "also clean" )); // $hasTaintFlow
31
+ sink (ArrayUtils .addFirst (clean , taint ())); // $hasTaintFlow
32
+ sink (ArrayUtils .addFirst (alreadyTainted , "clean" )); // $hasTaintFlow
33
+ sink (ArrayUtils .clone (alreadyTainted )); // $hasTaintFlow
34
+ sink (ArrayUtils .get (alreadyTainted , 0 )); // $hasTaintFlow
35
+ sink (ArrayUtils .get (clean , IntSource .taint ())); // Index argument does not contribute taint
36
+ sink (ArrayUtils .get (alreadyTainted , 0 , "default value" )); // $hasTaintFlow
37
+ sink (ArrayUtils .get (clean , IntSource .taint (), "default value" )); // Index argument does not contribute taint
38
+ sink (ArrayUtils .get (clean , 0 , taint ())); // $hasTaintFlow
39
+ sink (ArrayUtils .insert (IntSource .taint (), clean , "value1" , "value2" )); // Index argument does not contribute taint
40
+ sink (ArrayUtils .insert (0 , alreadyTainted , "value1" , "value2" )); // $hasTaintFlow
41
+ sink (ArrayUtils .insert (0 , clean , taint (), "value2" )); // $hasTaintFlow
42
+ sink (ArrayUtils .insert (0 , clean , "value1" , taint ())); // $hasTaintFlow
43
+ sink (ArrayUtils .nullToEmpty (alreadyTainted )); // $hasTaintFlow
44
+ sink (ArrayUtils .nullToEmpty (alreadyTainted , String [].class )); // $hasTaintFlow
45
+ sink (ArrayUtils .remove (alreadyTainted , 0 )); // $hasTaintFlow
46
+ sink (ArrayUtils .remove (clean , IntSource .taint ())); // Index argument does not contribute taint
47
+ sink (ArrayUtils .removeAll (alreadyTainted , 0 , 1 )); // $hasTaintFlow
48
+ sink (ArrayUtils .removeAll (clean , IntSource .taint (), 1 )); // Index argument does not contribute taint
49
+ sink (ArrayUtils .removeAll (clean , 0 , IntSource .taint ())); // Index argument does not contribute taint
50
+ sink (ArrayUtils .removeAllOccurences (clean , taint ())); // Removed argument does not contribute taint
51
+ sink (ArrayUtils .removeAllOccurences (alreadyTainted , "value to remove" )); // $hasTaintFlow
52
+ sink (ArrayUtils .removeAllOccurrences (clean , taint ())); // Removed argument does not contribute taint
53
+ sink (ArrayUtils .removeAllOccurrences (alreadyTainted , "value to remove" )); // $hasTaintFlow
54
+ sink (ArrayUtils .removeElement (clean , taint ())); // Removed argument does not contribute taint
55
+ sink (ArrayUtils .removeElement (alreadyTainted , "value to remove" )); // $hasTaintFlow
56
+ sink (ArrayUtils .removeElements (alreadyTainted , 0 , 1 )); // $hasTaintFlow
57
+ sink (ArrayUtils .removeElements (clean , IntSource .taint (), 1 )); // Index argument does not contribute taint
58
+ sink (ArrayUtils .removeElements (clean , 0 , IntSource .taint ())); // Index argument does not contribute taint
59
+ sink (ArrayUtils .subarray (alreadyTainted , 0 , 0 )); // $hasTaintFlow
60
+ sink (ArrayUtils .subarray (clean , IntSource .taint (), IntSource .taint ())); // Index arguments do not contribute taint
61
+ sink (ArrayUtils .toArray ("clean" , taint ())); // $hasTaintFlow
62
+ sink (ArrayUtils .toArray (taint (), "clean" )); // $hasTaintFlow
63
+ sink (ArrayUtils .toMap (alreadyTainted ).get ("key" )); // $hasTaintFlow
64
+
65
+ // Check that none of the above had an effect on `clean`:
66
+ sink (clean );
67
+
68
+ int [] taintedInts = new int [] { IntSource .taint () };
69
+ Integer [] taintedBoxedInts = ArrayUtils .toObject (taintedInts );
70
+ sink (taintedBoxedInts ); // $hasTaintFlow
71
+ sink (ArrayUtils .toPrimitive (taintedBoxedInts )); // $hasTaintFlow
72
+ sink (ArrayUtils .toPrimitive (new Integer [] {}, IntSource .taint ())); // $hasTaintFlow
73
+
74
+ }
75
+ }
0 commit comments