Bug 16186 - SqlCommand.BeginExecuteInternal does not always return the IAsyncResult
Summary: SqlCommand.BeginExecuteInternal does not always return the IAsyncResult
Status: NEW
Alias: None
Product: Class Libraries
Classification: Mono
Component: System.Data (show other bugs)
Version: master
Hardware: PC Linux
: --- normal
Target Milestone: Untriaged
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2013-11-13 07:30 UTC by Maxime Brugidou
Modified: 2017-09-01 09:29 UTC (History)
1 user (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description Maxime Brugidou 2013-11-13 07:30:27 UTC
In System.Data.SqlClient.SqlCommand class, the BeginExecuteInternal() method does not always return the IAsyncResult object.

See https://github.com/mono/mono/blob/master/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs#L849

If you use a stored procedure or a prepared statement, with CommantType.StoredProcedure the ar variable is not set as the result of onnection.Tds.BeginExecuteProcedure().

This crashes your application if you start using the SqlCommand by calling manually:

* EndExecuteNonQuery() which calls
* EndExecuteInternal() which calls
* Connection.Tds.WaitFor (sqlResult.InternalResult) where sqlResult.InternalResult is the set by BeginExecuteInternal() and is null if you use a stored procedure.

This throws a NullReferenceException

To reproduce:

using(var cmd = new SqlCommand())
{
  cmd.Connection = myConnection; // your connection
  cmd.CommandType = CommandType.StoredProcedure; 
  cmd.CommandText = ""; // your procedure;
  var res = cmd.BeginExecuteNonQuery();
  cmd.EndExecuteNonQuery(res);
}

This can easily be fixed by fixing https://github.com/mono/mono/blob/master/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs#L849 and probably https://github.com/mono/mono/blob/master/mcs/class/System.Data/System.Data.SqlClient/SqlCommand.cs#L883 for prepared statments, assigning to ar the result of the call.
Comment 1 Maxime Brugidou 2013-11-15 07:16:02 UTC
I tested and did a PR on github:

https://github.com/mono/mono/pull/809

Note You need to log in before you can comment on or make changes to this bug.