Messages in this thread | | | Date | Wed, 23 Sep 2020 23:42:09 +0800 | From | kernel test robot <> | Subject | fs/nfsd/nfs4xdr.c:4683:24: sparse: sparse: incorrect type in return expression (different base types) |
| |
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 805c6d3c19210c90c109107d189744e960eae025 commit: 23e50fe3a5e6045a573c69d4b0e3d78aa6183323 nfsd: implement the xattr functions and en/decode logic date: 2 months ago config: m68k-randconfig-s032-20200923 (attached as .config) compiler: m68k-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.2-201-g24bdaac6-dirty git checkout 23e50fe3a5e6045a573c69d4b0e3d78aa6183323 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=m68k
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
fs/nfsd/nfs4xdr.c:1860:16: sparse: sparse: incorrect type in assignment (different base types) @@ expected int status @@ got restricted __be32 @@ fs/nfsd/nfs4xdr.c:1860:16: sparse: expected int status fs/nfsd/nfs4xdr.c:1860:16: sparse: got restricted __be32 fs/nfsd/nfs4xdr.c:1862:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected restricted __be32 @@ got int status @@ fs/nfsd/nfs4xdr.c:1862:24: sparse: expected restricted __be32 fs/nfsd/nfs4xdr.c:1862:24: sparse: got int status >> fs/nfsd/nfs4xdr.c:4683:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got restricted __be32 [usertype] @@ >> fs/nfsd/nfs4xdr.c:4683:24: sparse: expected int >> fs/nfsd/nfs4xdr.c:4683:24: sparse: got restricted __be32 [usertype] fs/nfsd/nfs4xdr.c:4693:32: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got restricted __be32 [usertype] @@ fs/nfsd/nfs4xdr.c:4693:32: sparse: expected int fs/nfsd/nfs4xdr.c:4693:32: sparse: got restricted __be32 [usertype] >> fs/nfsd/nfs4xdr.c:4730:13: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be32 [usertype] err @@ got int @@ >> fs/nfsd/nfs4xdr.c:4730:13: sparse: expected restricted __be32 [usertype] err >> fs/nfsd/nfs4xdr.c:4730:13: sparse: got int >> fs/nfsd/nfs4xdr.c:4882:15: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [assigned] [usertype] count @@ got restricted __be32 [usertype] @@ >> fs/nfsd/nfs4xdr.c:4882:15: sparse: expected unsigned int [assigned] [usertype] count fs/nfsd/nfs4xdr.c:4882:15: sparse: got restricted __be32 [usertype]
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=23e50fe3a5e6045a573c69d4b0e3d78aa6183323 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout 23e50fe3a5e6045a573c69d4b0e3d78aa6183323 vim +4683 fs/nfsd/nfs4xdr.c
4669 4670 /* 4671 * Encode kmalloc-ed buffer in to XDR stream. 4672 */ 4673 static int 4674 nfsd4_vbuf_to_stream(struct xdr_stream *xdr, char *buf, u32 buflen) 4675 { 4676 u32 cplen; 4677 __be32 *p; 4678 4679 cplen = min_t(unsigned long, buflen, 4680 ((void *)xdr->end - (void *)xdr->p)); 4681 p = xdr_reserve_space(xdr, cplen); 4682 if (!p) > 4683 return nfserr_resource; 4684 4685 memcpy(p, buf, cplen); 4686 buf += cplen; 4687 buflen -= cplen; 4688 4689 while (buflen) { 4690 cplen = min_t(u32, buflen, PAGE_SIZE); 4691 p = xdr_reserve_space(xdr, cplen); 4692 if (!p) 4693 return nfserr_resource; 4694 4695 memcpy(p, buf, cplen); 4696 4697 if (cplen < PAGE_SIZE) { 4698 /* 4699 * We're done, with a length that wasn't page 4700 * aligned, so possibly not word aligned. Pad 4701 * any trailing bytes with 0. 4702 */ 4703 xdr_encode_opaque_fixed(p, NULL, cplen); 4704 break; 4705 } 4706 4707 buflen -= PAGE_SIZE; 4708 buf += PAGE_SIZE; 4709 } 4710 4711 return 0; 4712 } 4713 4714 static __be32 4715 nfsd4_encode_getxattr(struct nfsd4_compoundres *resp, __be32 nfserr, 4716 struct nfsd4_getxattr *getxattr) 4717 { 4718 struct xdr_stream *xdr = &resp->xdr; 4719 __be32 *p, err; 4720 4721 p = xdr_reserve_space(xdr, 4); 4722 if (!p) 4723 return nfserr_resource; 4724 4725 *p = cpu_to_be32(getxattr->getxa_len); 4726 4727 if (getxattr->getxa_len == 0) 4728 return 0; 4729 > 4730 err = nfsd4_vbuf_to_stream(xdr, getxattr->getxa_buf, 4731 getxattr->getxa_len); 4732 4733 kvfree(getxattr->getxa_buf); 4734 4735 return err; 4736 } 4737 4738 static __be32 4739 nfsd4_encode_setxattr(struct nfsd4_compoundres *resp, __be32 nfserr, 4740 struct nfsd4_setxattr *setxattr) 4741 { 4742 struct xdr_stream *xdr = &resp->xdr; 4743 __be32 *p; 4744 4745 p = xdr_reserve_space(xdr, 20); 4746 if (!p) 4747 return nfserr_resource; 4748 4749 encode_cinfo(p, &setxattr->setxa_cinfo); 4750 4751 return 0; 4752 } 4753 4754 /* 4755 * See if there are cookie values that can be rejected outright. 4756 */ 4757 static __be32 4758 nfsd4_listxattr_validate_cookie(struct nfsd4_listxattrs *listxattrs, 4759 u32 *offsetp) 4760 { 4761 u64 cookie = listxattrs->lsxa_cookie; 4762 4763 /* 4764 * If the cookie is larger than the maximum number we can fit 4765 * in either the buffer we just got back from vfs_listxattr, or, 4766 * XDR-encoded, in the return buffer, it's invalid. 4767 */ 4768 if (cookie > (listxattrs->lsxa_len) / (XATTR_USER_PREFIX_LEN + 2)) 4769 return nfserr_badcookie; 4770 4771 if (cookie > (listxattrs->lsxa_maxcount / 4772 (XDR_QUADLEN(XATTR_USER_PREFIX_LEN + 2) + 4))) 4773 return nfserr_badcookie; 4774 4775 *offsetp = (u32)cookie; 4776 return 0; 4777 } 4778 4779 static __be32 4780 nfsd4_encode_listxattrs(struct nfsd4_compoundres *resp, __be32 nfserr, 4781 struct nfsd4_listxattrs *listxattrs) 4782 { 4783 struct xdr_stream *xdr = &resp->xdr; 4784 u32 cookie_offset, count_offset, eof; 4785 u32 left, xdrleft, slen, count; 4786 u32 xdrlen, offset; 4787 u64 cookie; 4788 char *sp; 4789 __be32 status; 4790 __be32 *p; 4791 u32 nuser; 4792 4793 eof = 1; 4794 4795 status = nfsd4_listxattr_validate_cookie(listxattrs, &offset); 4796 if (status) 4797 goto out; 4798 4799 /* 4800 * Reserve space for the cookie and the name array count. Record 4801 * the offsets to save them later. 4802 */ 4803 cookie_offset = xdr->buf->len; 4804 count_offset = cookie_offset + 8; 4805 p = xdr_reserve_space(xdr, 12); 4806 if (!p) { 4807 status = nfserr_resource; 4808 goto out; 4809 } 4810 4811 count = 0; 4812 left = listxattrs->lsxa_len; 4813 sp = listxattrs->lsxa_buf; 4814 nuser = 0; 4815 4816 xdrleft = listxattrs->lsxa_maxcount; 4817 4818 while (left > 0 && xdrleft > 0) { 4819 slen = strlen(sp); 4820 4821 /* 4822 * Check if this a user. attribute, skip it if not. 4823 */ 4824 if (strncmp(sp, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) 4825 goto contloop; 4826 4827 slen -= XATTR_USER_PREFIX_LEN; 4828 xdrlen = 4 + ((slen + 3) & ~3); 4829 if (xdrlen > xdrleft) { 4830 if (count == 0) { 4831 /* 4832 * Can't even fit the first attribute name. 4833 */ 4834 status = nfserr_toosmall; 4835 goto out; 4836 } 4837 eof = 0; 4838 goto wreof; 4839 } 4840 4841 left -= XATTR_USER_PREFIX_LEN; 4842 sp += XATTR_USER_PREFIX_LEN; 4843 if (nuser++ < offset) 4844 goto contloop; 4845 4846 4847 p = xdr_reserve_space(xdr, xdrlen); 4848 if (!p) { 4849 status = nfserr_resource; 4850 goto out; 4851 } 4852 4853 p = xdr_encode_opaque(p, sp, slen); 4854 4855 xdrleft -= xdrlen; 4856 count++; 4857 contloop: 4858 sp += slen + 1; 4859 left -= slen + 1; 4860 } 4861 4862 /* 4863 * If there were user attributes to copy, but we didn't copy 4864 * any, the offset was too large (e.g. the cookie was invalid). 4865 */ 4866 if (nuser > 0 && count == 0) { 4867 status = nfserr_badcookie; 4868 goto out; 4869 } 4870 4871 wreof: 4872 p = xdr_reserve_space(xdr, 4); 4873 if (!p) { 4874 status = nfserr_resource; 4875 goto out; 4876 } 4877 *p = cpu_to_be32(eof); 4878 4879 cookie = offset + count; 4880 4881 write_bytes_to_xdr_buf(xdr->buf, cookie_offset, &cookie, 8); > 4882 count = htonl(count); 4883 write_bytes_to_xdr_buf(xdr->buf, count_offset, &count, 4); 4884 out: 4885 if (listxattrs->lsxa_len) 4886 kvfree(listxattrs->lsxa_buf); 4887 return status; 4888 } 4889
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org [unhandled content-type:application/gzip] | |