@@ -167,22 +167,14 @@ private void ReadSniError(TdsParserStateObject stateObj, uint error)
167
167
stateObj . SendAttention ( mustTakeWriteLock : true ) ;
168
168
169
169
PacketHandle syncReadPacket = default ;
170
- bool readFromNetwork = true ;
171
170
RuntimeHelpers . PrepareConstrainedRegions ( ) ;
172
171
bool shouldDecrement = false ;
173
172
try
174
173
{
175
174
Interlocked . Increment ( ref _readingCount ) ;
176
175
shouldDecrement = true ;
177
- readFromNetwork = ! PartialPacketContainsCompletePacket ( ) ;
178
- if ( readFromNetwork )
179
- {
180
- syncReadPacket = ReadSyncOverAsync ( stateObj . GetTimeoutRemaining ( ) , out error ) ;
181
- }
182
- else
183
- {
184
- error = TdsEnums . SNI_SUCCESS ;
185
- }
176
+
177
+ syncReadPacket = ReadSyncOverAsync ( stateObj . GetTimeoutRemaining ( ) , out error ) ;
186
178
187
179
Interlocked . Decrement ( ref _readingCount ) ;
188
180
shouldDecrement = false ;
@@ -195,7 +187,7 @@ private void ReadSniError(TdsParserStateObject stateObj, uint error)
195
187
}
196
188
else
197
189
{
198
- Debug . Assert ( ! readFromNetwork || ! IsValidPacket ( syncReadPacket ) , "unexpected syncReadPacket without corresponding SNIPacketRelease" ) ;
190
+ Debug . Assert ( ! IsValidPacket ( syncReadPacket ) , "unexpected syncReadPacket without corresponding SNIPacketRelease" ) ;
199
191
fail = true ; // Subsequent read failed, time to give up.
200
192
}
201
193
}
@@ -206,7 +198,7 @@ private void ReadSniError(TdsParserStateObject stateObj, uint error)
206
198
Interlocked . Decrement ( ref _readingCount ) ;
207
199
}
208
200
209
- if ( readFromNetwork && ! IsPacketEmpty ( syncReadPacket ) )
201
+ if ( ! IsPacketEmpty ( syncReadPacket ) )
210
202
{
211
203
// Be sure to release packet, otherwise it will be leaked by native.
212
204
ReleasePacket ( syncReadPacket ) ;
@@ -247,9 +239,60 @@ private void ReadSniError(TdsParserStateObject stateObj, uint error)
247
239
AssertValidState ( ) ;
248
240
}
249
241
250
- private uint GetSniPacket ( PacketHandle packet , ref uint dataSize )
242
+ public void ProcessSniPacket ( PacketHandle packet , uint error )
251
243
{
252
- return SniPacketGetData ( packet , _inBuff , ref dataSize ) ;
244
+ if ( error != 0 )
245
+ {
246
+ if ( ( _parser . State == TdsParserState . Closed ) || ( _parser . State == TdsParserState . Broken ) )
247
+ {
248
+ // Do nothing with callback if closed or broken and error not 0 - callback can occur
249
+ // after connection has been closed. PROBLEM IN NETLIB - DESIGN FLAW.
250
+ return ;
251
+ }
252
+
253
+ AddError ( _parser . ProcessSNIError ( this ) ) ;
254
+ AssertValidState ( ) ;
255
+ }
256
+ else
257
+ {
258
+ uint dataSize = 0 ;
259
+
260
+ uint getDataError = SniPacketGetData ( packet , _inBuff , ref dataSize ) ;
261
+
262
+ if ( getDataError == TdsEnums . SNI_SUCCESS )
263
+ {
264
+ if ( _inBuff . Length < dataSize )
265
+ {
266
+ Debug . Assert ( true , "Unexpected dataSize on Read" ) ;
267
+ throw SQL . InvalidInternalPacketSize ( StringsHelper . GetString ( Strings . SqlMisc_InvalidArraySizeMessage ) ) ;
268
+ }
269
+
270
+ _lastSuccessfulIOTimer . _value = DateTime . UtcNow . Ticks ;
271
+ _inBytesRead = ( int ) dataSize ;
272
+ _inBytesUsed = 0 ;
273
+
274
+ if ( _snapshot != null )
275
+ {
276
+ _snapshot . AppendPacketData ( _inBuff , _inBytesRead ) ;
277
+ if ( _snapshotReplay )
278
+ {
279
+ _snapshot . MoveNext ( ) ;
280
+ #if DEBUG
281
+ _snapshot . AssertCurrent ( ) ;
282
+ #endif
283
+ }
284
+ }
285
+
286
+ SniReadStatisticsAndTracing ( ) ;
287
+ SqlClientEventSource . Log . TryAdvancedTraceBinEvent ( "TdsParser.ReadNetworkPacketAsyncCallback | INFO | ADV | State Object Id {0}, Packet read. In Buffer: {1}, In Bytes Read: {2}" , ObjectID , _inBuff , _inBytesRead ) ;
288
+
289
+ AssertValidState ( ) ;
290
+ }
291
+ else
292
+ {
293
+ throw SQL . ParsingError ( ParsingErrorState . ProcessSniPacketFailed ) ;
294
+ }
295
+ }
253
296
}
254
297
255
298
private void SetBufferSecureStrings ( )
@@ -321,7 +364,7 @@ public void ReadAsyncCallback(IntPtr key, PacketHandle packet, uint error)
321
364
bool processFinallyBlock = true ;
322
365
try
323
366
{
324
- Debug . Assert ( ( packet . Type == 0 && PartialPacketContainsCompletePacket ( ) ) || ( CheckPacket ( packet , source ) && source != null ) , "AsyncResult null on callback" ) ;
367
+ Debug . Assert ( CheckPacket ( packet , source ) && source != null , "AsyncResult null on callback" ) ;
325
368
326
369
if ( _parser . MARSOn )
327
370
{
0 commit comments