Re: [PATCH 2/2] crypto: algif_hash - Require setkey before accept(2)

From: kbuild test robot
Date: Fri Jan 08 2016 - 08:55:56 EST


Hi Herbert,

[auto build test ERROR on crypto/master]
[also build test ERROR on v4.4-rc8 next-20160108]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url: https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-hash-Add-crypto_ahash_has_setkey/20160108-213436
base: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git master
config: x86_64-randconfig-i0-201601 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All error/warnings (new ones prefixed by >>):

crypto/algif_hash.c: In function 'hash_check_key':
>> crypto/algif_hash.c:252:9: error: 'struct alg_sock' has no member named 'refcnt'
if (ask->refcnt)
^
crypto/algif_hash.c:264:11: error: 'struct alg_sock' has no member named 'refcnt'
if (!pask->refcnt++)
^
crypto/algif_hash.c:267:5: error: 'struct alg_sock' has no member named 'refcnt'
ask->refcnt = 1;
^
crypto/algif_hash.c: In function 'hash_release_parent_nokey':
crypto/algif_hash.c:407:10: error: 'struct alg_sock' has no member named 'refcnt'
if (!ask->refcnt) {
^
crypto/algif_hash.c: At top level:
>> crypto/algif_hash.c:486:2: error: unknown field 'accept_nokey' specified in initializer
.accept_nokey = hash_accept_parent_nokey,
^
>> crypto/algif_hash.c:486:18: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
.accept_nokey = hash_accept_parent_nokey,
^
crypto/algif_hash.c:486:18: note: (near initialization for 'algif_type_hash.setauthsize')
>> crypto/algif_hash.c:488:2: error: unknown field 'ops_nokey' specified in initializer
.ops_nokey = &algif_hash_ops_nokey,
^
crypto/algif_hash.c:488:15: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
.ops_nokey = &algif_hash_ops_nokey,
^
crypto/algif_hash.c:488:15: note: (near initialization for 'algif_type_hash.owner')

vim +252 crypto/algif_hash.c

246 struct sock *psk;
247 struct alg_sock *pask;
248 struct algif_hash_tfm *tfm;
249 struct sock *sk = sock->sk;
250 struct alg_sock *ask = alg_sk(sk);
251
> 252 if (ask->refcnt)
253 return 0;
254
255 psk = ask->parent;
256 pask = alg_sk(ask->parent);
257 tfm = pask->private;
258
259 err = -ENOKEY;
260 lock_sock(psk);
261 if (!tfm->has_key)
262 goto unlock;
263
264 if (!pask->refcnt++)
265 sock_hold(psk);
266
> 267 ask->refcnt = 1;
268 sock_put(psk);
269
270 err = 0;
271
272 unlock:
273 release_sock(psk);
274
275 return err;
276 }
277
278 static int hash_sendmsg_nokey(struct socket *sock, struct msghdr *msg,
279 size_t size)
280 {
281 int err;
282
283 err = hash_check_key(sock);
284 if (err)
285 return err;
286
287 return hash_sendmsg(sock, msg, size);
288 }
289
290 static ssize_t hash_sendpage_nokey(struct socket *sock, struct page *page,
291 int offset, size_t size, int flags)
292 {
293 int err;
294
295 err = hash_check_key(sock);
296 if (err)
297 return err;
298
299 return hash_sendpage(sock, page, offset, size, flags);
300 }
301
302 static int hash_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
303 size_t ignored, int flags)
304 {
305 int err;
306
307 err = hash_check_key(sock);
308 if (err)
309 return err;
310
311 return hash_recvmsg(sock, msg, ignored, flags);
312 }
313
314 static int hash_accept_nokey(struct socket *sock, struct socket *newsock,
315 int flags)
316 {
317 int err;
318
319 err = hash_check_key(sock);
320 if (err)
321 return err;
322
323 return hash_accept(sock, newsock, flags);
324 }
325
326 static struct proto_ops algif_hash_ops_nokey = {
327 .family = PF_ALG,
328
329 .connect = sock_no_connect,
330 .socketpair = sock_no_socketpair,
331 .getname = sock_no_getname,
332 .ioctl = sock_no_ioctl,
333 .listen = sock_no_listen,
334 .shutdown = sock_no_shutdown,
335 .getsockopt = sock_no_getsockopt,
336 .mmap = sock_no_mmap,
337 .bind = sock_no_bind,
338 .setsockopt = sock_no_setsockopt,
339 .poll = sock_no_poll,
340
341 .release = af_alg_release,
342 .sendmsg = hash_sendmsg_nokey,
343 .sendpage = hash_sendpage_nokey,
344 .recvmsg = hash_recvmsg_nokey,
345 .accept = hash_accept_nokey,
346 };
347
348 static void *hash_bind(const char *name, u32 type, u32 mask)
349 {
350 struct algif_hash_tfm *tfm;
351 struct crypto_ahash *hash;
352
353 tfm = kzalloc(sizeof(*tfm), GFP_KERNEL);
354 if (!tfm)
355 return ERR_PTR(-ENOMEM);
356
357 hash = crypto_alloc_ahash(name, type, mask);
358 if (IS_ERR(hash)) {
359 kfree(tfm);
360 return ERR_CAST(hash);
361 }
362
363 tfm->hash = hash;
364
365 return tfm;
366 }
367
368 static void hash_release(void *private)
369 {
370 struct algif_hash_tfm *tfm = private;
371
372 crypto_free_ahash(tfm->hash);
373 kfree(tfm);
374 }
375
376 static int hash_setkey(void *private, const u8 *key, unsigned int keylen)
377 {
378 struct algif_hash_tfm *tfm = private;
379 int err;
380
381 err = crypto_ahash_setkey(tfm->hash, key, keylen);
382 tfm->has_key = !err;
383
384 return err;
385 }
386
387 static void hash_sock_destruct_common(struct sock *sk)
388 {
389 struct alg_sock *ask = alg_sk(sk);
390 struct hash_ctx *ctx = ask->private;
391
392 sock_kzfree_s(sk, ctx->result,
393 crypto_ahash_digestsize(crypto_ahash_reqtfm(&ctx->req)));
394 sock_kfree_s(sk, ctx, ctx->len);
395 }
396
397 static void hash_sock_destruct(struct sock *sk)
398 {
399 hash_sock_destruct_common(sk);
400 af_alg_release_parent(sk);
401 }
402
403 static void hash_release_parent_nokey(struct sock *sk)
404 {
405 struct alg_sock *ask = alg_sk(sk);
406
> 407 if (!ask->refcnt) {
408 sock_put(ask->parent);
409 return;
410 }

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

Attachment: .config.gz
Description: Binary data