diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2015-09-09 15:49:01 -0400 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2015-09-21 17:31:58 -0400 |
commit | 0ea050e743e57235ba2e1a9a105b61490c09c149 (patch) | |
tree | 5f9defb19faafb98ff6c54f751fcff21f6fa97a4 /crypto/bio | |
parent | d601b9b50c0157279d9b968e27c944719f85936f (diff) |
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)
Diffstat (limited to 'crypto/bio')
-rw-r--r-- | crypto/bio/bss_file.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index d7f15b0699..bfba93e62b 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -115,9 +115,8 @@ static BIO_METHOD methods_filep = { 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; # if defined(_WIN32) && defined(CP_UTF8) @@ -164,6 +163,14 @@ BIO *BIO_new_file(const char *filename, const char *mode) # else file = fopen(filename, mode); # endif + return (file); +} + +BIO *BIO_new_file(const char *filename, const char *mode) +{ + BIO *ret; + FILE *file = file_fopen(filename, mode); + if (file == NULL) { SYSerr(SYS_F_FOPEN, get_last_sys_error()); 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 strcat(p, "t"); # endif - fp = fopen(ptr, p); + fp = file_fopen(ptr, p); if (fp == NULL) { SYSerr(SYS_F_FOPEN, get_last_sys_error()); ERR_add_error_data(5, "fopen('", ptr, "','", p, "')"); |