Commit ff03599a authored by David Woodhouse's avatar David Woodhouse Committed by Rich Salz
Browse files

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: default avatarRich Salz <rsalz@akamai.com>
Reviewed-by: default avatarAndy Polyakov <appro@openssl.org>
parent 4cd94416
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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 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, "')");