Skip to content

Commit 4c4b7e2

Browse files
wl2027laurit
andauthored
fix(instrumentation/jdbc): URL Parser StringIndexOutOfBoundsException fix (#14151)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 0b4b5f9 commit 4c4b7e2

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,19 +324,20 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) {
324324
portLoc = clusterSepLoc != -1 && clusterSepLoc < portLoc ? -1 : portLoc;
325325
int dbLoc = jdbcUrl.indexOf("/", Math.max(portLoc, clusterSepLoc));
326326

327-
int paramLoc = jdbcUrl.indexOf("?", dbLoc);
327+
int paramLoc = dbLoc != -1 ? jdbcUrl.indexOf("?", dbLoc) : -1;
328328

329329
if (paramLoc > 0) {
330330
populateStandardProperties(builder, splitQuery(jdbcUrl.substring(paramLoc + 1), "&"));
331331
builder.db(jdbcUrl.substring(dbLoc + 1, paramLoc));
332-
} else {
332+
} else if (dbLoc != -1) {
333333
builder.db(jdbcUrl.substring(dbLoc + 1));
334334
}
335335

336336
if (jdbcUrl.startsWith("address=")) {
337337
return MARIA_ADDRESS.doParse(jdbcUrl, builder);
338338
}
339339

340+
dbLoc = dbLoc != -1 ? dbLoc : jdbcUrl.length();
340341
if (portLoc > 0) {
341342
hostEndLoc = portLoc;
342343
int portEndLoc = clusterSepLoc > 0 ? clusterSepLoc : dbLoc;

instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.jdbc.internal;
77

88
import static io.opentelemetry.instrumentation.jdbc.internal.JdbcConnectionUrlParser.parse;
9+
import static io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo.DEFAULT;
910
import static org.assertj.core.api.Assertions.assertThat;
1011
import static org.junit.jupiter.params.provider.Arguments.arguments;
1112

@@ -40,12 +41,12 @@ private static Properties stdProps() {
4041
@ParameterizedTest
4142
@ValueSource(strings = {"", "jdbc:", "jdbc::", "bogus:string"})
4243
void testInvalidUrlReturnsDefault(String url) {
43-
assertThat(JdbcConnectionUrlParser.parse(url, null)).isEqualTo(DbInfo.DEFAULT);
44+
assertThat(JdbcConnectionUrlParser.parse(url, null)).isEqualTo(DEFAULT);
4445
}
4546

4647
@Test
4748
void testNullUrlReturnsDefault() {
48-
assertThat(JdbcConnectionUrlParser.parse(null, null)).isEqualTo(DbInfo.DEFAULT);
49+
assertThat(JdbcConnectionUrlParser.parse(null, null)).isEqualTo(DEFAULT);
4950
}
5051

5152
private static Stream<Arguments> mySqlArguments() {
@@ -147,6 +148,27 @@ private static Stream<Arguments> mySqlArguments() {
147148
.setHost("mdb.host")
148149
.setPort(3306)
149150
.setDb("mdbdb")
151+
.build(),
152+
arg("jdbc:mysql:loadbalance://localhost")
153+
.setShortUrl("mysql:loadbalance://localhost:3306")
154+
.setSystem("mysql")
155+
.setSubtype("loadbalance")
156+
.setHost("localhost")
157+
.setPort(3306)
158+
.build(),
159+
arg("jdbc:mysql:loadbalance://host:3306") // with port but no slash
160+
.setShortUrl("mysql:loadbalance://host:3306")
161+
.setSystem("mysql")
162+
.setSubtype("loadbalance")
163+
.setHost("host")
164+
.setPort(3306)
165+
.build(),
166+
arg("jdbc:mysql:failover://[::1]:3306") // IPv6 without slash
167+
.setShortUrl("mysql:failover://::1:3306")
168+
.setSystem("mysql")
169+
.setSubtype("failover")
170+
.setHost("::1")
171+
.setPort(3306)
150172
.build());
151173
}
152174

@@ -329,6 +351,27 @@ private static Stream<Arguments> mariaDbArguments() {
329351
.setHost("localhost")
330352
.setPort(33)
331353
.setDb("mdbdb")
354+
.build(),
355+
arg("jdbc:mariadb:loadbalance://localhost")
356+
.setShortUrl("mariadb:loadbalance://localhost:3306")
357+
.setSystem("mariadb")
358+
.setSubtype("loadbalance")
359+
.setHost("localhost")
360+
.setPort(3306)
361+
.build(),
362+
arg("jdbc:mariadb:loadbalance://host:3306") // with port but no slash
363+
.setShortUrl("mariadb:loadbalance://host:3306")
364+
.setSystem("mariadb")
365+
.setSubtype("loadbalance")
366+
.setHost("host")
367+
.setPort(3306)
368+
.build(),
369+
arg("jdbc:mariadb:failover://[::1]:3306") // IPv6 without slash
370+
.setShortUrl("mariadb:failover://::1:3306")
371+
.setSystem("mariadb")
372+
.setSubtype("failover")
373+
.setHost("::1")
374+
.setPort(3306)
332375
.build());
333376
}
334377

0 commit comments

Comments
 (0)