@@ -112,17 +112,32 @@ extern "C" fn tracing_cb_c(level: raw::git_trace_level_t, msg: *const c_char) {
112112    // Convert from a CStr to &[u8] to pass to the rust code callback. 
113113    let  msg:  & [ u8 ]  = CStr :: to_bytes ( msg) ; 
114114
115-     // Do the remaining part of this function in a panic wrapper, to catch any panics it produces. 
116-     panic:: wrap ( || { 
117-         // Convert the raw trace level into a type we can pass to the rust callback fn. 
118-         // 
119-         // SAFETY: Currently the implementation of this function (above) may panic, but is only marked as unsafe to match 
120-         // the trait definition, thus we can consider this call safe. 
121-         let  level:  TraceLevel  = unsafe  {  Binding :: from_raw ( level)  } ; 
122- 
123-         // Call the user-supplied callback (which may panic). 
124-         ( cb) ( level,  msg) ; 
125-     } ) ; 
115+     // Do not bother with wrapping any of the following calls in `panic::wrap`: 
116+     // 
117+     // The previous implementation used `panic::wrap` here but never called `panic::check` to determine if the 
118+     // trace callback had panicked, much less what caused it. 
119+     // 
120+     // This had the potential to lead to lost errors/unwinds, confusing to debugging situations, and potential issues 
121+     // catching panics in other parts of the `git2-rs` codebase. 
122+     // 
123+     // Instead, we simply call the next two lines, both of which may panic, directly. We can rely on the 
124+     // `extern "C"` semantics to appropriately catch the panics generated here and abort the process: 
125+     // 
126+     // Per <https://doc.rust-lang.org/std/panic/fn.catch_unwind.html>: 
127+     // > Rust functions that are expected to be called from foreign code that does not support 
128+     // > unwinding (such as C compiled with -fno-exceptions) should be defined using extern "C", which ensures 
129+     // > that if the Rust code panics, it is automatically caught and the process is aborted. If this is the desired 
130+     // > behavior, it is not necessary to use catch_unwind explicitly. This function should instead be used when 
131+     // > more graceful error-handling is needed. 
132+ 
133+     // Convert the raw trace level into a type we can pass to the rust callback fn. 
134+     // 
135+     // SAFETY: Currently the implementation of this function (above) may panic, but is only marked as unsafe to match 
136+     // the trait definition, thus we can consider this call safe. 
137+     let  level:  TraceLevel  = unsafe  {  Binding :: from_raw ( level)  } ; 
138+ 
139+     // Call the user-supplied callback (which may panic). 
140+     ( cb) ( level,  msg) ; 
126141} 
127142
128143#[ cfg( test) ]  
0 commit comments