diff options
| -rw-r--r-- | fs/cifs/cifs_spnego.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index ad54a3a6e434..d79eee41e9c5 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
| @@ -66,6 +66,11 @@ struct key_type cifs_spnego_key_type = { | |||
| 66 | .describe = user_describe, | 66 | .describe = user_describe, |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | #define MAX_VER_STR_LEN 9 /* length of longest version string e.g. | ||
| 70 | strlen(";ver=0xFF) */ | ||
| 71 | #define MAX_MECH_STR_LEN 13 /* length of longest security mechanism name, eg | ||
| 72 | in future could have strlen(";sec=ntlmsspi") */ | ||
| 73 | #define MAX_IPV6_ADDR_LEN 42 /* eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/60 */ | ||
| 69 | /* get a key struct with a SPNEGO security blob, suitable for session setup */ | 74 | /* get a key struct with a SPNEGO security blob, suitable for session setup */ |
| 70 | struct key * | 75 | struct key * |
| 71 | cifs_get_spnego_key(struct cifsSesInfo *sesInfo, const char *hostname) | 76 | cifs_get_spnego_key(struct cifsSesInfo *sesInfo, const char *hostname) |
| @@ -75,11 +80,11 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo, const char *hostname) | |||
| 75 | size_t desc_len; | 80 | size_t desc_len; |
| 76 | struct key *spnego_key; | 81 | struct key *spnego_key; |
| 77 | 82 | ||
| 78 | 83 | /* BB: come up with better scheme for determining length */ | |
| 79 | /* version + ;ip{4|6}= + address + ;host=hostname + | 84 | /* length of fields (with semicolons): ver=0xyz ipv4= ipaddress host= |
| 80 | ;sec= + ;uid= + NULL */ | 85 | hostname sec=mechanism uid=0x uid */ |
| 81 | desc_len = 4 + 5 + 32 + 1 + 5 + strlen(hostname) + | 86 | desc_len = MAX_VER_STR_LEN + 5 + MAX_IPV6_ADDR_LEN + 1 + 6 + |
| 82 | strlen(";sec=krb5") + 7 + sizeof(uid_t)*2 + 1; | 87 | strlen(hostname) + MAX_MECH_STR_LEN + 8 + (sizeof(uid_t) * 2); |
| 83 | spnego_key = ERR_PTR(-ENOMEM); | 88 | spnego_key = ERR_PTR(-ENOMEM); |
| 84 | description = kzalloc(desc_len, GFP_KERNEL); | 89 | description = kzalloc(desc_len, GFP_KERNEL); |
| 85 | if (description == NULL) | 90 | if (description == NULL) |
| @@ -88,7 +93,7 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo, const char *hostname) | |||
| 88 | dp = description; | 93 | dp = description; |
| 89 | /* start with version and hostname portion of UNC string */ | 94 | /* start with version and hostname portion of UNC string */ |
| 90 | spnego_key = ERR_PTR(-EINVAL); | 95 | spnego_key = ERR_PTR(-EINVAL); |
| 91 | sprintf(dp, "0x%2.2x;host=%s;", CIFS_SPNEGO_UPCALL_VERSION, | 96 | sprintf(dp, "ver=0x%x;host=%s;", CIFS_SPNEGO_UPCALL_VERSION, |
| 92 | hostname); | 97 | hostname); |
| 93 | dp = description + strlen(description); | 98 | dp = description + strlen(description); |
| 94 | 99 | ||
