diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 30ce782580d..2c0e45d0607 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -240,7 +240,7 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { } else { dbInfo = DBInfo.DEFAULT; } - } catch (final SQLException se) { + } catch (final Throwable se) { log.debug("Could not get metadata from DB", se); dbInfo = DBInfo.DEFAULT; } diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/DriverInstrumentationMetadataFetchingTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/DriverInstrumentationMetadataFetchingTest.groovy index 43abf38721a..52495ff782c 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/DriverInstrumentationMetadataFetchingTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/DriverInstrumentationMetadataFetchingTest.groovy @@ -131,14 +131,14 @@ abstract class DriverInstrumentationMetadataFetchingTestBase extends Instrumenta connection?.close() } - def "test driver connect with metadata exception"() { + def "test driver connect with metadata exception #exceptionType"() { setup: def originalUrl = "jdbc:postgresql://original-host:5432/originaldb" def testConnection = new TestConnection(false) { @Override DatabaseMetaData getMetaData() throws SQLException { - throw new SQLException("Test exception") + throw metadataException } } @@ -179,6 +179,11 @@ abstract class DriverInstrumentationMetadataFetchingTestBase extends Instrumenta cleanup: statement?.close() connection?.close() + + where: + exceptionType | metadataException + "SQLException" | new SQLException("Test exception") + "RuntimeException" | new RuntimeException("Test exception") } def "test driver connect with Oracle sharding driver"() { @@ -268,4 +273,3 @@ class DriverInstrumentationWithoutMetadataOnConnectForkedTest extends DriverInst return false } } - diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/IastJDBCTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/IastJDBCTest.groovy index bf2631f4939..822ded08797 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/IastJDBCTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/IastJDBCTest.groovy @@ -1,14 +1,20 @@ import com.datadog.iast.taint.Ranges import com.datadog.iast.test.IastAgentTestRunner import com.datadog.iast.model.VulnerabilityBatch +import datadog.trace.api.iast.InstrumentationBridge +import datadog.trace.api.iast.sink.SqlInjectionModule import datadog.trace.core.DDSpan +import datadog.trace.instrumentation.jdbc.IastConnectionCallSite import foo.bar.IastInstrumentedConnection import foo.bar.IastInstrumentedStatement +import test.TestConnection import spock.lang.Shared import javax.sql.DataSource import java.sql.Connection +import java.sql.DatabaseMetaData +import java.sql.SQLException import java.sql.Statement class IastJDBCTest extends IastAgentTestRunner { @@ -121,4 +127,28 @@ class IastJDBCTest extends IastAgentTestRunner { value == 'SELECT id FROM TEST LIMIT 1' } } + + void 'metadata runtime exception does not report unexpected exception on connection method'() { + setup: + def previousModule = InstrumentationBridge.SQL_INJECTION + def module = Mock(SqlInjectionModule) + InstrumentationBridge.SQL_INJECTION = module + def sql = 'SELECT id FROM TEST LIMIT 1' + def connection = new TestConnection(false) { + @Override + DatabaseMetaData getMetaData() throws SQLException { + throw new RuntimeException('metadata exception') + } + } + + when: + IastConnectionCallSite.beforePrepare(connection, sql) + + then: + 1 * module.onJdbcQuery(sql, 'database') + 0 * module.onUnexpectedException(_, _) + + cleanup: + InstrumentationBridge.SQL_INJECTION = previousModule + } }