mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Save errno before using sprintf, ifstream.
std::ifstream in libstdc++ contains a bug, where it sets errno to zero. To work around it, we manually save the errno before using std::ifstream in debugger check, and reset it after we are done. We also preventively save errno before using sprintf. Fixes #835
This commit is contained in:
		| @@ -10,6 +10,7 @@ | ||||
| #define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED | ||||
|  | ||||
| #include "catch_debugger.h" | ||||
| #include "catch_errno_guard.hpp" | ||||
|  | ||||
| #ifdef CATCH_PLATFORM_MAC | ||||
|  | ||||
| @@ -72,6 +73,9 @@ | ||||
|         // be strace, for example) in /proc/$PID/status, so just get it from | ||||
|         // there instead. | ||||
|         bool isDebuggerActive(){ | ||||
|             // Libstdc++ has a bug, where std::ifstream sets errno to 0 | ||||
|             // This way our users can properly assert over errno values | ||||
|             ErrnoGuard guard; | ||||
|             std::ifstream in("/proc/self/status"); | ||||
|             for( std::string line; std::getline(in, line); ) { | ||||
|                 static const int PREFIX_LEN = 11; | ||||
|   | ||||
							
								
								
									
										25
									
								
								include/internal/catch_errno_guard.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								include/internal/catch_errno_guard.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| /* | ||||
|  *  Created by Martin on 06/03/2017. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
| #ifndef TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED | ||||
|  | ||||
| #include <cerrno> | ||||
|  | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     class ErrnoGuard { | ||||
|     public: | ||||
|         ErrnoGuard():m_oldErrno(errno){} | ||||
|         ~ErrnoGuard() { errno = m_oldErrno; } | ||||
|     private: | ||||
|         int m_oldErrno; | ||||
|     }; | ||||
|  | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský