projects
/
openssl.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
dfda027
)
bss_file.c: refine UTF8 logic [from HEAD].
author
Andy Polyakov
<appro@openssl.org>
Sat, 11 Dec 2010 14:54:48 +0000
(14:54 +0000)
committer
Andy Polyakov
<appro@openssl.org>
Sat, 11 Dec 2010 14:54:48 +0000
(14:54 +0000)
PR: 2382
crypto/bio/bss_file.c
patch
|
blob
|
history
diff --git
a/crypto/bio/bss_file.c
b/crypto/bio/bss_file.c
index 8bfa0bcd97d7a2a9052f4f63d1a9860f92a3cf53..b954fe7ebc8d41d64e278a09b15ca7f39fdd034c 100644
(file)
--- a/
crypto/bio/bss_file.c
+++ b/
crypto/bio/bss_file.c
@@
-123,6
+123,7
@@
BIO *BIO_new_file(const char *filename, const char *mode)
#if defined(_WIN32) && defined(CP_UTF8)
int sz, len_0 = (int)strlen(filename)+1;
#if defined(_WIN32) && defined(CP_UTF8)
int sz, len_0 = (int)strlen(filename)+1;
+ DWORD flags;
/*
* Basically there are three cases to cover: a) filename is
/*
* Basically there are three cases to cover: a) filename is
@@
-136,17
+137,22
@@
BIO *BIO_new_file(const char *filename, const char *mode)
* ERROR_NO_UNICODE_TRANSLATION, in which case we fall
* back to fopen...
*/
* ERROR_NO_UNICODE_TRANSLATION, in which case we fall
* back to fopen...
*/
- if ((sz=MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,
+ if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS),
+ filename,len_0,NULL,0))>0 ||
+ (GetLastError()==ERROR_INVALID_FLAGS &&
+ (sz=MultiByteToWideChar(CP_UTF8,(flags=0),
filename,len_0,NULL,0))>0)
filename,len_0,NULL,0))>0)
+ )
{
WCHAR wmode[8];
WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
{
WCHAR wmode[8];
WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
- if (MultiByteToWideChar(CP_UTF8,
MB_ERR_INVALID_CHARS
,
+ if (MultiByteToWideChar(CP_UTF8,
flags
,
filename,len_0,wfilename,sz) &&
MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
wmode,sizeof(wmode)/sizeof(wmode[0])) &&
filename,len_0,wfilename,sz) &&
MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
wmode,sizeof(wmode)/sizeof(wmode[0])) &&
- (file=_wfopen(wfilename,wmode))==NULL && errno==ENOENT
+ (file=_wfopen(wfilename,wmode))==NULL &&
+ (errno==ENOENT || errno==EBADF)
) /* UTF-8 decode succeeded, but no file, filename
* could still have been locale-ized... */
file = fopen(filename,mode);
) /* UTF-8 decode succeeded, but no file, filename
* could still have been locale-ized... */
file = fopen(filename,mode);