fs/cifs/connect.c:5117:16: warning: taking address of packed member 'smb_buf_length' of class or structure 'smb_hdr' may result in an unaligned pointer value

From: kernel test robot
Date: Sat Jul 03 2021 - 07:19:11 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 4b820e167bf6f410ace479d8df5b15a574000e75
commit: 1a0e7f7c3c573a79bcd787d8a05e80651041b815 cifs: convert to use be32_add_cpu()
date: 11 months ago
config: mips-randconfig-r006-20210703 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project cb5de7c813f976dd458bd2a7f40702ba648bf650)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install mips cross compiling tool for clang build
# apt-get install binutils-mips-linux-gnu
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1a0e7f7c3c573a79bcd787d8a05e80651041b815
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout 1a0e7f7c3c573a79bcd787d8a05e80651041b815
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=mips

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

All warnings (new ones prefixed by >>):

arch/mips/include/asm/checksum.h:195:9: error: unsupported inline asm: input with type 'unsigned long' matching output with type '__wsum' (aka 'unsigned int')
: "0" ((__force unsigned long)daddr),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from fs/cifs/connect.c:45:
In file included from include/net/ipv6.h:12:
In file included from include/linux/ipv6.h:87:
In file included from include/linux/icmpv6.h:13:
include/linux/netdevice.h:565:11: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
} while (cmpxchg(&n->state, val, new) != val);
^
arch/mips/include/asm/cmpxchg.h:194:7: note: expanded from macro 'cmpxchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/connect.c:45:
In file included from include/net/ipv6.h:12:
In file included from include/linux/ipv6.h:87:
In file included from include/linux/icmpv6.h:13:
include/linux/netdevice.h:565:11: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
arch/mips/include/asm/cmpxchg.h:204:7: note: expanded from macro 'cmpxchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/connect.c:45:
In file included from include/net/ipv6.h:12:
In file included from include/linux/ipv6.h:88:
In file included from include/linux/tcp.h:19:
In file included from include/net/sock.h:61:
include/linux/poll.h:142:27: warning: division by zero is undefined [-Wdivision-by-zero]
M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) |
^~~~~~~~~
include/linux/poll.h:140:32: note: expanded from macro 'M'
#define M(X) (__force __poll_t)__MAP(val, POLL##X, (__force __u16)EPOLL##X)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/poll.h:126:51: note: expanded from macro '__MAP'
(from < to ? (v & from) * (to/from) : (v & from) / (from/to))
^ ~~~~~~~~~
include/linux/poll.h:142:39: warning: division by zero is undefined [-Wdivision-by-zero]
M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) |
^~~~~~~~~
include/linux/poll.h:140:32: note: expanded from macro 'M'
#define M(X) (__force __poll_t)__MAP(val, POLL##X, (__force __u16)EPOLL##X)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/poll.h:126:51: note: expanded from macro '__MAP'
(from < to ? (v & from) * (to/from) : (v & from) / (from/to))
^ ~~~~~~~~~
In file included from fs/cifs/connect.c:45:
In file included from include/net/ipv6.h:12:
In file included from include/linux/ipv6.h:88:
In file included from include/linux/tcp.h:19:
include/net/sock.h:1971:12: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/connect.c:45:
In file included from include/net/ipv6.h:12:
In file included from include/linux/ipv6.h:88:
In file included from include/linux/tcp.h:19:
include/net/sock.h:2219:8: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
err = xchg(&sk->sk_err, 0);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/connect.c:49:
In file included from fs/cifs/cifsglob.h:32:
fs/cifs/smb2pdu.h:28:10: error: 'cifsacl.h' file not found with <angled> include; use "quotes" instead
#include <cifsacl.h>
^~~~~~~~~~~
"cifsacl.h"
fs/cifs/connect.c:1261:17: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
task_to_wake = xchg(&server->tsk, NULL);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
fs/cifs/connect.c:2725:9: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
task = xchg(&server->tsk, NULL);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
>> fs/cifs/connect.c:5117:16: warning: taking address of packed member 'smb_buf_length' of class or structure 'smb_hdr' may result in an unaligned pointer value [-Waddress-of-packed-member]
be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
^~~~~~~~~~~~~~~~~~~~~~~~
21 warnings and 5 errors generated.
--
In file included from include/linux/ethtool.h:18:
In file included from include/uapi/linux/ethtool.h:19:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:13:
In file included from include/linux/mm.h:32:
In file included from include/linux/pgtable.h:6:
arch/mips/include/asm/pgtable.h:210:3: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
arch/mips/include/asm/cmpxchg.h:220:2: note: expanded from macro 'cmpxchg64'
cmpxchg((ptr), (o), (n)); \
^
arch/mips/include/asm/cmpxchg.h:204:7: note: expanded from macro 'cmpxchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
In file included from include/net/sock.h:46:
In file included from include/linux/netdevice.h:37:
In file included from include/linux/ethtool.h:18:
In file included from include/uapi/linux/ethtool.h:19:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:28:
In file included from include/net/checksum.h:22:
arch/mips/include/asm/checksum.h:195:9: error: unsupported inline asm: input with type 'unsigned long' matching output with type '__wsum' (aka 'unsigned int')
: "0" ((__force unsigned long)daddr),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
In file included from include/net/sock.h:46:
include/linux/netdevice.h:565:11: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
} while (cmpxchg(&n->state, val, new) != val);
^
arch/mips/include/asm/cmpxchg.h:194:7: note: expanded from macro 'cmpxchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
In file included from include/net/sock.h:46:
include/linux/netdevice.h:565:11: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
arch/mips/include/asm/cmpxchg.h:204:7: note: expanded from macro 'cmpxchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
In file included from include/net/sock.h:61:
include/linux/poll.h:142:27: warning: division by zero is undefined [-Wdivision-by-zero]
M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) |
^~~~~~~~~
include/linux/poll.h:140:32: note: expanded from macro 'M'
#define M(X) (__force __poll_t)__MAP(val, POLL##X, (__force __u16)EPOLL##X)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/poll.h:126:51: note: expanded from macro '__MAP'
(from < to ? (v & from) * (to/from) : (v & from) / (from/to))
^ ~~~~~~~~~
include/linux/poll.h:142:39: warning: division by zero is undefined [-Wdivision-by-zero]
M(RDNORM) | M(RDBAND) | M(WRNORM) | M(WRBAND) |
^~~~~~~~~
include/linux/poll.h:140:32: note: expanded from macro 'M'
#define M(X) (__force __poll_t)__MAP(val, POLL##X, (__force __u16)EPOLL##X)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/poll.h:126:51: note: expanded from macro '__MAP'
(from < to ? (v & from) * (to/from) : (v & from) / (from/to))
^ ~~~~~~~~~
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
include/net/sock.h:1971:12: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/sess.c:24:
In file included from fs/cifs/cifspdu.h:25:
include/net/sock.h:2219:8: warning: converting the result of '<<' to a boolean always evaluates to true [-Wtautological-constant-compare]
err = xchg(&sk->sk_err, 0);
^
arch/mips/include/asm/cmpxchg.h:102:7: note: expanded from macro 'xchg'
if (!__SYNC_loongson3_war) \
^
arch/mips/include/asm/sync.h:147:34: note: expanded from macro '__SYNC_loongson3_war'
# define __SYNC_loongson3_war (1 << 31)
^
In file included from fs/cifs/sess.c:25:
In file included from fs/cifs/cifsglob.h:32:
fs/cifs/smb2pdu.h:28:10: error: 'cifsacl.h' file not found with <angled> include; use "quotes" instead
#include <cifsacl.h>
^~~~~~~~~~~
"cifsacl.h"
>> fs/cifs/sess.c:941:16: warning: taking address of packed member 'smb_buf_length' of class or structure 'smb_hdr' may result in an unaligned pointer value [-Waddress-of-packed-member]
be32_add_cpu(&smb_buf->smb_buf_length, count);
^~~~~~~~~~~~~~~~~~~~~~~
19 warnings and 5 errors generated.


vim +5117 fs/cifs/connect.c

5015
5016 /*
5017 * Issue a TREE_CONNECT request.
5018 */
5019 int
5020 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
5021 const char *tree, struct cifs_tcon *tcon,
5022 const struct nls_table *nls_codepage)
5023 {
5024 struct smb_hdr *smb_buffer;
5025 struct smb_hdr *smb_buffer_response;
5026 TCONX_REQ *pSMB;
5027 TCONX_RSP *pSMBr;
5028 unsigned char *bcc_ptr;
5029 int rc = 0;
5030 int length;
5031 __u16 bytes_left, count;
5032
5033 if (ses == NULL)
5034 return -EIO;
5035
5036 smb_buffer = cifs_buf_get();
5037 if (smb_buffer == NULL)
5038 return -ENOMEM;
5039
5040 smb_buffer_response = smb_buffer;
5041
5042 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5043 NULL /*no tid */ , 4 /*wct */ );
5044
5045 smb_buffer->Mid = get_next_mid(ses->server);
5046 smb_buffer->Uid = ses->Suid;
5047 pSMB = (TCONX_REQ *) smb_buffer;
5048 pSMBr = (TCONX_RSP *) smb_buffer_response;
5049
5050 pSMB->AndXCommand = 0xFF;
5051 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5052 bcc_ptr = &pSMB->Password[0];
5053 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5054 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5055 *bcc_ptr = 0; /* password is null byte */
5056 bcc_ptr++; /* skip password */
5057 /* already aligned so no need to do it below */
5058 } else {
5059 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5060 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5061 specified as required (when that support is added to
5062 the vfs in the future) as only NTLM or the much
5063 weaker LANMAN (which we do not send by default) is accepted
5064 by Samba (not sure whether other servers allow
5065 NTLMv2 password here) */
5066 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5067 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5068 (ses->sectype == LANMAN))
5069 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5070 ses->server->sec_mode &
5071 SECMODE_PW_ENCRYPT ? true : false,
5072 bcc_ptr);
5073 else
5074 #endif /* CIFS_WEAK_PW_HASH */
5075 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5076 bcc_ptr, nls_codepage);
5077 if (rc) {
5078 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5079 __func__, rc);
5080 cifs_buf_release(smb_buffer);
5081 return rc;
5082 }
5083
5084 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5085 if (ses->capabilities & CAP_UNICODE) {
5086 /* must align unicode strings */
5087 *bcc_ptr = 0; /* null byte password */
5088 bcc_ptr++;
5089 }
5090 }
5091
5092 if (ses->server->sign)
5093 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5094
5095 if (ses->capabilities & CAP_STATUS32) {
5096 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5097 }
5098 if (ses->capabilities & CAP_DFS) {
5099 smb_buffer->Flags2 |= SMBFLG2_DFS;
5100 }
5101 if (ses->capabilities & CAP_UNICODE) {
5102 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5103 length =
5104 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5105 6 /* max utf8 char length in bytes */ *
5106 (/* server len*/ + 256 /* share len */), nls_codepage);
5107 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5108 bcc_ptr += 2; /* skip trailing null */
5109 } else { /* ASCII */
5110 strcpy(bcc_ptr, tree);
5111 bcc_ptr += strlen(tree) + 1;
5112 }
5113 strcpy(bcc_ptr, "?????");
5114 bcc_ptr += strlen("?????");
5115 bcc_ptr += 1;
5116 count = bcc_ptr - &pSMB->Password[0];
> 5117 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
5118 pSMB->ByteCount = cpu_to_le16(count);
5119
5120 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5121 0);
5122
5123 /* above now done in SendReceive */
5124 if (rc == 0) {
5125 bool is_unicode;
5126
5127 tcon->tidStatus = CifsGood;
5128 tcon->need_reconnect = false;
5129 tcon->tid = smb_buffer_response->Tid;
5130 bcc_ptr = pByteArea(smb_buffer_response);
5131 bytes_left = get_bcc(smb_buffer_response);
5132 length = strnlen(bcc_ptr, bytes_left - 2);
5133 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5134 is_unicode = true;
5135 else
5136 is_unicode = false;
5137
5138
5139 /* skip service field (NB: this field is always ASCII) */
5140 if (length == 3) {
5141 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5142 (bcc_ptr[2] == 'C')) {
5143 cifs_dbg(FYI, "IPC connection\n");
5144 tcon->ipc = true;
5145 tcon->pipe = true;
5146 }
5147 } else if (length == 2) {
5148 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5149 /* the most common case */
5150 cifs_dbg(FYI, "disk share connection\n");
5151 }
5152 }
5153 bcc_ptr += length + 1;
5154 bytes_left -= (length + 1);
5155 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5156
5157 /* mostly informational -- no need to fail on error here */
5158 kfree(tcon->nativeFileSystem);
5159 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5160 bytes_left, is_unicode,
5161 nls_codepage);
5162
5163 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5164
5165 if ((smb_buffer_response->WordCount == 3) ||
5166 (smb_buffer_response->WordCount == 7))
5167 /* field is in same location */
5168 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5169 else
5170 tcon->Flags = 0;
5171 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5172 }
5173
5174 cifs_buf_release(smb_buffer);
5175 return rc;
5176 }
5177

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

Attachment: .config.gz
Description: application/gzip