Re: [PATCH 1/2] net: tls: add compat for get/setsockopt

From: kernel test robot
Date: Wed Aug 05 2020 - 22:28:28 EST


Hi Rouven,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.8]
[cannot apply to next-20200805]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Rouven-Czerwinski/net-tls-add-compat-for-get-setsockopt/20200806-040123
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ecfd7940b8641da6e41ca94eba36876dc2ba827b
config: i386-randconfig-s002-20200805 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.2-117-g8c7aee71-dirty
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

net/tls/tls_main.c: In function 'tls_compat_getsockopt':
>> net/tls/tls_main.c:459:23: error: 'struct proto' has no member named 'compat_getsockopt'
459 | return ctx->sk_proto->compat_getsockopt(sk, level, optname,
| ^~
net/tls/tls_main.c: In function 'tls_compat_setsockopt':
>> net/tls/tls_main.c:632:23: error: 'struct proto' has no member named 'compat_setsockopt'
632 | return ctx->sk_proto->compat_setsockopt(sk, level, optname,
| ^~
At top level:
net/tls/tls_main.c:626:12: warning: 'tls_compat_setsockopt' defined but not used [-Wunused-function]
626 | static int tls_compat_setsockopt(struct sock *sk, int level, int optname,
| ^~~~~~~~~~~~~~~~~~~~~
net/tls/tls_main.c:453:12: warning: 'tls_compat_getsockopt' defined but not used [-Wunused-function]
453 | static int tls_compat_getsockopt(struct sock *sk, int level, int optname,
| ^~~~~~~~~~~~~~~~~~~~~

vim +459 net/tls/tls_main.c

452
453 static int tls_compat_getsockopt(struct sock *sk, int level, int optname,
454 char __user *optval, int __user *optlen)
455 {
456 struct tls_context *ctx = tls_get_ctx(sk);
457
458 if (level != SOL_TLS)
> 459 return ctx->sk_proto->compat_getsockopt(sk, level, optname,
460 optval, optlen);
461
462 return do_tls_getsockopt(sk, optname, optval, optlen);
463 }
464
465 static int do_tls_setsockopt_conf(struct sock *sk, char __user *optval,
466 unsigned int optlen, int tx)
467 {
468 struct tls_crypto_info *crypto_info;
469 struct tls_crypto_info *alt_crypto_info;
470 struct tls_context *ctx = tls_get_ctx(sk);
471 size_t optsize;
472 int rc = 0;
473 int conf;
474
475 if (!optval || (optlen < sizeof(*crypto_info))) {
476 rc = -EINVAL;
477 goto out;
478 }
479
480 if (tx) {
481 crypto_info = &ctx->crypto_send.info;
482 alt_crypto_info = &ctx->crypto_recv.info;
483 } else {
484 crypto_info = &ctx->crypto_recv.info;
485 alt_crypto_info = &ctx->crypto_send.info;
486 }
487
488 /* Currently we don't support set crypto info more than one time */
489 if (TLS_CRYPTO_INFO_READY(crypto_info)) {
490 rc = -EBUSY;
491 goto out;
492 }
493
494 rc = copy_from_user(crypto_info, optval, sizeof(*crypto_info));
495 if (rc) {
496 rc = -EFAULT;
497 goto err_crypto_info;
498 }
499
500 /* check version */
501 if (crypto_info->version != TLS_1_2_VERSION &&
502 crypto_info->version != TLS_1_3_VERSION) {
503 rc = -EINVAL;
504 goto err_crypto_info;
505 }
506
507 /* Ensure that TLS version and ciphers are same in both directions */
508 if (TLS_CRYPTO_INFO_READY(alt_crypto_info)) {
509 if (alt_crypto_info->version != crypto_info->version ||
510 alt_crypto_info->cipher_type != crypto_info->cipher_type) {
511 rc = -EINVAL;
512 goto err_crypto_info;
513 }
514 }
515
516 switch (crypto_info->cipher_type) {
517 case TLS_CIPHER_AES_GCM_128:
518 optsize = sizeof(struct tls12_crypto_info_aes_gcm_128);
519 break;
520 case TLS_CIPHER_AES_GCM_256: {
521 optsize = sizeof(struct tls12_crypto_info_aes_gcm_256);
522 break;
523 }
524 case TLS_CIPHER_AES_CCM_128:
525 optsize = sizeof(struct tls12_crypto_info_aes_ccm_128);
526 break;
527 default:
528 rc = -EINVAL;
529 goto err_crypto_info;
530 }
531
532 if (optlen != optsize) {
533 rc = -EINVAL;
534 goto err_crypto_info;
535 }
536
537 rc = copy_from_user(crypto_info + 1, optval + sizeof(*crypto_info),
538 optlen - sizeof(*crypto_info));
539 if (rc) {
540 rc = -EFAULT;
541 goto err_crypto_info;
542 }
543
544 if (tx) {
545 rc = tls_set_device_offload(sk, ctx);
546 conf = TLS_HW;
547 if (!rc) {
548 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSTXDEVICE);
549 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXDEVICE);
550 } else {
551 rc = tls_set_sw_offload(sk, ctx, 1);
552 if (rc)
553 goto err_crypto_info;
554 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSTXSW);
555 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRTXSW);
556 conf = TLS_SW;
557 }
558 } else {
559 rc = tls_set_device_offload_rx(sk, ctx);
560 conf = TLS_HW;
561 if (!rc) {
562 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSRXDEVICE);
563 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXDEVICE);
564 } else {
565 rc = tls_set_sw_offload(sk, ctx, 0);
566 if (rc)
567 goto err_crypto_info;
568 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSRXSW);
569 TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSCURRRXSW);
570 conf = TLS_SW;
571 }
572 tls_sw_strparser_arm(sk, ctx);
573 }
574
575 if (tx)
576 ctx->tx_conf = conf;
577 else
578 ctx->rx_conf = conf;
579 update_sk_prot(sk, ctx);
580 if (tx) {
581 ctx->sk_write_space = sk->sk_write_space;
582 sk->sk_write_space = tls_write_space;
583 } else {
584 sk->sk_socket->ops = &tls_sw_proto_ops;
585 }
586 goto out;
587
588 err_crypto_info:
589 memzero_explicit(crypto_info, sizeof(union tls_crypto_context));
590 out:
591 return rc;
592 }
593
594 static int do_tls_setsockopt(struct sock *sk, int optname,
595 char __user *optval, unsigned int optlen)
596 {
597 int rc = 0;
598
599 switch (optname) {
600 case TLS_TX:
601 case TLS_RX:
602 lock_sock(sk);
603 rc = do_tls_setsockopt_conf(sk, optval, optlen,
604 optname == TLS_TX);
605 release_sock(sk);
606 break;
607 default:
608 rc = -ENOPROTOOPT;
609 break;
610 }
611 return rc;
612 }
613
614 static int tls_setsockopt(struct sock *sk, int level, int optname,
615 char __user *optval, unsigned int optlen)
616 {
617 struct tls_context *ctx = tls_get_ctx(sk);
618
619 if (level != SOL_TLS)
620 return ctx->sk_proto->setsockopt(sk, level, optname, optval,
621 optlen);
622
623 return do_tls_setsockopt(sk, optname, optval, optlen);
624 }
625
626 static int tls_compat_setsockopt(struct sock *sk, int level, int optname,
627 char __user *optval, unsigned int optlen)
628 {
629 struct tls_context *ctx = tls_get_ctx(sk);
630
631 if (level != SOL_TLS)
> 632 return ctx->sk_proto->compat_setsockopt(sk, level, optname,
633 optval, optlen);
634
635 return do_tls_setsockopt(sk, optname, optval, optlen);
636 }
637

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip