@@ -44,14 +44,18 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum,
44
44
unsigned char * cksum , unsigned char * buf )
45
45
{
46
46
struct crypto_sync_skcipher * cipher ;
47
- unsigned char plain [ 8 ] ;
47
+ unsigned char * plain ;
48
48
s32 code ;
49
49
50
50
dprintk ("RPC: %s:\n" , __func__ );
51
51
cipher = crypto_alloc_sync_skcipher (kctx -> gk5e -> encrypt_name , 0 , 0 );
52
52
if (IS_ERR (cipher ))
53
53
return PTR_ERR (cipher );
54
54
55
+ plain = kmalloc (8 , GFP_NOFS );
56
+ if (!plain )
57
+ return - ENOMEM ;
58
+
55
59
plain [0 ] = (unsigned char ) ((seqnum >> 24 ) & 0xff );
56
60
plain [1 ] = (unsigned char ) ((seqnum >> 16 ) & 0xff );
57
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
72
code = krb5_encrypt (cipher , cksum , plain , buf , 8 );
69
73
out :
74
+ kfree (plain );
70
75
crypto_free_sync_skcipher (cipher );
71
76
return code ;
72
77
}
@@ -77,12 +82,17 @@ krb5_make_seq_num(struct krb5_ctx *kctx,
77
82
u32 seqnum ,
78
83
unsigned char * cksum , unsigned char * buf )
79
84
{
80
- unsigned char plain [8 ];
85
+ unsigned char * plain ;
86
+ s32 code ;
81
87
82
88
if (kctx -> enctype == ENCTYPE_ARCFOUR_HMAC )
83
89
return krb5_make_rc4_seq_num (kctx , direction , seqnum ,
84
90
cksum , buf );
85
91
92
+ plain = kmalloc (8 , GFP_NOFS );
93
+ if (!plain )
94
+ return - ENOMEM ;
95
+
86
96
plain [0 ] = (unsigned char ) (seqnum & 0xff );
87
97
plain [1 ] = (unsigned char ) ((seqnum >> 8 ) & 0xff );
88
98
plain [2 ] = (unsigned char ) ((seqnum >> 16 ) & 0xff );
@@ -93,15 +103,17 @@ krb5_make_seq_num(struct krb5_ctx *kctx,
93
103
plain [6 ] = direction ;
94
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
111
static s32
100
112
krb5_get_rc4_seq_num (struct krb5_ctx * kctx , unsigned char * cksum ,
101
113
unsigned char * buf , int * direction , s32 * seqnum )
102
114
{
103
115
struct crypto_sync_skcipher * cipher ;
104
- unsigned char plain [ 8 ] ;
116
+ unsigned char * plain ;
105
117
s32 code ;
106
118
107
119
dprintk ("RPC: %s:\n" , __func__ );
@@ -113,20 +125,28 @@ krb5_get_rc4_seq_num(struct krb5_ctx *kctx, unsigned char *cksum,
113
125
if (code )
114
126
goto out ;
115
127
128
+ plain = kmalloc (8 , GFP_NOFS );
129
+ if (!plain ) {
130
+ code = - ENOMEM ;
131
+ goto out ;
132
+ }
133
+
116
134
code = krb5_decrypt (cipher , cksum , buf , plain , 8 );
117
135
if (code )
118
- goto out ;
136
+ goto out_plain ;
119
137
120
138
if ((plain [4 ] != plain [5 ]) || (plain [4 ] != plain [6 ])
121
139
|| (plain [4 ] != plain [7 ])) {
122
140
code = (s32 )KG_BAD_SEQ ;
123
- goto out ;
141
+ goto out_plain ;
124
142
}
125
143
126
144
* direction = plain [4 ];
127
145
128
146
* seqnum = ((plain [0 ] << 24 ) | (plain [1 ] << 16 ) |
129
147
(plain [2 ] << 8 ) | (plain [3 ]));
148
+ out_plain :
149
+ kfree (plain );
130
150
out :
131
151
crypto_free_sync_skcipher (cipher );
132
152
return code ;
@@ -139,26 +159,33 @@ krb5_get_seq_num(struct krb5_ctx *kctx,
139
159
int * direction , u32 * seqnum )
140
160
{
141
161
s32 code ;
142
- unsigned char plain [ 8 ] ;
162
+ unsigned char * plain ;
143
163
struct crypto_sync_skcipher * key = kctx -> seq ;
144
164
145
165
dprintk ("RPC: krb5_get_seq_num:\n" );
146
166
147
167
if (kctx -> enctype == ENCTYPE_ARCFOUR_HMAC )
148
168
return krb5_get_rc4_seq_num (kctx , cksum , buf ,
149
169
direction , seqnum );
170
+ plain = kmalloc (8 , GFP_NOFS );
171
+ if (!plain )
172
+ return - ENOMEM ;
150
173
151
174
if ((code = krb5_decrypt (key , cksum , buf , plain , 8 )))
152
- return code ;
175
+ goto out ;
153
176
154
177
if ((plain [4 ] != plain [5 ]) || (plain [4 ] != plain [6 ]) ||
155
- (plain [4 ] != plain [7 ]))
156
- return (s32 )KG_BAD_SEQ ;
178
+ (plain [4 ] != plain [7 ])) {
179
+ code = (s32 )KG_BAD_SEQ ;
180
+ goto out ;
181
+ }
157
182
158
183
* direction = plain [4 ];
159
184
160
185
* seqnum = ((plain [0 ]) |
161
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
}
0 commit comments