Skip to content

Commit f88780c

Browse files
Add some tests; improve buffer models
1 parent 9a33c2a commit f88780c

File tree

5 files changed

+91
-42
lines changed

5 files changed

+91
-42
lines changed

java/ql/lib/ext/io.netty.buffer.model.yml

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,66 +12,72 @@ extensions:
1212
- ["io.netty.buffer", "ByteBuf", True, "discardSomeReadBytes", "()", "", "Argument[-1]", "ReturnValue", "value", "manual"]
1313
- ["io.netty.buffer", "ByteBuf", True, "duplicate", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
1414
- ["io.netty.buffer", "ByteBuf", True, "ensureWritable", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
15-
- ["io.netty.buffer", "ByteBuf", True, "getByte", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
16-
- ["io.netty.buffer", "ByteBuf", True, "getBytes", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
17-
- ["io.netty.buffer", "ByteBuf", True, "getChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
18-
- ["io.netty.buffer", "ByteBuf", True, "getCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
15+
- ["io.netty.buffer", "ByteBuf", True, "getBytes", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
1916
- ["io.netty.buffer", "ByteBuf", True, "markReaderIndex", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
2017
- ["io.netty.buffer", "ByteBuf", True, "markWriterIndex", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
2118
- ["io.netty.buffer", "ByteBuf", True, "nioBuffer", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
2219
- ["io.netty.buffer", "ByteBuf", True, "nioBuffers", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
2320
- ["io.netty.buffer", "ByteBuf", True, "order", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
24-
- ["io.netty.buffer", "ByteBuf", True, "readBytes", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
25-
- ["io.netty.buffer", "ByteBuf", True, "readChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
26-
- ["io.netty.buffer", "ByteBuf", True, "readCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
27-
- ["io.netty.buffer", "ByteBuf", True, "readSlice", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
21+
- ["io.netty.buffer", "ByteBuf", True, "readBytes", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
22+
- ["io.netty.buffer", "ByteBuf", True, "readerIndex", "(int)", "", "Argument[-1]", "ReturnValue", "value", "manual"]
2823
- ["io.netty.buffer", "ByteBuf", True, "resetReaderIndex", "()", "", "Argument[-1]", "ReturnValue", "value", "manual"]
2924
- ["io.netty.buffer", "ByteBuf", True, "resetWriterIndex", "()", "", "Argument[-1]", "ReturnValue", "value", "manual"]
3025
- ["io.netty.buffer", "ByteBuf", True, "retainedDuplicate", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
3126
- ["io.netty.buffer", "ByteBuf", True, "retainedSlice", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
32-
- ["io.netty.buffer", "ByteBuf", True, "setBoolean", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
33-
- ["io.netty.buffer", "ByteBuf", True, "setByte", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
34-
- ["io.netty.buffer", "ByteBuf", True, "setBytes", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
35-
- ["io.netty.buffer", "ByteBuf", True, "setChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
36-
- ["io.netty.buffer", "ByteBuf", True, "setCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
37-
- ["io.netty.buffer", "ByteBuf", True, "setDouble", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
38-
- ["io.netty.buffer", "ByteBuf", True, "setDoubleLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
39-
- ["io.netty.buffer", "ByteBuf", True, "setFloat", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
40-
- ["io.netty.buffer", "ByteBuf", True, "setFloatLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
41-
- ["io.netty.buffer", "ByteBuf", True, "setIndex", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
42-
- ["io.netty.buffer", "ByteBuf", True, "setInt", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
43-
- ["io.netty.buffer", "ByteBuf", True, "setIntLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
44-
- ["io.netty.buffer", "ByteBuf", True, "setLong", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
45-
- ["io.netty.buffer", "ByteBuf", True, "setLongLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
46-
- ["io.netty.buffer", "ByteBuf", True, "setMedium", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
47-
- ["io.netty.buffer", "ByteBuf", True, "setMediumLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
48-
- ["io.netty.buffer", "ByteBuf", True, "setShort", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
49-
- ["io.netty.buffer", "ByteBuf", True, "setShortLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
27+
- ["io.netty.buffer", "ByteBuf", True, "setBoolean", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
28+
- ["io.netty.buffer", "ByteBuf", True, "setByte", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
29+
- ["io.netty.buffer", "ByteBuf", True, "setBytes", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
30+
- ["io.netty.buffer", "ByteBuf", True, "setChar", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
31+
- ["io.netty.buffer", "ByteBuf", True, "setCharSequence", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
32+
- ["io.netty.buffer", "ByteBuf", True, "setDouble", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
33+
- ["io.netty.buffer", "ByteBuf", True, "setDoubleLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
34+
- ["io.netty.buffer", "ByteBuf", True, "setFloat", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
35+
- ["io.netty.buffer", "ByteBuf", True, "setFloatLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
36+
- ["io.netty.buffer", "ByteBuf", True, "setIndex", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
37+
- ["io.netty.buffer", "ByteBuf", True, "setInt", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
38+
- ["io.netty.buffer", "ByteBuf", True, "setIntLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
39+
- ["io.netty.buffer", "ByteBuf", True, "setLong", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
40+
- ["io.netty.buffer", "ByteBuf", True, "setLongLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
41+
- ["io.netty.buffer", "ByteBuf", True, "setMedium", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
42+
- ["io.netty.buffer", "ByteBuf", True, "setMediumLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
43+
- ["io.netty.buffer", "ByteBuf", True, "setShort", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
44+
- ["io.netty.buffer", "ByteBuf", True, "setShortLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
45+
- ["io.netty.buffer", "ByteBuf", True, "setZero", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
46+
- ["io.netty.buffer", "ByteBuf", True, "skipBytes", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
5047
- ["io.netty.buffer", "ByteBuf", True, "slice", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
5148
- ["io.netty.buffer", "ByteBuf", True, "toString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
5249
- ["io.netty.buffer", "ByteBuf", True, "unwrap", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
53-
- ["io.netty.buffer", "ByteBuf", True, "writeByte", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
54-
- ["io.netty.buffer", "ByteBuf", True, "writeBytes", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
55-
- ["io.netty.buffer", "ByteBuf", True, "writeChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
56-
- ["io.netty.buffer", "ByteBuf", True, "writeCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
57-
- ["io.netty.buffer", "ByteBuf", True, "writeDouble", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
58-
- ["io.netty.buffer", "ByteBuf", True, "writeDoubleLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
59-
- ["io.netty.buffer", "ByteBuf", True, "writeFloat", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
60-
- ["io.netty.buffer", "ByteBuf", True, "writeFloatLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
61-
- ["io.netty.buffer", "ByteBuf", True, "writeInt", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
62-
- ["io.netty.buffer", "ByteBuf", True, "writeIntLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
63-
- ["io.netty.buffer", "ByteBuf", True, "writeLong", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
64-
- ["io.netty.buffer", "ByteBuf", True, "writeLongLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
65-
- ["io.netty.buffer", "ByteBuf", True, "writeMedium", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
66-
- ["io.netty.buffer", "ByteBuf", True, "writeMediumLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
67-
- ["io.netty.buffer", "ByteBuf", True, "writeShort", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
68-
- ["io.netty.buffer", "ByteBuf", True, "writeShortLE", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
50+
- ["io.netty.buffer", "ByteBuf", True, "writeByte", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
51+
- ["io.netty.buffer", "ByteBuf", True, "writeBytes", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
52+
- ["io.netty.buffer", "ByteBuf", True, "writeChar", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
53+
- ["io.netty.buffer", "ByteBuf", True, "writeCharSequence", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
54+
- ["io.netty.buffer", "ByteBuf", True, "writeDouble", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
55+
- ["io.netty.buffer", "ByteBuf", True, "writeDoubleLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
56+
- ["io.netty.buffer", "ByteBuf", True, "writeFloat", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
57+
- ["io.netty.buffer", "ByteBuf", True, "writeFloatLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
58+
- ["io.netty.buffer", "ByteBuf", True, "writeInt", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
59+
- ["io.netty.buffer", "ByteBuf", True, "writeIntLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
60+
- ["io.netty.buffer", "ByteBuf", True, "writeLong", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
61+
- ["io.netty.buffer", "ByteBuf", True, "writeLongLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
62+
- ["io.netty.buffer", "ByteBuf", True, "writeMedium", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
63+
- ["io.netty.buffer", "ByteBuf", True, "writeMediumLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
64+
- ["io.netty.buffer", "ByteBuf", True, "writeShort", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
65+
- ["io.netty.buffer", "ByteBuf", True, "writeShortLE", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
66+
- ["io.netty.buffer", "ByteBuf", True, "writeZero", "", "", "Argument[-1]", "ReturnValue", "value", "manual"]
67+
- ["io.netty.buffer", "ByteBuf", True, "writerIndex", "(int)", "", "Argument[-1]", "ReturnValue", "value", "manual"]
6968
- ["io.netty.buffer", "ByteBufHolder", True, "copy", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7069
- ["io.netty.buffer", "ByteBufHolder", True, "content", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7170
- ["io.netty.buffer", "ByteBufHolder", True, "duplicate", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7271
- ["io.netty.buffer", "ByteBufHolder", True, "retainedDuplicate", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
72+
- ["io.netty.buffer", "ByteBuf", True, "getByte", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7373
- ["io.netty.buffer", "ByteBuf", True, "getBytes", "", "", "Argument[-1]", "Argument[1]", "taint", "manual"]
74+
- ["io.netty.buffer", "ByteBuf", True, "getChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
75+
- ["io.netty.buffer", "ByteBuf", True, "getCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
76+
- ["io.netty.buffer", "ByteBuf", True, "readByte", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7477
- ["io.netty.buffer", "ByteBuf", True, "readBytes", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"]
78+
- ["io.netty.buffer", "ByteBuf", True, "readChar", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
79+
- ["io.netty.buffer", "ByteBuf", True, "readCharSequence", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
80+
- ["io.netty.buffer", "ByteBuf", True, "readSlice", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"]
7581
- ["io.netty.buffer", "ByteBuf", True, "setByte", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"]
7682
- ["io.netty.buffer", "ByteBuf", True, "setBytes", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"]
7783
- ["io.netty.buffer", "ByteBuf", True, "setChar", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import io.netty.channel.*;
2+
import io.netty.buffer.ByteBuf;
3+
// import io.netty.handler.codec.*;
4+
// import io.netty.handler.codec.http.*;
5+
6+
class Test {
7+
static <T> T source() { return null; }
8+
static void sink(Object s) {}
9+
10+
class A extends ChannelInboundHandlerAdapter {
11+
public void channelRead(ChannelHandlerContext ctx, Object msg) {
12+
sink(msg); // $hasTaintFlow
13+
}
14+
}
15+
16+
class B extends ChannelInboundHandlerAdapter {
17+
public void channelRead(ChannelHandlerContext ctx, Object msg) {
18+
ByteBuf bb = (ByteBuf) msg;
19+
byte[] data = new byte[1024];
20+
bb.readBytes(data);
21+
sink(data); // $hasTaintFlow
22+
}
23+
}
24+
25+
void test(ByteBuf bb, byte[] x) {
26+
byte[] src = source();
27+
bb.readBytes(x).setLong(3, 4).readerIndex(2).writeBytes(src).skipBytes(2);
28+
sink(bb); // $ hasTaintFlow
29+
sink(x);
30+
}
31+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/netty-4.1.x

java/ql/test/library-tests/frameworks/netty/manual/test.expected

Whitespace-only changes.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import java
2+
import semmle.code.java.dataflow.FlowSources
3+
import TestUtilities.InlineFlowTest
4+
5+
class Conf extends DefaultTaintFlowConf {
6+
override predicate isSource(DataFlow::Node node) {
7+
super.isSource(node)
8+
or
9+
node instanceof RemoteFlowSource
10+
}
11+
}

0 commit comments

Comments
 (0)