mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
Fix processing of pathnames with embedded '\\' characters (0x5c) in CP932
character set. Because of the allowing of "broken conversions" for people who have broken iconv libraries we can't rely on the return from convert_string() to be valid - we must check errno instead. This is ripe for revisiting at some stage. I prefer adding a bool parameter to all convert_string_XX varients to specify if we will allow broken conversions or not. With "allow_broken_conversions" set to false we could then rely on the return from convert_string rather than checking errno. Jeremy.
This commit is contained in:
parent
e6c2d9a3f7
commit
74722f2865
@ -45,7 +45,7 @@ extern BOOL global_encrypted_passwords_negotiated;
|
||||
set.
|
||||
****************************************************************************/
|
||||
|
||||
static NTSTATUS check_path_syntax(pstring destname, const pstring srcname)
|
||||
NTSTATUS check_path_syntax(pstring destname, const pstring srcname)
|
||||
{
|
||||
char *d = destname;
|
||||
const char *s = srcname;
|
||||
@ -122,12 +122,30 @@ static NTSTATUS check_path_syntax(pstring destname, const pstring srcname)
|
||||
*/
|
||||
|
||||
uint16 ucs2_val;
|
||||
if (convert_string(CH_UNIX, CH_UCS2, s, 1, &ucs2_val, 2) == 2) {
|
||||
|
||||
/*
|
||||
* We know the following will return 2 bytes. What
|
||||
* we need to know was if errno was set.
|
||||
* Note that if CH_UNIX is utf8 a string may be 3
|
||||
* bytes, but this is ok as mb utf8 characters don't
|
||||
* contain embedded directory separators. We are really checking
|
||||
* for mb UNIX asian characters like Japanese (SJIS) here.
|
||||
* JRA.
|
||||
*/
|
||||
|
||||
errno = 0;
|
||||
convert_string(CH_UNIX, CH_UCS2, s, 1, &ucs2_val, 2);
|
||||
if (errno == 0) {
|
||||
;
|
||||
} else if (convert_string(CH_UNIX, CH_UCS2, s, 2, &ucs2_val, 2) == 2) {
|
||||
*d++ = *s++;
|
||||
} else {
|
||||
smb_panic("check_path_syntax: directory separator assumptions invalid !\n");
|
||||
errno = 0;
|
||||
convert_string(CH_UNIX, CH_UCS2, s, 2, &ucs2_val, 2);
|
||||
if (errno == 0) {
|
||||
*d++ = *s++;
|
||||
} else {
|
||||
DEBUG(0,("check_path_syntax: directory separator assumptions invalid !\n"));
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Just copy the char (or the second byte of the mb char). */
|
||||
|
Loading…
Reference in New Issue
Block a user