Skip to content

Commit 8468ec7

Browse files
committed
fix(instrumentation/jdbc): JDBC URL Parser StringIndexOutOfBoundsException Fix
1 parent 68a17ad commit 8468ec7

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,14 +339,14 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) {
339339

340340
if (portLoc > 0) {
341341
hostEndLoc = portLoc;
342-
int portEndLoc = clusterSepLoc > 0 ? clusterSepLoc : dbLoc;
342+
int portEndLoc = clusterSepLoc > 0 ? clusterSepLoc : (dbLoc > 0 ? dbLoc : jdbcUrl.length());
343343
try {
344344
builder.port(Integer.parseInt(jdbcUrl.substring(portLoc + 1, portEndLoc)));
345345
} catch (NumberFormatException e) {
346346
logger.log(FINE, e.getMessage(), e);
347347
}
348348
} else {
349-
hostEndLoc = clusterSepLoc > 0 ? clusterSepLoc : dbLoc;
349+
hostEndLoc = clusterSepLoc > 0 ? clusterSepLoc : (dbLoc > 0 ? dbLoc : jdbcUrl.length());
350350
}
351351

352352
if (ipv6End > 0) {

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55

66
package io.opentelemetry.instrumentation.jdbc.internal;
77

8+
import static io.opentelemetry.instrumentation.jdbc.internal.JdbcConnectionUrlParser.MYSQL;
89
import static io.opentelemetry.instrumentation.jdbc.internal.JdbcConnectionUrlParser.parse;
10+
import static io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo.DEFAULT;
911
import static org.assertj.core.api.Assertions.assertThat;
12+
import static org.assertj.core.api.Assertions.assertThatCode;
1013
import static org.junit.jupiter.params.provider.Arguments.arguments;
1114

1215
import io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo;
@@ -40,12 +43,12 @@ private static Properties stdProps() {
4043
@ParameterizedTest
4144
@ValueSource(strings = {"", "jdbc:", "jdbc::", "bogus:string"})
4245
void testInvalidUrlReturnsDefault(String url) {
43-
assertThat(JdbcConnectionUrlParser.parse(url, null)).isEqualTo(DbInfo.DEFAULT);
46+
assertThat(JdbcConnectionUrlParser.parse(url, null)).isEqualTo(DEFAULT);
4447
}
4548

4649
@Test
4750
void testNullUrlReturnsDefault() {
48-
assertThat(JdbcConnectionUrlParser.parse(null, null)).isEqualTo(DbInfo.DEFAULT);
51+
assertThat(JdbcConnectionUrlParser.parse(null, null)).isEqualTo(DEFAULT);
4952
}
5053

5154
private static Stream<Arguments> mySqlArguments() {
@@ -1374,4 +1377,16 @@ static Stream<Arguments> args(ParseTestArgument... testArguments) {
13741377
}
13751378
return list.stream();
13761379
}
1380+
1381+
@ParameterizedTest
1382+
@ValueSource(
1383+
strings = {
1384+
"mysql:loadbalance://string_without_slash",
1385+
"mysql:loadbalance://host:3306", // with port but no slash
1386+
"mariadb:failover://[::1]:3306" // IPv6 without slash
1387+
})
1388+
void testMySQLUrlsWithoutSlashDoNotThrowException(String url) {
1389+
assertThatCode(() -> MYSQL.doParse(url, DEFAULT.toBuilder().system("mysql")))
1390+
.doesNotThrowAnyException();
1391+
}
13771392
}

0 commit comments

Comments
 (0)