|  | /* | 
|  | * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project | 
|  | * 2003. | 
|  | */ | 
|  | /* ==================================================================== | 
|  | * Copyright (c) 2003 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). | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <ctype.h> | 
|  | #include <limits.h> | 
|  | #include <e_os.h> | 
|  | #include <openssl/crypto.h> | 
|  | #include "internal/cryptlib.h" | 
|  | #include "internal/o_str.h" | 
|  |  | 
|  | #if !defined(OPENSSL_IMPLEMENTS_strncasecmp) && \ | 
|  | !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_WINCE) && \ | 
|  | !defined(NETWARE_CLIB) | 
|  | # include <strings.h> | 
|  | #endif | 
|  |  | 
|  | int OPENSSL_strncasecmp(const char *str1, const char *str2, size_t n) | 
|  | { | 
|  | #if defined(OPENSSL_IMPLEMENTS_strncasecmp) | 
|  | while (*str1 && *str2 && n) { | 
|  | int res = toupper(*str1) - toupper(*str2); | 
|  | if (res) | 
|  | return res < 0 ? -1 : 1; | 
|  | str1++; | 
|  | str2++; | 
|  | n--; | 
|  | } | 
|  | if (n == 0) | 
|  | return 0; | 
|  | if (*str1) | 
|  | return 1; | 
|  | if (*str2) | 
|  | return -1; | 
|  | return 0; | 
|  | #else | 
|  | /* | 
|  | * Recursion hazard warning! Whenever strncasecmp is #defined as | 
|  | * OPENSSL_strncasecmp, OPENSSL_IMPLEMENTS_strncasecmp must be defined as | 
|  | * well. | 
|  | */ | 
|  | return strncasecmp(str1, str2, n); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | int OPENSSL_strcasecmp(const char *str1, const char *str2) | 
|  | { | 
|  | #if defined(OPENSSL_IMPLEMENTS_strncasecmp) | 
|  | return OPENSSL_strncasecmp(str1, str2, (size_t)-1); | 
|  | #else | 
|  | return strcasecmp(str1, str2); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | int OPENSSL_memcmp(const void *v1, const void *v2, size_t n) | 
|  | { | 
|  | const unsigned char *c1 = v1, *c2 = v2; | 
|  | int ret = 0; | 
|  |  | 
|  | while (n && (ret = *c1 - *c2) == 0) | 
|  | n--, c1++, c2++; | 
|  |  | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | char *CRYPTO_strdup(const char *str, const char* file, int line) | 
|  | { | 
|  | char *ret; | 
|  | size_t size; | 
|  |  | 
|  | if (str == NULL) | 
|  | return NULL; | 
|  | size = strlen(str) + 1; | 
|  | ret = CRYPTO_malloc(size, file, line); | 
|  | if (ret != NULL) | 
|  | memcpy(ret, str, size); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | char *CRYPTO_strndup(const char *str, size_t s, const char* file, int line) | 
|  | { | 
|  | size_t maxlen; | 
|  | char *ret; | 
|  |  | 
|  | if (str == NULL) | 
|  | return NULL; | 
|  |  | 
|  | maxlen = OPENSSL_strnlen(str, s); | 
|  |  | 
|  | ret = CRYPTO_malloc(maxlen + 1, file, line); | 
|  | if (ret) { | 
|  | memcpy(ret, str, maxlen); | 
|  | ret[maxlen] = '\0'; | 
|  | } | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | void *CRYPTO_memdup(const void *data, size_t siz, const char* file, int line) | 
|  | { | 
|  | void *ret; | 
|  |  | 
|  | if (data == NULL || siz >= INT_MAX) | 
|  | return NULL; | 
|  |  | 
|  | ret = CRYPTO_malloc(siz, file, line); | 
|  | if (ret == NULL) { | 
|  | CRYPTOerr(CRYPTO_F_CRYPTO_MEMDUP, ERR_R_MALLOC_FAILURE); | 
|  | return NULL; | 
|  | } | 
|  | return memcpy(ret, data, siz); | 
|  | } | 
|  |  | 
|  | size_t OPENSSL_strnlen(const char *str, size_t maxlen) | 
|  | { | 
|  | const char *p; | 
|  |  | 
|  | for (p = str; maxlen-- != 0 && *p != '\0'; ++p) ; | 
|  |  | 
|  | return p - str; | 
|  | } | 
|  |  | 
|  | size_t OPENSSL_strlcpy(char *dst, const char *src, size_t size) | 
|  | { | 
|  | size_t l = 0; | 
|  | for (; size > 1 && *src; size--) { | 
|  | *dst++ = *src++; | 
|  | l++; | 
|  | } | 
|  | if (size) | 
|  | *dst = '\0'; | 
|  | return l + strlen(src); | 
|  | } | 
|  |  | 
|  | size_t OPENSSL_strlcat(char *dst, const char *src, size_t size) | 
|  | { | 
|  | size_t l = 0; | 
|  | for (; size > 0 && *dst; size--, dst++) | 
|  | l++; | 
|  | return l + OPENSSL_strlcpy(dst, src, size); | 
|  | } |