summaryrefslogtreecommitdiffstats
path: root/crypto/ui
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2016-12-07 16:36:44 +0100
committerRichard Levitte <richard@levitte.org>2016-12-08 00:09:04 +0100
commitaff927e84c3bce5b7ebc2cc72f99a571ea89c2b1 (patch)
tree894edf30bf7eb7e9f6822257308d1bbdb2fd50dc /crypto/ui
parent72ea4b8de29bd29dcc44b3d3a73660fe4d1bba40 (diff)
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 <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/2037) (cherry picked from commit 0a687ab0a92d2d68289364a6e232028c229f44bb)
Diffstat (limited to 'crypto/ui')
-rw-r--r--crypto/ui/ui_err.c2
-rw-r--r--crypto/ui/ui_lib.c23
2 files changed, 21 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;
}