X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fui%2Fui_lib.c;h=273bfb60959ab53a83d740da6b1b790cf8d818a5;hp=26afbd23f7b9750aebe70d3cb82d9f956f3e0f7a;hb=f3b3d7f0033080f86ede5a53e8af2fb313091b5a;hpb=b548a1f11c06ccdfa4f52a539912d22d77ee309e diff --git a/crypto/ui/ui_lib.c b/crypto/ui/ui_lib.c index 26afbd23f7..273bfb6095 100644 --- a/crypto/ui/ui_lib.c +++ b/crypto/ui/ui_lib.c @@ -1,64 +1,14 @@ -/* crypto/ui/ui_lib.c -*- mode:C; c-file-style: "eay" -*- */ /* - * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project - * 2001. - */ -/* ==================================================================== - * Copyright (c) 2001 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). + * Copyright 2001-2016 The OpenSSL Project Authors. All Rights Reserved. * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html */ #include -#include "cryptlib.h" +#include "internal/cryptlib.h" #include #include #include @@ -74,21 +24,29 @@ UI *UI_new(void) UI *UI_new_method(const UI_METHOD *method) { - UI *ret = OPENSSL_malloc(sizeof(UI)); + UI *ret = OPENSSL_zalloc(sizeof(*ret)); if (ret == NULL) { UIerr(UI_F_UI_NEW_METHOD, ERR_R_MALLOC_FAILURE); return NULL; } + + ret->lock = CRYPTO_THREAD_lock_new(); + if (ret->lock == NULL) { + UIerr(UI_F_UI_NEW_METHOD, ERR_R_MALLOC_FAILURE); + OPENSSL_free(ret); + return NULL; + } + if (method == NULL) ret->meth = UI_get_default_method(); else ret->meth = method; - ret->strings = NULL; - ret->user_data = NULL; - ret->flags = 0; - CRYPTO_new_ex_data(CRYPTO_EX_INDEX_UI, ret, &ret->ex_data); + if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_UI, ret, &ret->ex_data)) { + OPENSSL_free(ret); + return NULL; + } return ret; } @@ -102,7 +60,11 @@ static void free_string(UI_STRING *uis) OPENSSL_free((char *)uis->_.boolean_data.ok_chars); OPENSSL_free((char *)uis->_.boolean_data.cancel_chars); break; - default: + case UIT_NONE: + case UIT_PROMPT: + case UIT_VERIFY: + case UIT_ERROR: + case UIT_INFO: break; } } @@ -115,6 +77,7 @@ void UI_free(UI *ui) return; sk_UI_STRING_pop_free(ui->strings, free_string); CRYPTO_free_ex_data(CRYPTO_EX_INDEX_UI, ui, &ui->ex_data); + CRYPTO_THREAD_lock_free(ui->lock); OPENSSL_free(ui); } @@ -141,7 +104,7 @@ static UI_STRING *general_allocate_prompt(UI *ui, const char *prompt, } else if ((type == UIT_PROMPT || type == UIT_VERIFY || type == UIT_BOOLEAN) && result_buf == NULL) { UIerr(UI_F_GENERAL_ALLOCATE_PROMPT, UI_R_NO_RESULT_BUFFER); - } else if ((ret = OPENSSL_malloc(sizeof(UI_STRING)))) { + } else if ((ret = OPENSSL_malloc(sizeof(*ret))) != NULL) { ret->out_string = prompt; ret->flags = prompt_freeable ? OUT_STRING_FREEABLE : 0; ret->input_flags = input_flags; @@ -167,9 +130,11 @@ static int general_allocate_string(UI *ui, const char *prompt, s->_.string_data.result_maxsize = maxsize; s->_.string_data.test_buf = test_buf; ret = sk_UI_STRING_push(ui->strings, s); - /* sk_push() returns 0 on error. Let's addapt that */ - if (ret <= 0) + /* sk_push() returns 0 on error. Let's adapt that */ + if (ret <= 0) { ret--; + free_string(s); + } } else free_string(s); } @@ -211,10 +176,12 @@ static int general_allocate_boolean(UI *ui, s->_.boolean_data.cancel_chars = cancel_chars; ret = sk_UI_STRING_push(ui->strings, s); /* - * sk_push() returns 0 on error. Let's addapt that + * sk_push() returns 0 on error. Let's adapt that */ - if (ret <= 0) + if (ret <= 0) { ret--; + free_string(s); + } } else free_string(s); } @@ -241,7 +208,7 @@ int UI_dup_input_string(UI *ui, const char *prompt, int flags, char *prompt_copy = NULL; if (prompt) { - prompt_copy = BUF_strdup(prompt); + prompt_copy = OPENSSL_strdup(prompt); if (prompt_copy == NULL) { UIerr(UI_F_UI_DUP_INPUT_STRING, ERR_R_MALLOC_FAILURE); return 0; @@ -269,7 +236,7 @@ int UI_dup_verify_string(UI *ui, const char *prompt, int flags, char *prompt_copy = NULL; if (prompt) { - prompt_copy = BUF_strdup(prompt); + prompt_copy = OPENSSL_strdup(prompt); if (prompt_copy == NULL) { UIerr(UI_F_UI_DUP_VERIFY_STRING, ERR_R_MALLOC_FAILURE); return -1; @@ -300,7 +267,7 @@ int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, char *cancel_chars_copy = NULL; if (prompt) { - prompt_copy = BUF_strdup(prompt); + prompt_copy = OPENSSL_strdup(prompt); if (prompt_copy == NULL) { UIerr(UI_F_UI_DUP_INPUT_BOOLEAN, ERR_R_MALLOC_FAILURE); goto err; @@ -308,7 +275,7 @@ int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, } if (action_desc) { - action_desc_copy = BUF_strdup(action_desc); + action_desc_copy = OPENSSL_strdup(action_desc); if (action_desc_copy == NULL) { UIerr(UI_F_UI_DUP_INPUT_BOOLEAN, ERR_R_MALLOC_FAILURE); goto err; @@ -316,7 +283,7 @@ int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, } if (ok_chars) { - ok_chars_copy = BUF_strdup(ok_chars); + ok_chars_copy = OPENSSL_strdup(ok_chars); if (ok_chars_copy == NULL) { UIerr(UI_F_UI_DUP_INPUT_BOOLEAN, ERR_R_MALLOC_FAILURE); goto err; @@ -324,7 +291,7 @@ int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, } if (cancel_chars) { - cancel_chars_copy = BUF_strdup(cancel_chars); + cancel_chars_copy = OPENSSL_strdup(cancel_chars); if (cancel_chars_copy == NULL) { UIerr(UI_F_UI_DUP_INPUT_BOOLEAN, ERR_R_MALLOC_FAILURE); goto err; @@ -353,7 +320,7 @@ int UI_dup_info_string(UI *ui, const char *text) char *text_copy = NULL; if (text) { - text_copy = BUF_strdup(text); + text_copy = OPENSSL_strdup(text); if (text_copy == NULL) { UIerr(UI_F_UI_DUP_INFO_STRING, ERR_R_MALLOC_FAILURE); return -1; @@ -375,7 +342,7 @@ int UI_dup_error_string(UI *ui, const char *text) char *text_copy = NULL; if (text) { - text_copy = BUF_strdup(text); + text_copy = OPENSSL_strdup(text); if (text_copy == NULL) { UIerr(UI_F_UI_DUP_ERROR_STRING, ERR_R_MALLOC_FAILURE); return -1; @@ -408,13 +375,13 @@ char *UI_construct_prompt(UI *ui, const char *object_desc, prompt = OPENSSL_malloc(len + 1); if (prompt == NULL) return NULL; - BUF_strlcpy(prompt, prompt1, len + 1); - BUF_strlcat(prompt, object_desc, len + 1); + OPENSSL_strlcpy(prompt, prompt1, len + 1); + OPENSSL_strlcat(prompt, object_desc, len + 1); if (object_name) { - BUF_strlcat(prompt, prompt2, len + 1); - BUF_strlcat(prompt, object_name, len + 1); + OPENSSL_strlcat(prompt, prompt2, len + 1); + OPENSSL_strlcat(prompt, object_name, len + 1); } - BUF_strlcat(prompt, prompt3, len + 1); + OPENSSL_strlcat(prompt, prompt3, len + 1); } return prompt; } @@ -539,13 +506,6 @@ int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)) return -1; } -int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, - CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) -{ - return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, argl, argp, - new_func, dup_func, free_func); -} - int UI_set_ex_data(UI *r, int idx, void *arg) { return (CRYPTO_set_ex_data(&r->ex_data, idx, arg)); @@ -580,13 +540,17 @@ const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth) return ui->meth; } -UI_METHOD *UI_create_method(char *name) +UI_METHOD *UI_create_method(const char *name) { - UI_METHOD *ui_method = OPENSSL_malloc(sizeof(UI_METHOD)); + UI_METHOD *ui_method = OPENSSL_zalloc(sizeof(*ui_method)); - if (ui_method) { - memset(ui_method, 0, sizeof(*ui_method)); - ui_method->name = BUF_strdup(name); + if (ui_method != NULL) { + ui_method->name = OPENSSL_strdup(name); + if (ui_method->name == NULL) { + OPENSSL_free(ui_method); + UIerr(UI_F_UI_CREATE_METHOD, ERR_R_MALLOC_FAILURE); + return NULL; + } } return ui_method; } @@ -710,87 +674,92 @@ char *(*UI_method_get_prompt_constructor(UI_METHOD *method)) (UI *, enum UI_string_types UI_get_string_type(UI_STRING *uis) { - if (!uis) - return UIT_NONE; return uis->type; } int UI_get_input_flags(UI_STRING *uis) { - if (!uis) - return 0; return uis->input_flags; } const char *UI_get0_output_string(UI_STRING *uis) { - if (!uis) - return NULL; return uis->out_string; } const char *UI_get0_action_string(UI_STRING *uis) { - if (!uis) - return NULL; switch (uis->type) { case UIT_PROMPT: case UIT_BOOLEAN: return uis->_.boolean_data.action_desc; - default: - return NULL; + case UIT_NONE: + case UIT_VERIFY: + case UIT_INFO: + case UIT_ERROR: + break; } + return NULL; } const char *UI_get0_result_string(UI_STRING *uis) { - if (!uis) - return NULL; switch (uis->type) { case UIT_PROMPT: case UIT_VERIFY: return uis->result_buf; - default: - return NULL; + case UIT_NONE: + case UIT_BOOLEAN: + case UIT_INFO: + case UIT_ERROR: + break; } + return NULL; } const char *UI_get0_test_string(UI_STRING *uis) { - if (!uis) - return NULL; switch (uis->type) { case UIT_VERIFY: return uis->_.string_data.test_buf; - default: - return NULL; + case UIT_NONE: + case UIT_BOOLEAN: + case UIT_INFO: + case UIT_ERROR: + case UIT_PROMPT: + break; } + return NULL; } int UI_get_result_minsize(UI_STRING *uis) { - if (!uis) - return -1; switch (uis->type) { case UIT_PROMPT: case UIT_VERIFY: return uis->_.string_data.result_minsize; - default: - return -1; + case UIT_NONE: + case UIT_INFO: + case UIT_ERROR: + case UIT_BOOLEAN: + break; } + return -1; } int UI_get_result_maxsize(UI_STRING *uis) { - if (!uis) - return -1; switch (uis->type) { case UIT_PROMPT: case UIT_VERIFY: return uis->_.string_data.result_maxsize; - default: - return -1; + case UIT_NONE: + case UIT_INFO: + case UIT_ERROR: + case UIT_BOOLEAN: + break; } + return -1; } int UI_set_result(UI *ui, UI_STRING *uis, const char *result) @@ -799,8 +768,6 @@ int UI_set_result(UI *ui, UI_STRING *uis, const char *result) ui->flags &= ~UI_FLAG_REDOABLE; - if (!uis) - return -1; switch (uis->type) { case UIT_PROMPT: case UIT_VERIFY: @@ -829,19 +796,19 @@ int UI_set_result(UI *ui, UI_STRING *uis, const char *result) } } - if (!uis->result_buf) { + if (uis->result_buf == NULL) { UIerr(UI_F_UI_SET_RESULT, UI_R_NO_RESULT_BUFFER); return -1; } - BUF_strlcpy(uis->result_buf, result, + OPENSSL_strlcpy(uis->result_buf, result, uis->_.string_data.result_maxsize + 1); break; case UIT_BOOLEAN: { const char *p; - if (!uis->result_buf) { + if (uis->result_buf == NULL) { UIerr(UI_F_UI_SET_RESULT, UI_R_NO_RESULT_BUFFER); return -1; } @@ -858,7 +825,9 @@ int UI_set_result(UI *ui, UI_STRING *uis, const char *result) } } } - default: + case UIT_NONE: + case UIT_INFO: + case UIT_ERROR: break; } return 0;