diff options
author | David S. Miller <davem@davemloft.net> | 2019-02-20 03:34:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-20 03:34:07 -0500 |
commit | 375ca548f7e3ac82acdd0959eddd1fa0e17c35cc (patch) | |
tree | 5360dc427e4eff7123613419ee522b7fda831de0 /net/sunrpc/auth_gss/gss_krb5_seqnum.c | |
parent | 58066ac9d7f5dcde4ef08c03b7e127f0522d9ea0 (diff) | |
parent | 40e196a906d969fd10d885c692d2674b3d657006 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Two easily resolvable overlapping change conflicts, one in
TCP and one in the eBPF verifier.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sunrpc/auth_gss/gss_krb5_seqnum.c')
-rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_seqnum.c | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/net/sunrpc/auth_gss/gss_krb5_seqnum.c b/net/sunrpc/auth_gss/gss_krb5_seqnum.c index fb6656295204..507105127095 100644 --- a/net/sunrpc/auth_gss/gss_krb5_seqnum.c +++ b/net/sunrpc/auth_gss/gss_krb5_seqnum.c | |||
@@ -44,7 +44,7 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | |||
44 | unsigned char *cksum, unsigned char *buf) | 44 | unsigned char *cksum, unsigned char *buf) |
45 | { | 45 | { |
46 | struct crypto_sync_skcipher *cipher; | 46 | struct crypto_sync_skcipher *cipher; |
47 | unsigned char plain[8]; | 47 | unsigned char *plain; |
48 | s32 code; | 48 | s32 code; |
49 | 49 | ||
50 | dprintk("RPC: %s:\n", __func__); | 50 | dprintk("RPC: %s:\n", __func__); |
@@ -52,6 +52,10 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | |||
52 | if (IS_ERR(cipher)) | 52 | if (IS_ERR(cipher)) |
53 | return PTR_ERR(cipher); | 53 | return PTR_ERR(cipher); |
54 | 54 | ||
55 | plain = kmalloc(8, GFP_NOFS); | ||
56 | if (!plain) | ||
57 | return -ENOMEM; | ||
58 | |||
55 | plain[0] = (unsigned char) ((seqnum >> 24) & 0xff); | 59 | plain[0] = (unsigned char) ((seqnum >> 24) & 0xff); |
56 | plain[1] = (unsigned char) ((seqnum >> 16) & 0xff); | 60 | plain[1] = (unsigned char) ((seqnum >> 16) & 0xff); |
57 | plain[2] = (unsigned char) ((seqnum >> 8) & 0xff); | 61 | plain[2] = (unsigned char) ((seqnum >> 8) & 0xff); |
@@ -67,6 +71,7 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | |||
67 | 71 | ||
68 | code = krb5_encrypt(cipher, cksum, plain, buf, 8); | 72 | code = krb5_encrypt(cipher, cksum, plain, buf, 8); |
69 | out: | 73 | out: |
74 | kfree(plain); | ||
70 | crypto_free_sync_skcipher(cipher); | 75 | crypto_free_sync_skcipher(cipher); |
71 | return code; | 76 | return code; |
72 | } | 77 | } |
@@ -77,12 +82,17 @@ krb5_make_seq_num(struct krb5_ctx *kctx, | |||
77 | u32 seqnum, | 82 | u32 seqnum, |
78 | unsigned char *cksum, unsigned char *buf) | 83 | unsigned char *cksum, unsigned char *buf) |
79 | { | 84 | { |
80 | unsigned char plain[8]; | 85 | unsigned char *plain; |
86 | s32 code; | ||
81 | 87 | ||
82 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) | 88 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) |
83 | return krb5_make_rc4_seq_num(kctx, direction, seqnum, | 89 | return krb5_make_rc4_seq_num(kctx, direction, seqnum, |
84 | cksum, buf); | 90 | cksum, buf); |
85 | 91 | ||
92 | plain = kmalloc(8, GFP_NOFS); | ||
93 | if (!plain) | ||
94 | return -ENOMEM; | ||
95 | |||
86 | plain[0] = (unsigned char) (seqnum & 0xff); | 96 | plain[0] = (unsigned char) (seqnum & 0xff); |
87 | plain[1] = (unsigned char) ((seqnum >> 8) & 0xff); | 97 | plain[1] = (unsigned char) ((seqnum >> 8) & 0xff); |
88 | plain[2] = (unsigned char) ((seqnum >> 16) & 0xff); | 98 | plain[2] = (unsigned char) ((seqnum >> 16) & 0xff); |
@@ -93,7 +103,9 @@ krb5_make_seq_num(struct krb5_ctx *kctx, | |||
93 | plain[6] = direction; | 103 | plain[6] = direction; |
94 | plain[7] = direction; | 104 | plain[7] = direction; |
95 | 105 | ||
96 | return krb5_encrypt(key, cksum, plain, buf, 8); | 106 | code = krb5_encrypt(key, cksum, plain, buf, 8); |
107 | kfree(plain); | ||
108 | return code; | ||
97 | } | 109 | } |
98 | 110 | ||
99 | static s32 | 111 | static s32 |
@@ -101,7 +113,7 @@ krb5_get_rc4_seq_num(struct krb5_ctx *kctx, unsigned char *cksum, | |||
101 | unsigned char *buf, int *direction, s32 *seqnum) | 113 | unsigned char *buf, int *direction, s32 *seqnum) |
102 | { | 114 | { |
103 | struct crypto_sync_skcipher *cipher; | 115 | struct crypto_sync_skcipher *cipher; |
104 | unsigned char plain[8]; | 116 | unsigned char *plain; |
105 | s32 code; | 117 | s32 code; |
106 | 118 | ||
107 | dprintk("RPC: %s:\n", __func__); | 119 | dprintk("RPC: %s:\n", __func__); |
@@ -113,20 +125,28 @@ krb5_get_rc4_seq_num(struct krb5_ctx *kctx, unsigned char *cksum, | |||
113 | if (code) | 125 | if (code) |
114 | goto out; | 126 | goto out; |
115 | 127 | ||
128 | plain = kmalloc(8, GFP_NOFS); | ||
129 | if (!plain) { | ||
130 | code = -ENOMEM; | ||
131 | goto out; | ||
132 | } | ||
133 | |||
116 | code = krb5_decrypt(cipher, cksum, buf, plain, 8); | 134 | code = krb5_decrypt(cipher, cksum, buf, plain, 8); |
117 | if (code) | 135 | if (code) |
118 | goto out; | 136 | goto out_plain; |
119 | 137 | ||
120 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) | 138 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) |
121 | || (plain[4] != plain[7])) { | 139 | || (plain[4] != plain[7])) { |
122 | code = (s32)KG_BAD_SEQ; | 140 | code = (s32)KG_BAD_SEQ; |
123 | goto out; | 141 | goto out_plain; |
124 | } | 142 | } |
125 | 143 | ||
126 | *direction = plain[4]; | 144 | *direction = plain[4]; |
127 | 145 | ||
128 | *seqnum = ((plain[0] << 24) | (plain[1] << 16) | | 146 | *seqnum = ((plain[0] << 24) | (plain[1] << 16) | |
129 | (plain[2] << 8) | (plain[3])); | 147 | (plain[2] << 8) | (plain[3])); |
148 | out_plain: | ||
149 | kfree(plain); | ||
130 | out: | 150 | out: |
131 | crypto_free_sync_skcipher(cipher); | 151 | crypto_free_sync_skcipher(cipher); |
132 | return code; | 152 | return code; |
@@ -139,7 +159,7 @@ krb5_get_seq_num(struct krb5_ctx *kctx, | |||
139 | int *direction, u32 *seqnum) | 159 | int *direction, u32 *seqnum) |
140 | { | 160 | { |
141 | s32 code; | 161 | s32 code; |
142 | unsigned char plain[8]; | 162 | unsigned char *plain; |
143 | struct crypto_sync_skcipher *key = kctx->seq; | 163 | struct crypto_sync_skcipher *key = kctx->seq; |
144 | 164 | ||
145 | dprintk("RPC: krb5_get_seq_num:\n"); | 165 | dprintk("RPC: krb5_get_seq_num:\n"); |
@@ -147,18 +167,25 @@ krb5_get_seq_num(struct krb5_ctx *kctx, | |||
147 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) | 167 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) |
148 | return krb5_get_rc4_seq_num(kctx, cksum, buf, | 168 | return krb5_get_rc4_seq_num(kctx, cksum, buf, |
149 | direction, seqnum); | 169 | direction, seqnum); |
170 | plain = kmalloc(8, GFP_NOFS); | ||
171 | if (!plain) | ||
172 | return -ENOMEM; | ||
150 | 173 | ||
151 | if ((code = krb5_decrypt(key, cksum, buf, plain, 8))) | 174 | if ((code = krb5_decrypt(key, cksum, buf, plain, 8))) |
152 | return code; | 175 | goto out; |
153 | 176 | ||
154 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) || | 177 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) || |
155 | (plain[4] != plain[7])) | 178 | (plain[4] != plain[7])) { |
156 | return (s32)KG_BAD_SEQ; | 179 | code = (s32)KG_BAD_SEQ; |
180 | goto out; | ||
181 | } | ||
157 | 182 | ||
158 | *direction = plain[4]; | 183 | *direction = plain[4]; |
159 | 184 | ||
160 | *seqnum = ((plain[0]) | | 185 | *seqnum = ((plain[0]) | |
161 | (plain[1] << 8) | (plain[2] << 16) | (plain[3] << 24)); | 186 | (plain[1] << 8) | (plain[2] << 16) | (plain[3] << 24)); |
162 | 187 | ||
163 | return 0; | 188 | out: |
189 | kfree(plain); | ||
190 | return code; | ||
164 | } | 191 | } |