From aff927e84c3bce5b7ebc2cc72f99a571ea89c2b1 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 7 Dec 2016 16:36:44 +0100 Subject: [PATCH] UI_process() didn't generate errors Since there are many parts of UI_process() that can go wrong, it isn't very helpful to only return -1 with no further explanation. With this change, the error message will at least show which part went wrong. Reviewed-by: Rich Salz (Merged from https://github.com/openssl/openssl/pull/2037) (cherry picked from commit 0a687ab0a92d2d68289364a6e232028c229f44bb) --- crypto/ui/ui_err.c | 2 ++ crypto/ui/ui_lib.c | 23 +++++++++++++++++++---- include/openssl/ui.h | 2 ++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/crypto/ui/ui_err.c b/crypto/ui/ui_err.c index ef03815ea2..b89f9aebb5 100644 --- a/crypto/ui/ui_err.c +++ b/crypto/ui/ui_err.c @@ -30,6 +30,7 @@ static ERR_STRING_DATA UI_str_functs[] = { {ERR_FUNC(UI_F_UI_DUP_VERIFY_STRING), "UI_dup_verify_string"}, {ERR_FUNC(UI_F_UI_GET0_RESULT), "UI_get0_result"}, {ERR_FUNC(UI_F_UI_NEW_METHOD), "UI_new_method"}, + {ERR_FUNC(UI_F_UI_PROCESS), "UI_process"}, {ERR_FUNC(UI_F_UI_SET_RESULT), "UI_set_result"}, {0, NULL} }; @@ -40,6 +41,7 @@ static ERR_STRING_DATA UI_str_reasons[] = { {ERR_REASON(UI_R_INDEX_TOO_LARGE), "index too large"}, {ERR_REASON(UI_R_INDEX_TOO_SMALL), "index too small"}, {ERR_REASON(UI_R_NO_RESULT_BUFFER), "no result buffer"}, + {ERR_REASON(UI_R_PROCESSING_ERROR), "processing error"}, {ERR_REASON(UI_R_RESULT_TOO_LARGE), "result too large"}, {ERR_REASON(UI_R_RESULT_TOO_SMALL), "result too small"}, {ERR_REASON(UI_R_UNKNOWN_CONTROL_COMMAND), "unknown control command"}, diff --git a/crypto/ui/ui_lib.c b/crypto/ui/ui_lib.c index 004aeb02b6..28f5f61ed1 100644 --- a/crypto/ui/ui_lib.c +++ b/crypto/ui/ui_lib.c @@ -423,9 +423,13 @@ static int print_error(const char *str, size_t len, UI *ui) int UI_process(UI *ui) { int i, ok = 0; + const char *state = "processing"; - if (ui->meth->ui_open_session && !ui->meth->ui_open_session(ui)) - return -1; + if (ui->meth->ui_open_session && !ui->meth->ui_open_session(ui)) { + state = "opening session"; + ok = -1; + goto err; + } if (ui->flags & UI_FLAG_PRINT_ERRORS) ERR_print_errors_cb((int (*)(const char *, size_t, void *)) @@ -436,6 +440,7 @@ int UI_process(UI *ui) && !ui->meth->ui_write_string(ui, sk_UI_STRING_value(ui->strings, i))) { + state = "writing strings"; ok = -1; goto err; } @@ -447,6 +452,7 @@ int UI_process(UI *ui) ok = -2; goto err; case 0: /* Errors */ + state = "flushing"; ok = -1; goto err; default: /* Success */ @@ -463,6 +469,7 @@ int UI_process(UI *ui) ok = -2; goto err; case 0: /* Errors */ + state = "reading strings"; ok = -1; goto err; default: /* Success */ @@ -472,8 +479,16 @@ int UI_process(UI *ui) } } err: - if (ui->meth->ui_close_session && !ui->meth->ui_close_session(ui)) - return -1; + if (ui->meth->ui_close_session && !ui->meth->ui_close_session(ui)) { + if (state == NULL) + state = "closing session"; + ok = -1; + } + + if (ok == -1) { + UIerr(UI_F_UI_PROCESS, UI_R_PROCESSING_ERROR); + ERR_add_error_data(2, "while ", state); + } return ok; } diff --git a/include/openssl/ui.h b/include/openssl/ui.h index 26f4f04495..c62c05d17e 100644 --- a/include/openssl/ui.h +++ b/include/openssl/ui.h @@ -350,6 +350,7 @@ int ERR_load_UI_strings(void); # define UI_F_UI_DUP_VERIFY_STRING 106 # define UI_F_UI_GET0_RESULT 107 # define UI_F_UI_NEW_METHOD 104 +# define UI_F_UI_PROCESS 113 # define UI_F_UI_SET_RESULT 105 /* Reason codes. */ @@ -357,6 +358,7 @@ int ERR_load_UI_strings(void); # define UI_R_INDEX_TOO_LARGE 102 # define UI_R_INDEX_TOO_SMALL 103 # define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_PROCESSING_ERROR 107 # define UI_R_RESULT_TOO_LARGE 100 # define UI_R_RESULT_TOO_SMALL 101 # define UI_R_UNKNOWN_CONTROL_COMMAND 106 -- 2.25.1