From d24ab96c466cf7eed315d5b41e625b84f6e3b117 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Mon, 17 Aug 2026 15:48:24 -0400 Subject: [PATCH 1/2] Fix StringIndexOutOfBoundsException parsing JTDS URLs without a database segment JTDS.doParse() used dbLoc as the end index when extracting the port number, but dbLoc is -1 when the URL has a host:port with no trailing /database and no ;params (e.g. jdbc:jtds:sqlserver://host:1433), causing String.substring to throw. Co-Authored-By: Claude Sonnet 5 --- .../instrumentation/jdbc/JDBCConnectionUrlParser.java | 4 +++- .../jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java index 0f08e5019b7..946424c8dcd 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java @@ -760,8 +760,10 @@ DBInfo.Builder doParse(final String jdbcUrl, final DBInfo.Builder builder) { if (portLoc > 0) { hostEndLoc = portLoc; + final int portEndLoc = + dbLoc > 0 ? dbLoc : (paramLoc > 0 ? paramLoc : details.length()); try { - builder.port(Integer.parseInt(details.substring(portLoc + 1, dbLoc))); + builder.port(Integer.parseInt(details.substring(portLoc + 1, portEndLoc))); } catch (final NumberFormatException ignored) { } } else if (dbLoc > 0) { diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy index 27e78623117..eb3b7abfb3e 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy @@ -198,6 +198,9 @@ class JDBCConnectionUrlParserTest extends InstrumentationSpecification { "jdbc:jtds:sqlserver://dbhostname.com;user=user;password=pw" | null | "jtds" | "sqlserver" | "user" | "dbhostname.com" | 1433 | null | null "jdbc:jtds:sqlserver://dbhostname.com" | null | "jtds" | "sqlserver" | null | "dbhostname.com" | 1433 | null | null "jdbc:jtds:sybase://dbhostname.com" | null | "jtds" | "sybase" | null | "dbhostname.com" | 7100 | null | null + // host:port with no trailing '/db' and no ';' params (regression: StringIndexOutOfBoundsException) + "jdbc:jtds:sqlserver://dbhostname.com:1433" | null | "jtds" | "sqlserver" | null | "dbhostname.com" | 1433 | null | null + "jdbc:jtds:sqlserver://dbhostname.com:1433;user=user;password=pw" | null | "jtds" | "sqlserver" | "user" | "dbhostname.com" | 1433 | null | null // redshift "jdbc:redshift://redshift-cluster-1.c7arcolffyvk.us-east-2.redshift.amazonaws.com:5439/dev" | null | "redshift" | null | null | "redshift-cluster-1.c7arcolffyvk.us-east-2.redshift.amazonaws.com" | 5439 | "redshift-cluster-1" | "dev" From ee9d2850bfcec5cfb8756240035b1bba9085c129 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Mon, 17 Aug 2026 16:12:16 -0400 Subject: [PATCH 2/2] Fix spotless formatting in JDBCConnectionUrlParser Co-Authored-By: Claude Sonnet 5 --- .../instrumentation/jdbc/JDBCConnectionUrlParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java index 946424c8dcd..617b8d707ce 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java @@ -760,8 +760,7 @@ DBInfo.Builder doParse(final String jdbcUrl, final DBInfo.Builder builder) { if (portLoc > 0) { hostEndLoc = portLoc; - final int portEndLoc = - dbLoc > 0 ? dbLoc : (paramLoc > 0 ? paramLoc : details.length()); + final int portEndLoc = dbLoc > 0 ? dbLoc : (paramLoc > 0 ? paramLoc : details.length()); try { builder.port(Integer.parseInt(details.substring(portLoc + 1, portEndLoc))); } catch (final NumberFormatException ignored) {