diff options
| -rw-r--r-- | fs/cifs/cifs_debug.c | 56 | ||||
| -rw-r--r-- | fs/cifs/cifsencrypt.c | 9 | ||||
| -rw-r--r-- | fs/cifs/cifssmb.c | 7 |
3 files changed, 56 insertions, 16 deletions
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 4e10e21c54fd..7c0015a96959 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
| @@ -445,8 +445,8 @@ static read_proc_t traceSMB_read; | |||
| 445 | static write_proc_t traceSMB_write; | 445 | static write_proc_t traceSMB_write; |
| 446 | static read_proc_t multiuser_mount_read; | 446 | static read_proc_t multiuser_mount_read; |
| 447 | static write_proc_t multiuser_mount_write; | 447 | static write_proc_t multiuser_mount_write; |
| 448 | static read_proc_t extended_security_read; | 448 | static read_proc_t security_flags_read; |
| 449 | static write_proc_t extended_security_write; | 449 | static write_proc_t security_flags_write; |
| 450 | /* static read_proc_t ntlmv2_enabled_read; | 450 | /* static read_proc_t ntlmv2_enabled_read; |
| 451 | static write_proc_t ntlmv2_enabled_write; | 451 | static write_proc_t ntlmv2_enabled_write; |
| 452 | static read_proc_t packet_signing_enabled_read; | 452 | static read_proc_t packet_signing_enabled_read; |
| @@ -509,9 +509,9 @@ cifs_proc_init(void) | |||
| 509 | 509 | ||
| 510 | pde = | 510 | pde = |
| 511 | create_proc_read_entry("SecurityFlags", 0, proc_fs_cifs, | 511 | create_proc_read_entry("SecurityFlags", 0, proc_fs_cifs, |
| 512 | extended_security_read, NULL); | 512 | security_flags_read, NULL); |
| 513 | if (pde) | 513 | if (pde) |
| 514 | pde->write_proc = extended_security_write; | 514 | pde->write_proc = security_flags_write; |
| 515 | 515 | ||
| 516 | pde = | 516 | pde = |
| 517 | create_proc_read_entry("LookupCacheEnabled", 0, proc_fs_cifs, | 517 | create_proc_read_entry("LookupCacheEnabled", 0, proc_fs_cifs, |
| @@ -832,7 +832,7 @@ multiuser_mount_write(struct file *file, const char __user *buffer, | |||
| 832 | } | 832 | } |
| 833 | 833 | ||
| 834 | static int | 834 | static int |
| 835 | extended_security_read(char *page, char **start, off_t off, | 835 | security_flags_read(char *page, char **start, off_t off, |
| 836 | int count, int *eof, void *data) | 836 | int count, int *eof, void *data) |
| 837 | { | 837 | { |
| 838 | int len; | 838 | int len; |
| @@ -853,26 +853,50 @@ extended_security_read(char *page, char **start, off_t off, | |||
| 853 | return len; | 853 | return len; |
| 854 | } | 854 | } |
| 855 | static int | 855 | static int |
| 856 | extended_security_write(struct file *file, const char __user *buffer, | 856 | security_flags_write(struct file *file, const char __user *buffer, |
| 857 | unsigned long count, void *data) | 857 | unsigned long count, void *data) |
| 858 | { | 858 | { |
| 859 | unsigned int flags; | ||
| 860 | char flags_string[12]; | ||
| 859 | char c; | 861 | char c; |
| 860 | int rc; | 862 | |
| 861 | cERROR(1,("size %ld",count)); /* BB removeme BB */ | 863 | cERROR(1,("size %ld",count)); /* BB removeme BB */ |
| 862 | if((count < 2) || (count > 8)) | 864 | |
| 865 | if((count < 1) || (count > 11)) | ||
| 863 | return -EINVAL; | 866 | return -EINVAL; |
| 864 | 867 | ||
| 865 | rc = get_user(c, buffer); | 868 | memset(flags_string, 0, 12); |
| 866 | 869 | ||
| 867 | /* BB fixme need to parse more characters in order to handle CIFSSEC flags */ | 870 | if(copy_from_user(flags_string, buffer, count)) |
| 871 | return -EFAULT; | ||
| 868 | 872 | ||
| 869 | if (rc) | 873 | if(count < 3) { |
| 870 | return rc; | 874 | /* single char or single char followed by null */ |
| 871 | if (c == '0' || c == 'n' || c == 'N') | 875 | c = flags_string[0]; |
| 872 | extended_security = CIFSSEC_DEF; /* default */ | 876 | if (c == '0' || c == 'n' || c == 'N') |
| 873 | else if (c == '1' || c == 'y' || c == 'Y') | 877 | extended_security = CIFSSEC_DEF; /* default */ |
| 874 | extended_security = CIFSSEC_MAX; | 878 | else if (c == '1' || c == 'y' || c == 'Y') |
| 879 | extended_security = CIFSSEC_MAX; | ||
| 880 | return count; | ||
| 881 | } | ||
| 882 | /* else we have a number */ | ||
| 883 | |||
| 884 | flags = simple_strtoul(flags_string, NULL, 0); | ||
| 885 | |||
| 886 | cERROR(1,("sec flags 0x%x", flags)); /* BB FIXME make cFYI */ | ||
| 887 | |||
| 888 | if(flags <= 0) { | ||
| 889 | cERROR(1,("invalid security flags %s",flags_string)); | ||
| 890 | return -EINVAL; | ||
| 891 | } | ||
| 875 | 892 | ||
| 893 | if((flags & CIFSSEC_MASK) != CIFSSEC_MASK) { | ||
| 894 | cERROR(1,("attempt to set unsupported security flags 0x%d", | ||
| 895 | flags & ~CIFSSEC_MASK)); | ||
| 896 | return -EINVAL; | ||
| 897 | } | ||
| 898 | /* flags look ok - update the global security flags for cifs module */ | ||
| 899 | extended_security = flags; | ||
| 876 | return count; | 900 | return count; |
| 877 | } | 901 | } |
| 878 | 902 | ||
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index e11d8c6bb227..3ae964bbfdc3 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
| @@ -271,9 +271,18 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) | |||
| 271 | int i; | 271 | int i; |
| 272 | char password_with_pad[CIFS_ENCPWD_SIZE]; | 272 | char password_with_pad[CIFS_ENCPWD_SIZE]; |
| 273 | 273 | ||
| 274 | if(ses->server == NULL) | ||
| 275 | return; | ||
| 276 | |||
| 274 | memset(password_with_pad, 0, CIFS_ENCPWD_SIZE); | 277 | memset(password_with_pad, 0, CIFS_ENCPWD_SIZE); |
| 275 | strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE); | 278 | strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE); |
| 276 | 279 | ||
| 280 | if((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0) | ||
| 281 | if(extended_security & CIFSSEC_MAY_PLNTXT) { | ||
| 282 | memcpy(lnm_session_key, password_with_pad, CIFS_ENCPWD_SIZE); | ||
| 283 | return; | ||
| 284 | } | ||
| 285 | |||
| 277 | /* calculate old style session key */ | 286 | /* calculate old style session key */ |
| 278 | /* calling toupper is less broken than repeatedly | 287 | /* calling toupper is less broken than repeatedly |
| 279 | calling nls_toupper would be since that will never | 288 | calling nls_toupper would be since that will never |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index b8c236be4d85..77cca3809467 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -492,6 +492,13 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
| 492 | server->secMode = pSMBr->SecurityMode; | 492 | server->secMode = pSMBr->SecurityMode; |
| 493 | if((server->secMode & SECMODE_USER) == 0) | 493 | if((server->secMode & SECMODE_USER) == 0) |
| 494 | cFYI(1,("share mode security")); | 494 | cFYI(1,("share mode security")); |
| 495 | |||
| 496 | if((server->secMode & SECMODE_PW_ENCRYPT) == 0) | ||
| 497 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | ||
| 498 | if ((extended_security & CIFSSEC_MAY_PLNTXT) == 0) | ||
| 499 | #endif /* CIFS_WEAK_PW_HASH */ | ||
| 500 | cERROR(1,("Server requests plain text password" | ||
| 501 | " but client support disabled")); | ||
| 495 | 502 | ||
| 496 | if(extended_security & CIFSSEC_MUST_NTLMV2) | 503 | if(extended_security & CIFSSEC_MUST_NTLMV2) |
| 497 | server->secType = NTLMv2; | 504 | server->secType = NTLMv2; |
