{"thread":{"id":"32119","subject":"[PATCH] usage.c: detect recursion in die routines and bail out immediately","startedAt":"2012-11-15T01:45:52Z","lastAt":"2012-11-15T01:45:52Z","messageCount":1,"participants":["Brandon Casey"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"203257","messageId":"1352943952-16964-1-git-send-email-drafnel@gmail.com","threadId":"32119","inReplyTo":null,"subject":"[PATCH] usage.c: detect recursion in die routines and bail out immediately","fromName":"Brandon Casey","fromEmail":"drafnel@gmail.com","sentAt":"2012-11-15T01:45:52Z","receivedAt":"2012-11-15T01:45:52Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"It is theoretically possible for a die handler to get into a state of\ninfinite recursion.  For example, if a die handler called another function\nwhich itself called die().  Let's at least detect this situation, inform the\nuser, and call exit.\n\nSigned-off-by: Brandon Casey <bcasey@nvidia.com>\n---\n usage.c | 15 +++++++++++++++\n 1 file changed, 15 insertions(+)\n\ndiff --git a/usage.c b/usage.c\nindex a2a6678..8eab281 100644\n--- a/usage.c\n+++ b/usage.c\n@@ -6,6 +6,8 @@\n #include \"git-compat-util.h\"\n #include \"cache.h\"\n \n+static int dying;\n+\n void vreportf(const char *prefix, const char *err, va_list params)\n {\n \tchar msg[4096];\n@@ -82,6 +84,12 @@ void NORETURN die(const char *err, ...)\n {\n \tva_list params;\n \n+\tif (dying) {\n+\t\tfputs(\"fatal: recursion detected in die handler\\n\", stderr);\n+\t\texit(128);\n+\t}\n+\tdying = 1;\n+\n \tva_start(params, err);\n \tdie_routine(err, params);\n \tva_end(params);\n@@ -94,6 +102,13 @@ void NORETURN die_errno(const char *fmt, ...)\n \tchar str_error[256], *err;\n \tint i, j;\n \n+\tif (dying) {\n+\t\tfputs(\"fatal: recursion detected in die_errno handler\\n\",\n+\t\t\tstderr);\n+\t\texit(128);\n+\t}\n+\tdying = 1;\n+\n \terr = strerror(errno);\n \tfor (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {\n \t\tif ((str_error[j++] = err[i++]) != '%')\n-- \n1.8.0\n"}]}