RT3479: Add UTF8 support to BIO_read_filename()
If we use BIO_new_file(), on Windows it'll jump through hoops to work around their unusual charset/Unicode handling. it'll convert a UTF-8 filename to UCS-16LE and attempt to use _wfopen(). If you use BIO_read_filename(), it doesn't do this. Shouldn't it be consistent? It would certainly be nice if SSL_use_certificate_chain_file() worked. Also made BIO_C_SET_FILENAME work (rsalz) Signed-off-by: Rich Salz <rsalz@akamai.com> Reviewed-by: Andy Polyakov <appro@openssl.org> (cherry picked from commit ff03599a2f518dbdf13bca0bb0208e431b892fe9)
This commit is contained in:
parent
d601b9b50c
commit
0ea050e743
@ -115,9 +115,8 @@ static BIO_METHOD methods_filep = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
BIO *BIO_new_file(const char *filename, const char *mode)
|
static FILE *file_fopen(const char *filename, const char *mode)
|
||||||
{
|
{
|
||||||
BIO *ret;
|
|
||||||
FILE *file = NULL;
|
FILE *file = NULL;
|
||||||
|
|
||||||
# if defined(_WIN32) && defined(CP_UTF8)
|
# if defined(_WIN32) && defined(CP_UTF8)
|
||||||
@ -164,6 +163,14 @@ BIO *BIO_new_file(const char *filename, const char *mode)
|
|||||||
# else
|
# else
|
||||||
file = fopen(filename, mode);
|
file = fopen(filename, mode);
|
||||||
# endif
|
# endif
|
||||||
|
return (file);
|
||||||
|
}
|
||||||
|
|
||||||
|
BIO *BIO_new_file(const char *filename, const char *mode)
|
||||||
|
{
|
||||||
|
BIO *ret;
|
||||||
|
FILE *file = file_fopen(filename, mode);
|
||||||
|
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
SYSerr(SYS_F_FOPEN, get_last_sys_error());
|
SYSerr(SYS_F_FOPEN, get_last_sys_error());
|
||||||
ERR_add_error_data(5, "fopen('", filename, "','", mode, "')");
|
ERR_add_error_data(5, "fopen('", filename, "','", mode, "')");
|
||||||
@ -386,7 +393,7 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
else
|
else
|
||||||
strcat(p, "t");
|
strcat(p, "t");
|
||||||
# endif
|
# endif
|
||||||
fp = fopen(ptr, p);
|
fp = file_fopen(ptr, p);
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
SYSerr(SYS_F_FOPEN, get_last_sys_error());
|
SYSerr(SYS_F_FOPEN, get_last_sys_error());
|
||||||
ERR_add_error_data(5, "fopen('", ptr, "','", p, "')");
|
ERR_add_error_data(5, "fopen('", ptr, "','", p, "')");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user