$OpenBSD: patch-dbdimp_c,v 1.2 2015/09/10 15:54:06 giovanni Exp $

Fix a use-after-free if my_login fails

--- dbdimp.c.orig	Mon Jun 15 10:43:03 2015
+++ dbdimp.c	Thu Sep 10 05:09:34 2015
@@ -2086,8 +2086,11 @@ static int my_login(pTHX_ SV* dbh, imp_dbh_t *imp_dbh)
   result = mysql_dr_connect(dbh, imp_dbh->pmysql, mysql_socket, host, port, user,
 			  password, dbname, imp_dbh) ? TRUE : FALSE;
   if (fresh && !result) {
+      do_error(dbh, mysql_errno(imp_dbh->pmysql),
+              mysql_error(imp_dbh->pmysql) ,mysql_sqlstate(imp_dbh->pmysql));
       /* Prevent leaks, but do not free in case of a reconnect. See #97625 */
       Safefree(imp_dbh->pmysql);
+      imp_dbh->pmysql = NULL;
   }
   return result;
 }
@@ -5017,9 +5020,11 @@ int mysql_db_reconnect(SV* h)
    */
   if (!dbd_db_disconnect(h, imp_dbh) || !my_login(aTHX_ h, imp_dbh))
   {
-    do_error(h, mysql_errno(imp_dbh->pmysql), mysql_error(imp_dbh->pmysql),
+    if(!imp_dbh->pmysql) {
+    	do_error(h, mysql_errno(imp_dbh->pmysql), mysql_error(imp_dbh->pmysql),
              mysql_sqlstate(imp_dbh->pmysql));
-    memcpy (imp_dbh->pmysql, &save_socket, sizeof(save_socket));
+    	memcpy (imp_dbh->pmysql, &save_socket, sizeof(save_socket));
+    }
     ++imp_dbh->stats.auto_reconnects_failed;
     return FALSE;
   }
