Skip to content

Commit d5f675c

Browse files
committed
Fix unbound field
Add tests for non-exported providers
1 parent 99881db commit d5f675c

File tree

4 files changed

+183
-3
lines changed

4 files changed

+183
-3
lines changed

java/ql/lib/semmle/code/java/dataflow/FlowSources.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,10 @@ class ExportedAndroidIntentInput extends RemoteFlowSource, AndroidIntentInput {
252252
class AndroidContentProviderInput extends DataFlow::Node {
253253
AndroidContentProvider declaringType;
254254

255-
AndroidContentProviderInput() { sourceNode(this, "contentprovider") }
255+
AndroidContentProviderInput() {
256+
sourceNode(this, "contentprovider") and
257+
this.asParameter().getCallable().getDeclaringType() = declaringType
258+
}
256259
}
257260

258261
/** A parameter of an entry-point method declared in an exported `ContentProvider` class. */

java/ql/test/library-tests/frameworks/android/content-provider/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,10 @@
2727
android:name=".Test"
2828
android:authority="com.example.myapp.Test"
2929
android:exported="true" />
30+
31+
<provider
32+
android:name=".Safe"
33+
android:authority="com.example.myapp.Safe"
34+
android:exported="false" />
3035
</application>
3136
</manifest>
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package com.example.app;
2+
3+
import java.io.FileNotFoundException;
4+
import android.content.ContentProvider;
5+
import android.content.ContentValues;
6+
import android.content.res.AssetFileDescriptor;
7+
import android.database.Cursor;
8+
import android.net.Uri;
9+
import android.os.Bundle;
10+
import android.os.CancellationSignal;
11+
import android.os.ParcelFileDescriptor;
12+
import android.os.RemoteException;
13+
14+
// This Content Provider isn't exported, so there shouldn't be any flow
15+
public class Safe extends ContentProvider {
16+
17+
void sink(Object o) {}
18+
19+
@Override
20+
public Bundle call(String authority, String method, String arg, Bundle extras) {
21+
sink(authority);
22+
sink(method);
23+
sink(arg);
24+
sink(extras.get("some_key"));
25+
return null;
26+
}
27+
28+
public Bundle call(String method, String arg, Bundle extras) {
29+
sink(method);
30+
sink(arg);
31+
sink(extras.get("some_key"));
32+
return null;
33+
}
34+
35+
@Override
36+
public int delete(Uri uri, String selection, String[] selectionArgs) {
37+
sink(uri);
38+
sink(selection);
39+
sink(selectionArgs);
40+
return 0;
41+
}
42+
43+
@Override
44+
public int delete(Uri uri, Bundle extras) {
45+
sink(uri);
46+
sink(extras.get("some_key"));
47+
return 0;
48+
}
49+
50+
@Override
51+
public String getType(Uri uri) {
52+
sink(uri);
53+
return null;
54+
}
55+
56+
@Override
57+
public Uri insert(Uri uri, ContentValues values, Bundle extras) {
58+
sink(uri);
59+
sink(values);
60+
sink(extras.get("some_key"));
61+
return null;
62+
}
63+
64+
@Override
65+
public Uri insert(Uri uri, ContentValues values) {
66+
sink(uri);
67+
sink(values);
68+
return null;
69+
}
70+
71+
@Override
72+
public AssetFileDescriptor openAssetFile(Uri uri, String mode, CancellationSignal signal) {
73+
sink(uri);
74+
sink(mode);
75+
sink(signal);
76+
return null;
77+
}
78+
79+
@Override
80+
public AssetFileDescriptor openAssetFile(Uri uri, String mode) {
81+
sink(uri);
82+
sink(mode);
83+
return null;
84+
}
85+
86+
@Override
87+
public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts,
88+
CancellationSignal signal) throws RemoteException, FileNotFoundException {
89+
sink(uri);
90+
sink(mimeTypeFilter);
91+
sink(opts.get("some_key"));
92+
sink(signal);
93+
return null;
94+
}
95+
96+
@Override
97+
public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
98+
throws FileNotFoundException {
99+
sink(uri);
100+
sink(mimeTypeFilter);
101+
sink(opts.get("some_key"));
102+
return null;
103+
}
104+
105+
@Override
106+
public ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal) {
107+
sink(uri);
108+
sink(mode);
109+
sink(signal);
110+
return null;
111+
}
112+
113+
@Override
114+
public ParcelFileDescriptor openFile(Uri uri, String mode) {
115+
sink(uri);
116+
sink(mode);
117+
return null;
118+
}
119+
120+
@Override
121+
public Cursor query(Uri uri, String[] projection, Bundle queryArgs,
122+
CancellationSignal cancellationSignal) {
123+
sink(uri);
124+
sink(projection);
125+
sink(queryArgs.get("some_key"));
126+
sink(cancellationSignal);
127+
return null;
128+
}
129+
130+
@Override
131+
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
132+
String sortOrder) {
133+
sink(uri);
134+
sink(projection);
135+
sink(selection);
136+
sink(selectionArgs);
137+
return null;
138+
}
139+
140+
@Override
141+
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
142+
String sortOrder, CancellationSignal cancellationSignal) {
143+
sink(uri);
144+
sink(projection);
145+
sink(selection);
146+
sink(selectionArgs);
147+
sink(sortOrder);
148+
sink(cancellationSignal);
149+
return null;
150+
}
151+
152+
@Override
153+
public int update(Uri uri, ContentValues values, Bundle extras) {
154+
sink(uri);
155+
sink(values);
156+
sink(extras.get("some_key"));
157+
return 0;
158+
}
159+
160+
@Override
161+
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
162+
sink(uri);
163+
sink(values);
164+
sink(selection);
165+
sink(selectionArgs);
166+
return 0;
167+
}
168+
169+
170+
@Override
171+
public boolean onCreate() {
172+
return false;
173+
}
174+
}

java/ql/test/library-tests/frameworks/android/content-provider/test.ql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,4 @@ class ProviderTaintFlowConf extends DefaultTaintFlowConf {
88

99
class ProviderInlineFlowTest extends InlineFlowTest {
1010
override DataFlow::Configuration getValueFlowConfig() { none() }
11-
12-
override DataFlow::Configuration getTaintFlowConfig() { result instanceof ProviderTaintFlowConf }
1311
}

0 commit comments

Comments
 (0)