@@ -194,6 +194,14 @@ public virtual void Push(
194
194
Ensure . ArgumentNotNull ( remote , "remote" ) ;
195
195
Ensure . ArgumentNotNull ( pushRefSpecs , "pushRefSpecs" ) ;
196
196
197
+ // The following local variables are protected from garbage collection
198
+ // by a GC.KeepAlive call at the end of the method. Otherwise,
199
+ // random crashes during push progress reporting could occur.
200
+ PushTransferCallbacks pushTransferCallbacks ;
201
+ PackbuilderCallbacks packBuilderCallbacks ;
202
+ NativeMethods . git_push_transfer_progress pushProgress ;
203
+ NativeMethods . git_packbuilder_progress packBuilderProgress ;
204
+
197
205
// Return early if there is nothing to push.
198
206
if ( ! pushRefSpecs . Any ( ) )
199
207
{
@@ -221,11 +229,11 @@ public virtual void Push(
221
229
// Perform the actual push.
222
230
using ( PushSafeHandle pushHandle = Proxy . git_push_new ( remoteHandle ) )
223
231
{
224
- PushTransferCallbacks pushTransferCallbacks = new PushTransferCallbacks ( pushOptions . OnPushTransferProgress ) ;
225
- PackbuilderCallbacks packBuilderCallbacks = new PackbuilderCallbacks ( pushOptions . OnPackBuilderProgress ) ;
232
+ pushTransferCallbacks = new PushTransferCallbacks ( pushOptions . OnPushTransferProgress ) ;
233
+ packBuilderCallbacks = new PackbuilderCallbacks ( pushOptions . OnPackBuilderProgress ) ;
226
234
227
- NativeMethods . git_push_transfer_progress pushProgress = pushTransferCallbacks . GenerateCallback ( ) ;
228
- NativeMethods . git_packbuilder_progress packBuilderProgress = packBuilderCallbacks . GenerateCallback ( ) ;
235
+ pushProgress = pushTransferCallbacks . GenerateCallback ( ) ;
236
+ packBuilderProgress = packBuilderCallbacks . GenerateCallback ( ) ;
229
237
230
238
Proxy . git_push_set_callbacks ( pushHandle , pushProgress , packBuilderProgress ) ;
231
239
@@ -259,6 +267,11 @@ public virtual void Push(
259
267
Proxy . git_remote_disconnect ( remoteHandle ) ;
260
268
}
261
269
}
270
+
271
+ GC . KeepAlive ( pushProgress ) ;
272
+ GC . KeepAlive ( packBuilderProgress ) ;
273
+ GC . KeepAlive ( pushTransferCallbacks ) ;
274
+ GC . KeepAlive ( packBuilderCallbacks ) ;
262
275
}
263
276
264
277
/// <summary>
0 commit comments