Commit 1e686ae7 authored by unknown's avatar unknown
Browse files

fix for bug #12744 (MYSQL_STMT operations cause seg fault after connection reset)


libmysql/libmysql.c:
  stmt->mysql could be 0x0 if the connection has failed between prepare and execute
  or any other operation. thus if the user decides to use mysql_stmt_reset()
  we should not segfault.
tests/mysql_client_test.c:
  test for bug #12744 (MYSQL_STMT operations cause seg fault after connection reset)
parent c98077d6
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4628,6 +4628,12 @@ my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
  /* If statement hasnt been prepared there is nothing to reset */
  if ((int) stmt->state < (int) MYSQL_STMT_PREPARE_DONE)
    DBUG_RETURN(0);
  if (!stmt->mysql)
  {
    /* mysql can be reset in mysql_close called from mysql_reconnect */
    set_stmt_error(stmt, CR_SERVER_LOST, unknown_sqlstate);
    DBUG_RETURN(1);  
  }

  mysql= stmt->mysql->last_used_con;
  int4store(buff, stmt->stmt_id);		/* Send stmt id to server */
+32 −0
Original line number Diff line number Diff line
@@ -11706,6 +11706,37 @@ static void test_bug12001()
  DIE_UNLESS(res==1);
}

static void test_bug12744()
{
  MYSQL_STMT *prep_stmt = NULL;
  int rc;
  myheader("test_bug12744");
	
  prep_stmt= mysql_stmt_init(mysql);
  rc= mysql_stmt_prepare(prep_stmt, "SELECT 1", 8);
  DIE_UNLESS(rc==0);
  
  rc= mysql_kill(mysql, mysql_thread_id(mysql));
  DIE_UNLESS(rc==0);

  if (rc= mysql_stmt_execute(prep_stmt))
  {
    if (rc= mysql_stmt_reset(prep_stmt))
      printf("OK!\n");
    else
    {
      printf("Error!");
      DIE_UNLESS(1==0);      
    }
  }
  else
  {
    fprintf(stderr, "expected error but no error occured\n");
    DIE_UNLESS(1==0);
  }
  rc= mysql_stmt_close(prep_stmt);
}

/*
  Bug#11718: query with function, join and order by returns wrong type
*/
@@ -12054,6 +12085,7 @@ static struct my_tests_st my_tests[]= {
  { "test_bug8378", test_bug8378 },
  { "test_bug9735", test_bug9735 },
  { "test_bug11183", test_bug11183 },
  { "test_bug12744", test_bug12744 },
  { "test_bug12001", test_bug12001 },
  { "test_bug11718", test_bug11718 },
  { "test_bug12925", test_bug12925 },