From bc45d35c2d023d2e82dc6c3e2b12745389f3c3c1 Mon Sep 17 00:00:00 2001 From: Alexander Soklakov Date: Fri, 19 Nov 2021 12:22:09 +0400 Subject: [PATCH] Fix for Bug#85223 (25656020), MYSQLSQLXML SETSTRING CRASH. --- CHANGES | 2 ++ .../java/com/mysql/cj/jdbc/MysqlSQLXML.java | 2 +- .../regression/StatementRegressionTest.java | 25 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 4639ea468..c9eb5bde8 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ Version 8.0.28 + - Fix for Bug#85223 (25656020), MYSQLSQLXML SETSTRING CRASH. + - Fix for Bug#84365 (33425867), INSERT..VALUE with VALUES function lead to a StringIndexOutOfBoundsException. - Fix for Bug#105211 (33468860), class java.time.LocalDate cannot be cast to class java.sql.Date. diff --git a/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSQLXML.java b/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSQLXML.java index b344aea13..27d7cd6ab 100644 --- a/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSQLXML.java +++ b/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSQLXML.java @@ -404,7 +404,7 @@ protected String readerToString(Reader reader) throws SQLException { protected synchronized Reader serializeAsCharacterStream() throws SQLException { checkClosed(); - if (this.workingWithResult) { + if (this.workingWithResult || this.owningResultSet == null) { // figure out what kind of result if (this.stringRep != null) { return new StringReader(this.stringRep); diff --git a/src/test/java/testsuite/regression/StatementRegressionTest.java b/src/test/java/testsuite/regression/StatementRegressionTest.java index a2f9dff71..d9634bedf 100644 --- a/src/test/java/testsuite/regression/StatementRegressionTest.java +++ b/src/test/java/testsuite/regression/StatementRegressionTest.java @@ -11873,4 +11873,29 @@ public void testBug84365() throws Exception { assertFalse(this.rs.next()); } } + + /** + * Test fix for Bug#85223 (25656020), MYSQLSQLXML SETSTRING CRASH. + * + * @throws Exception + */ + @Test + public void testBug85223() throws Exception { + Properties props = new Properties(); + props.setProperty(PropertyKey.sslMode.getKeyName(), SslMode.DISABLED.name()); + props.setProperty(PropertyKey.allowPublicKeyRetrieval.getKeyName(), "true"); + + String elementString = "MFNameLName"; + Connection con = getConnectionWithProps(props); + PreparedStatement pst = con.prepareStatement("SELECT ExtractValue(?,?) as val1"); + SQLXML xml = con.createSQLXML(); + xml.setString(elementString); + pst.setSQLXML(1, xml); + pst.setString(2, "/Person/LastName"); + pst.execute(); + this.rs = pst.getResultSet(); + this.rs.next(); + String value = this.rs.getString(1); + assertEquals("LName", value); + } }