6
6
#include "git-compat-util.h"
7
7
#include "cache.h"
8
8
9
- static int dying ;
10
-
11
9
void vreportf (const char * prefix , const char * err , va_list params )
12
10
{
13
11
char msg [4096 ];
@@ -49,12 +47,19 @@ static void warn_builtin(const char *warn, va_list params)
49
47
vreportf ("warning: " , warn , params );
50
48
}
51
49
50
+ static int die_is_recursing_builtin (void )
51
+ {
52
+ static int dying ;
53
+ return dying ++ ;
54
+ }
55
+
52
56
/* If we are in a dlopen()ed .so write to a global variable would segfault
53
57
* (ugh), so keep things static. */
54
58
static NORETURN_PTR void (* usage_routine )(const char * err , va_list params ) = usage_builtin ;
55
59
static NORETURN_PTR void (* die_routine )(const char * err , va_list params ) = die_builtin ;
56
60
static void (* error_routine )(const char * err , va_list params ) = error_builtin ;
57
61
static void (* warn_routine )(const char * err , va_list params ) = warn_builtin ;
62
+ static int (* die_is_recursing )(void ) = die_is_recursing_builtin ;
58
63
59
64
void set_die_routine (NORETURN_PTR void (* routine )(const char * err , va_list params ))
60
65
{
@@ -66,6 +71,11 @@ void set_error_routine(void (*routine)(const char *err, va_list params))
66
71
error_routine = routine ;
67
72
}
68
73
74
+ void set_die_is_recursing_routine (int (* routine )(void ))
75
+ {
76
+ die_is_recursing = routine ;
77
+ }
78
+
69
79
void NORETURN usagef (const char * err , ...)
70
80
{
71
81
va_list params ;
@@ -84,11 +94,10 @@ void NORETURN die(const char *err, ...)
84
94
{
85
95
va_list params ;
86
96
87
- if (dying ) {
97
+ if (die_is_recursing () ) {
88
98
fputs ("fatal: recursion detected in die handler\n" , stderr );
89
99
exit (128 );
90
100
}
91
- dying = 1 ;
92
101
93
102
va_start (params , err );
94
103
die_routine (err , params );
@@ -102,12 +111,11 @@ void NORETURN die_errno(const char *fmt, ...)
102
111
char str_error [256 ], * err ;
103
112
int i , j ;
104
113
105
- if (dying ) {
114
+ if (die_is_recursing () ) {
106
115
fputs ("fatal: recursion detected in die_errno handler\n" ,
107
116
stderr );
108
117
exit (128 );
109
118
}
110
- dying = 1 ;
111
119
112
120
err = strerror (errno );
113
121
for (i = j = 0 ; err [i ] && j < sizeof (str_error ) - 1 ; ) {
0 commit comments