2 * Copyright 2003-2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
12 #include <openssl/crypto.h>
13 #include "internal/cryptlib.h"
15 char *CRYPTO_strdup(const char *str
, const char* file
, int line
)
21 ret
= CRYPTO_malloc(strlen(str
) + 1, file
, line
);
27 char *CRYPTO_strndup(const char *str
, size_t s
, const char* file
, int line
)
35 maxlen
= OPENSSL_strnlen(str
, s
);
37 ret
= CRYPTO_malloc(maxlen
+ 1, file
, line
);
39 memcpy(ret
, str
, maxlen
);
45 void *CRYPTO_memdup(const void *data
, size_t siz
, const char* file
, int line
)
49 if (data
== NULL
|| siz
>= INT_MAX
)
52 ret
= CRYPTO_malloc(siz
, file
, line
);
54 CRYPTOerr(CRYPTO_F_CRYPTO_MEMDUP
, ERR_R_MALLOC_FAILURE
);
57 return memcpy(ret
, data
, siz
);
60 size_t OPENSSL_strnlen(const char *str
, size_t maxlen
)
64 for (p
= str
; maxlen
-- != 0 && *p
!= '\0'; ++p
) ;
69 size_t OPENSSL_strlcpy(char *dst
, const char *src
, size_t size
)
72 for (; size
> 1 && *src
; size
--) {
78 return l
+ strlen(src
);
81 size_t OPENSSL_strlcat(char *dst
, const char *src
, size_t size
)
84 for (; size
> 0 && *dst
; size
--, dst
++)
86 return l
+ OPENSSL_strlcpy(dst
, src
, size
);
89 int OPENSSL_hexchar2int(unsigned char c
)
133 * Give a string of hex digits convert to a buffer
135 unsigned char *OPENSSL_hexstr2buf(const char *str
, long *len
)
137 unsigned char *hexbuf
, *q
;
138 unsigned char ch
, cl
;
140 const unsigned char *p
;
144 if ((hexbuf
= OPENSSL_malloc(s
>> 1)) == NULL
) {
145 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
, ERR_R_MALLOC_FAILURE
);
148 for (p
= (const unsigned char *)str
, q
= hexbuf
; *p
; ) {
154 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
,
155 CRYPTO_R_ODD_NUMBER_OF_DIGITS
);
156 OPENSSL_free(hexbuf
);
159 cli
= OPENSSL_hexchar2int(cl
);
160 chi
= OPENSSL_hexchar2int(ch
);
161 if (cli
< 0 || chi
< 0) {
162 OPENSSL_free(hexbuf
);
163 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
, CRYPTO_R_ILLEGAL_HEX_DIGIT
);
166 *q
++ = (unsigned char)((chi
<< 4) | cli
);
175 * Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
176 * hex representation @@@ (Contents of buffer are always kept in ASCII, also
177 * on EBCDIC machines)
179 char *OPENSSL_buf2hexstr(const unsigned char *buffer
, long len
)
181 static const char hexdig
[] = "0123456789ABCDEF";
183 const unsigned char *p
;
187 return OPENSSL_zalloc(1);
189 if ((tmp
= OPENSSL_malloc(len
* 3)) == NULL
) {
190 CRYPTOerr(CRYPTO_F_OPENSSL_BUF2HEXSTR
, ERR_R_MALLOC_FAILURE
);
194 for (i
= 0, p
= buffer
; i
< len
; i
++, p
++) {
195 *q
++ = hexdig
[(*p
>> 4) & 0xf];
196 *q
++ = hexdig
[*p
& 0xf];
200 #ifdef CHARSET_EBCDIC
201 ebcdic2ascii(tmp
, tmp
, q
- tmp
- 1);
207 int openssl_strerror_r(int errnum
, char *buf
, size_t buflen
)
209 #if defined(_MSC_VER) && _MSC_VER>=1400
210 return !strerror_s(buf
, buflen
, errnum
);
211 #elif defined(_GNU_SOURCE)
215 * GNU strerror_r may not actually set buf.
216 * It can return a pointer to some (immutable) static string in which case
217 * buf is left unused.
219 err
= strerror_r(errnum
, buf
, buflen
);
220 if (err
== NULL
|| buflen
== 0)
223 * If err is statically allocated, err != buf and we need to copy the data.
224 * If err points somewhere inside buf, OPENSSL_strlcpy can handle this,
225 * since src and dest are not annotated with __restrict and the function
226 * reads src byte for byte and writes to dest.
227 * If err == buf we do not have to copy anything.
230 OPENSSL_strlcpy(buf
, err
, buflen
);
232 #elif (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \
233 (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
235 * We can use "real" strerror_r. The OpenSSL version differs in that it
236 * gives 1 on success and 0 on failure for consistency with other OpenSSL
237 * functions. Real strerror_r does it the other way around
239 return !strerror_r(errnum
, buf
, buflen
);
243 /* Fall back to non-thread safe strerror()...its all we can do */
246 err
= strerror(errnum
);
247 /* Can this ever happen? */
250 OPENSSL_strlcpy(buf
, err
, buflen
);