From 4be63a68667d3c75a3da36b3bc8045459a360906 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Tue, 8 Dec 2020 18:01:03 +0000 Subject: errors: drop unneccessary g_git prefix --- src/libgit2/errors.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/libgit2/errors.c') diff --git a/src/libgit2/errors.c b/src/libgit2/errors.c index 3614b9ce5..1b94a5cf4 100644 --- a/src/libgit2/errors.c +++ b/src/libgit2/errors.c @@ -16,12 +16,12 @@ * New error handling ********************************************/ -static git_error g_git_oom_error = { +static git_error oom_error = { "Out of memory", GIT_ERROR_NOMEMORY }; -static git_error g_git_uninitialized_error = { +static git_error uninitialized_error = { "libgit2 has not been initialized; you must call git_libgit2_init", GIT_ERROR_INVALID }; @@ -52,7 +52,7 @@ static void set_error(int error_class, char *string) void git_error_set_oom(void) { - GIT_THREADSTATE->last_error = &g_git_oom_error; + GIT_THREADSTATE->last_error = &oom_error; } void git_error_set(int error_class, const char *fmt, ...) @@ -134,7 +134,7 @@ const git_error *git_error_last(void) { /* If the library is not initialized, return a static error. */ if (!git_libgit2_init_count()) - return &g_git_uninitialized_error; + return &uninitialized_error; return GIT_THREADSTATE->last_error; } @@ -150,13 +150,13 @@ int git_error_state_capture(git_error_state *state, int error_code) return 0; state->error_code = error_code; - state->oom = (error == &g_git_oom_error); + state->oom = (error == &oom_error); if (error) { state->error_msg.klass = error->klass; if (state->oom) - state->error_msg.message = g_git_oom_error.message; + state->error_msg.message = oom_error.message; else state->error_msg.message = git_str_detach(error_buf); } -- cgit v1.2.1 From ce488be46e4cd2aeeb69c39a062fae1ba9a302f6 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Tue, 8 Dec 2020 19:28:01 +0000 Subject: errors: don't rely on tls data working Thread-local storage data may fail to initialize; in this case, do not try to set the error message into it. When the thread state has not been initialized, return a hardcoded message to that affect. --- src/libgit2/errors.c | 81 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 13 deletions(-) (limited to 'src/libgit2/errors.c') diff --git a/src/libgit2/errors.c b/src/libgit2/errors.c index 1b94a5cf4..460dfa00f 100644 --- a/src/libgit2/errors.c +++ b/src/libgit2/errors.c @@ -26,22 +26,41 @@ static git_error uninitialized_error = { GIT_ERROR_INVALID }; +static git_error tlsdata_error = { + "thread-local data initialization failure", + GIT_ERROR +}; + static void set_error_from_buffer(int error_class) { - git_error *error = &GIT_THREADSTATE->error_t; - git_str *buf = &GIT_THREADSTATE->error_buf; + git_threadstate *threadstate = GIT_THREADSTATE; + git_error *error; + git_str *buf; + + if (!threadstate) + return; + + error = &threadstate->error_t; + buf = &threadstate->error_buf; error->message = buf->ptr; error->klass = error_class; - GIT_THREADSTATE->last_error = error; + threadstate->last_error = error; } static void set_error(int error_class, char *string) { - git_str *buf = &GIT_THREADSTATE->error_buf; + git_threadstate *threadstate = GIT_THREADSTATE; + git_str *buf; + + if (!threadstate) + return; + + buf = &threadstate->error_buf; git_str_clear(buf); + if (string) { git_str_puts(buf, string); git__free(string); @@ -52,7 +71,12 @@ static void set_error(int error_class, char *string) void git_error_set_oom(void) { - GIT_THREADSTATE->last_error = &oom_error; + git_threadstate *threadstate = GIT_THREADSTATE; + + if (!threadstate) + return; + + threadstate->last_error = &oom_error; } void git_error_set(int error_class, const char *fmt, ...) @@ -69,10 +93,18 @@ void git_error_vset(int error_class, const char *fmt, va_list ap) #ifdef GIT_WIN32 DWORD win32_error_code = (error_class == GIT_ERROR_OS) ? GetLastError() : 0; #endif + + git_threadstate *threadstate = GIT_THREADSTATE; int error_code = (error_class == GIT_ERROR_OS) ? errno : 0; - git_str *buf = &GIT_THREADSTATE->error_buf; + git_str *buf; + + if (!threadstate) + return; + + buf = &threadstate->error_buf; git_str_clear(buf); + if (fmt) { git_str_vprintf(buf, fmt, ap); if (error_class == GIT_ERROR_OS) @@ -81,7 +113,7 @@ void git_error_vset(int error_class, const char *fmt, va_list ap) if (error_class == GIT_ERROR_OS) { #ifdef GIT_WIN32 - char * win32_error = git_win32_get_error_message(win32_error_code); + char *win32_error = git_win32_get_error_message(win32_error_code); if (win32_error) { git_str_puts(buf, win32_error); git__free(win32_error); @@ -103,10 +135,16 @@ void git_error_vset(int error_class, const char *fmt, va_list ap) int git_error_set_str(int error_class, const char *string) { - git_str *buf = &GIT_THREADSTATE->error_buf; + git_threadstate *threadstate = GIT_THREADSTATE; + git_str *buf; GIT_ASSERT_ARG(string); + if (!threadstate) + return -1; + + buf = &threadstate->error_buf; + git_str_clear(buf); git_str_puts(buf, string); @@ -119,9 +157,14 @@ int git_error_set_str(int error_class, const char *string) void git_error_clear(void) { - if (GIT_THREADSTATE->last_error != NULL) { + git_threadstate *threadstate = GIT_THREADSTATE; + + if (!threadstate) + return; + + if (threadstate->last_error != NULL) { set_error(0, NULL); - GIT_THREADSTATE->last_error = NULL; + threadstate->last_error = NULL; } errno = 0; @@ -132,17 +175,29 @@ void git_error_clear(void) const git_error *git_error_last(void) { + git_threadstate *threadstate; + /* If the library is not initialized, return a static error. */ if (!git_libgit2_init_count()) return &uninitialized_error; - return GIT_THREADSTATE->last_error; + if ((threadstate = GIT_THREADSTATE) == NULL) + return &tlsdata_error; + + return threadstate->last_error; } int git_error_state_capture(git_error_state *state, int error_code) { - git_error *error = GIT_THREADSTATE->last_error; - git_str *error_buf = &GIT_THREADSTATE->error_buf; + git_threadstate *threadstate = GIT_THREADSTATE; + git_error *error; + git_str *error_buf; + + if (!threadstate) + return -1; + + error = threadstate->last_error; + error_buf = &threadstate->error_buf; memset(state, 0, sizeof(git_error_state)); -- cgit v1.2.1 From ebf2991f06d8831ed23524a068210b8103b5f604 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Tue, 8 Dec 2020 19:46:25 +0000 Subject: threadstate: don't use an unnecessary macro Now that we've reduced the usage of GIT_THREADSTATE, remove it entirely in favor of git_threadstate_get(). --- src/libgit2/errors.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/libgit2/errors.c') diff --git a/src/libgit2/errors.c b/src/libgit2/errors.c index 460dfa00f..2e58948d2 100644 --- a/src/libgit2/errors.c +++ b/src/libgit2/errors.c @@ -33,7 +33,7 @@ static git_error tlsdata_error = { static void set_error_from_buffer(int error_class) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); git_error *error; git_str *buf; @@ -51,7 +51,7 @@ static void set_error_from_buffer(int error_class) static void set_error(int error_class, char *string) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); git_str *buf; if (!threadstate) @@ -71,7 +71,7 @@ static void set_error(int error_class, char *string) void git_error_set_oom(void) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); if (!threadstate) return; @@ -94,7 +94,7 @@ void git_error_vset(int error_class, const char *fmt, va_list ap) DWORD win32_error_code = (error_class == GIT_ERROR_OS) ? GetLastError() : 0; #endif - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); int error_code = (error_class == GIT_ERROR_OS) ? errno : 0; git_str *buf; @@ -135,7 +135,7 @@ void git_error_vset(int error_class, const char *fmt, va_list ap) int git_error_set_str(int error_class, const char *string) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); git_str *buf; GIT_ASSERT_ARG(string); @@ -157,7 +157,7 @@ int git_error_set_str(int error_class, const char *string) void git_error_clear(void) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); if (!threadstate) return; @@ -181,7 +181,7 @@ const git_error *git_error_last(void) if (!git_libgit2_init_count()) return &uninitialized_error; - if ((threadstate = GIT_THREADSTATE) == NULL) + if ((threadstate = git_threadstate_get()) == NULL) return &tlsdata_error; return threadstate->last_error; @@ -189,7 +189,7 @@ const git_error *git_error_last(void) int git_error_state_capture(git_error_state *state, int error_code) { - git_threadstate *threadstate = GIT_THREADSTATE; + git_threadstate *threadstate = git_threadstate_get(); git_error *error; git_str *error_buf; -- cgit v1.2.1