Bug #72630 NullPointerException during handshake in some situations
Submitted: 13 May 2014 10:01 Modified: 4 Jun 2015 17:47
Reporter: Michael Wyraz Email Updates:
Status: Closed Impact on me:
None 
Category:Connector / J Severity:S2 (Serious)
Version:5.1.29 OS:Windows
Assigned to: Alexander Soklakov CPU Architecture:Any

[13 May 2014 10:01] Michael Wyraz
Description:
In some situations mysql connector j throws a nullpointerexception when trying to connect. It seems only to happen when deploying on tomcat or jetty. It happens on some machines and works on other, I don't know the exact reason.

Tried with server version 5.6.x (Windows, running locally) and 5.5.x (Linux running remotely).

Stacktrace from 5.1.29:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
	at com.mysql.jdbc.Util.getInstance(Util.java:384)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2588)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2321)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:832)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:417)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:344)
	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
	... 73 more
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.Buffer.<init>(Buffer.java:53)
	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1738)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1288)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2506)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2539)
	... 87 more

Stacktrace from 5.1.17:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2412)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
	at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
	at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
	at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
	at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
	... 74 more
Caused by: java.lang.NullPointerException
	at java.security.MessageDigest.update(Unknown Source)
	at java.security.MessageDigest.digest(Unknown Source)
	at com.mysql.jdbc.Security.scramble411(Security.java:329)
	at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4075)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1300)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2337)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
	... 88 more

How to repeat:
http://stackoverflow.com/questions/22201536/jdbc-mysql-connection-works-on-some-tomcats-bu...

Suggested fix:
Downgrade to 5.1.16.
[13 May 2014 13:38] Alexander Soklakov
Hi Michael,

By code review I could say the most probable reason is that UnsupportedEncodingException happens in StringUtil.getBytes(String value) method.

Please report your encoding settings.
[13 May 2014 13:54] Michael Wyraz
Alexander, you are right, thank you a lot. Because of a different bug (in a framework) we run tomcat with the option -Dfile.encoding=UTF-8. On some machines we had a typo (such as -Dfile.encoding=UFT-8). Resolving this solves the error.

Nevertheless, the exception was very missleading :-(

Kind regards,
Michael.
[14 May 2014 7:52] Alexander Soklakov
Michael,

Thank you for feedback.
Right, NPE isn't a best behaviour here, so I set this bug as verified.
[4 Jun 2015 17:47] Daniel So
Added the following entry to the Connector/J 5.1.35 changelog:

"An unsupported encoding exception during handshake gave rise to a null pointer exception. With this fix, the null pointer exception is no longer thrown, and a proper error message is provided by Connector/J."