Re: [PATCH v2 1/6] xfrm/compat: Add 64=>32-bit messages translator

From: kernel test robot
Date: Wed Aug 26 2020 - 00:03:48 EST


Hi Dmitry,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on ipsec/master]
[also build test ERROR on kselftest/next linus/master v5.9-rc2 next-20200825]
[cannot apply to ipsec-next/master]
[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/Dmitry-Safonov/xfrm-Add-compat-layer/20200826-095240
base: https://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git master
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# save the attached .config to linux build tree
make W=1 ARCH=x86_64

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/xfrm/xfrm_compat.c: In function 'xfrm_nlmsg_put_compat':
>> net/xfrm/xfrm_compat.c:103:16: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'?
103 | int src_len = xfrm_msg_min[type];
| ^~~~~~~~~~~~
| xfrm_alg_len
net/xfrm/xfrm_compat.c:103:16: note: each undeclared identifier is reported only once for each function it appears in
net/xfrm/xfrm_compat.c: In function 'xfrm_xlate64':
net/xfrm/xfrm_compat.c:260:34: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'?
260 | attrs = nlmsg_attrdata(nlh_src, xfrm_msg_min[type]);
| ^~~~~~~~~~~~
| xfrm_alg_len
net/xfrm/xfrm_compat.c: At top level:
>> net/xfrm/xfrm_compat.c:275:5: error: redefinition of 'xfrm_alloc_compat'
275 | int xfrm_alloc_compat(struct sk_buff *skb)
| ^~~~~~~~~~~~~~~~~
In file included from net/xfrm/xfrm_compat.c:9:
include/net/xfrm.h:2007:19: note: previous definition of 'xfrm_alloc_compat' was here
2007 | static inline int xfrm_alloc_compat(struct sk_buff *skb)
| ^~~~~~~~~~~~~~~~~
In file included from arch/x86/include/asm/bug.h:93,
from include/linux/bug.h:5,
from include/linux/thread_info.h:12,
from arch/x86/include/asm/preempt.h:7,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:51,
from include/linux/seqlock.h:15,
from include/linux/time.h:6,
from include/linux/compat.h:10,
from net/xfrm/xfrm_compat.c:7:
net/xfrm/xfrm_compat.c: In function 'xfrm_alloc_compat':
net/xfrm/xfrm_compat.c:282:38: error: 'xfrm_msg_min' undeclared (first use in this function); did you mean 'xfrm_alg_len'?
282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min)))
| ^~~~~~~~~~~~
include/asm-generic/bug.h:102:25: note: in definition of macro 'WARN_ON_ONCE'
102 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
net/xfrm/xfrm_compat.c:282:27: note: in expansion of macro 'ARRAY_SIZE'
282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min)))
| ^~~~~~~~~~
>> include/linux/build_bug.h:16:51: error: bit-field '<anonymous>' width not an integer constant
16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
| ^
include/asm-generic/bug.h:102:25: note: in definition of macro 'WARN_ON_ONCE'
102 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
include/linux/compiler.h:224:28: note: in expansion of macro 'BUILD_BUG_ON_ZERO'
224 | #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
| ^~~~~~~~~~~~~~~~~
include/linux/kernel.h:47:59: note: in expansion of macro '__must_be_array'
47 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
| ^~~~~~~~~~~~~~~
net/xfrm/xfrm_compat.c:282:27: note: in expansion of macro 'ARRAY_SIZE'
282 | if (WARN_ON_ONCE(type >= ARRAY_SIZE(xfrm_msg_min)))
| ^~~~~~~~~~

# https://github.com/0day-ci/linux/commit/fa198f6763bf103396e06e12549e1dc00941a3d0
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Dmitry-Safonov/xfrm-Add-compat-layer/20200826-095240
git checkout fa198f6763bf103396e06e12549e1dc00941a3d0
vim +103 net/xfrm/xfrm_compat.c

98
99 static struct nlmsghdr *xfrm_nlmsg_put_compat(struct sk_buff *skb,
100 const struct nlmsghdr *nlh_src, u16 type)
101 {
102 int payload = compat_msg_min[type];
> 103 int src_len = xfrm_msg_min[type];
104 struct nlmsghdr *nlh_dst;
105
106 /* Compat messages are shorter or equal to native (+padding) */
107 if (WARN_ON_ONCE(src_len < payload))
108 return ERR_PTR(-EMSGSIZE);
109
110 nlh_dst = nlmsg_put(skb, nlh_src->nlmsg_pid, nlh_src->nlmsg_seq,
111 nlh_src->nlmsg_type, payload, nlh_src->nlmsg_flags);
112 if (!nlh_dst)
113 return ERR_PTR(-EMSGSIZE);
114
115 memset(nlmsg_data(nlh_dst), 0, payload);
116
117 switch (nlh_src->nlmsg_type) {
118 /* Compat message has the same layout as native */
119 case XFRM_MSG_DELSA:
120 case XFRM_MSG_DELPOLICY:
121 case XFRM_MSG_FLUSHSA:
122 case XFRM_MSG_FLUSHPOLICY:
123 case XFRM_MSG_NEWAE:
124 case XFRM_MSG_REPORT:
125 case XFRM_MSG_MIGRATE:
126 case XFRM_MSG_NEWSADINFO:
127 case XFRM_MSG_NEWSPDINFO:
128 case XFRM_MSG_MAPPING:
129 WARN_ON_ONCE(src_len != payload);
130 memcpy(nlmsg_data(nlh_dst), nlmsg_data(nlh_src), src_len);
131 break;
132 /* 4 byte alignment for trailing u64 on native, but not on compat */
133 case XFRM_MSG_NEWSA:
134 case XFRM_MSG_NEWPOLICY:
135 case XFRM_MSG_UPDSA:
136 case XFRM_MSG_UPDPOLICY:
137 WARN_ON_ONCE(src_len != payload + 4);
138 memcpy(nlmsg_data(nlh_dst), nlmsg_data(nlh_src), payload);
139 break;
140 case XFRM_MSG_EXPIRE: {
141 const struct xfrm_user_expire *src_ue = nlmsg_data(nlh_src);
142 struct compat_xfrm_user_expire *dst_ue = nlmsg_data(nlh_dst);
143
144 /* compat_xfrm_user_expire has 4-byte smaller state */
145 memcpy(dst_ue, src_ue, sizeof(dst_ue->state));
146 dst_ue->hard = src_ue->hard;
147 break;
148 }
149 case XFRM_MSG_ACQUIRE: {
150 const struct xfrm_user_acquire *src_ua = nlmsg_data(nlh_src);
151 struct compat_xfrm_user_acquire *dst_ua = nlmsg_data(nlh_dst);
152
153 memcpy(dst_ua, src_ua, offsetof(struct compat_xfrm_user_acquire, aalgos));
154 dst_ua->aalgos = src_ua->aalgos;
155 dst_ua->ealgos = src_ua->ealgos;
156 dst_ua->calgos = src_ua->calgos;
157 dst_ua->seq = src_ua->seq;
158 break;
159 }
160 case XFRM_MSG_POLEXPIRE: {
161 const struct xfrm_user_polexpire *src_upe = nlmsg_data(nlh_src);
162 struct compat_xfrm_user_polexpire *dst_upe = nlmsg_data(nlh_dst);
163
164 /* compat_xfrm_user_polexpire has 4-byte smaller state */
165 memcpy(dst_upe, src_upe, sizeof(dst_upe->pol));
166 dst_upe->hard = src_upe->hard;
167 break;
168 }
169 case XFRM_MSG_ALLOCSPI: {
170 const struct xfrm_userspi_info *src_usi = nlmsg_data(nlh_src);
171 struct compat_xfrm_userspi_info *dst_usi = nlmsg_data(nlh_dst);
172
173 /* compat_xfrm_user_polexpire has 4-byte smaller state */
174 memcpy(dst_usi, src_usi, sizeof(src_usi->info));
175 dst_usi->min = src_usi->min;
176 dst_usi->max = src_usi->max;
177 break;
178 }
179 /* Not being sent by kernel */
180 case XFRM_MSG_GETSA:
181 case XFRM_MSG_GETPOLICY:
182 case XFRM_MSG_GETAE:
183 case XFRM_MSG_GETSADINFO:
184 case XFRM_MSG_GETSPDINFO:
185 default:
186 WARN_ONCE(1, "unsupported nlmsg_type %d", nlh_src->nlmsg_type);
187 return ERR_PTR(-EOPNOTSUPP);
188 }
189
190 return nlh_dst;
191 }
192
193 static int xfrm_nla_cpy(struct sk_buff *dst, const struct nlattr *src, int len)
194 {
195 return nla_put(dst, src->nla_type, len, nla_data(src));
196 }
197
198 static int xfrm_xlate64_attr(struct sk_buff *dst, const struct nlattr *src)
199 {
200 switch (src->nla_type) {
201 case XFRMA_ALG_AUTH:
202 case XFRMA_ALG_CRYPT:
203 case XFRMA_ALG_COMP:
204 case XFRMA_ENCAP:
205 case XFRMA_TMPL:
206 return xfrm_nla_cpy(dst, src, nla_len(src));
207 case XFRMA_SA:
208 return xfrm_nla_cpy(dst, src, XMSGSIZE(compat_xfrm_usersa_info));
209 case XFRMA_POLICY:
210 return xfrm_nla_cpy(dst, src, XMSGSIZE(compat_xfrm_userpolicy_info));
211 case XFRMA_SEC_CTX:
212 return xfrm_nla_cpy(dst, src, nla_len(src));
213 case XFRMA_LTIME_VAL:
214 return nla_put_64bit(dst, src->nla_type, nla_len(src),
215 nla_data(src), XFRMA_PAD);
216 case XFRMA_REPLAY_VAL:
217 case XFRMA_REPLAY_THRESH:
218 case XFRMA_ETIMER_THRESH:
219 case XFRMA_SRCADDR:
220 case XFRMA_COADDR:
221 return xfrm_nla_cpy(dst, src, nla_len(src));
222 case XFRMA_LASTUSED:
223 return nla_put_64bit(dst, src->nla_type, nla_len(src),
224 nla_data(src), XFRMA_PAD);
225 case XFRMA_POLICY_TYPE:
226 case XFRMA_MIGRATE:
227 case XFRMA_ALG_AEAD:
228 case XFRMA_KMADDRESS:
229 case XFRMA_ALG_AUTH_TRUNC:
230 case XFRMA_MARK:
231 case XFRMA_TFCPAD:
232 case XFRMA_REPLAY_ESN_VAL:
233 case XFRMA_SA_EXTRA_FLAGS:
234 case XFRMA_PROTO:
235 case XFRMA_ADDRESS_FILTER:
236 case XFRMA_OFFLOAD_DEV:
237 case XFRMA_SET_MARK:
238 case XFRMA_SET_MARK_MASK:
239 case XFRMA_IF_ID:
240 return xfrm_nla_cpy(dst, src, nla_len(src));
241 default:
242 BUILD_BUG_ON(XFRMA_MAX != XFRMA_IF_ID);
243 WARN_ONCE(1, "unsupported nla_type %d", src->nla_type);
244 return -EOPNOTSUPP;
245 }
246 }
247
248 /* Take kernel-built (64bit layout) and create 32bit layout for userspace */
249 static int xfrm_xlate64(struct sk_buff *dst, const struct nlmsghdr *nlh_src)
250 {
251 u16 type = nlh_src->nlmsg_type - XFRM_MSG_BASE;
252 const struct nlattr *nla, *attrs;
253 struct nlmsghdr *nlh_dst;
254 int len, remaining;
255
256 nlh_dst = xfrm_nlmsg_put_compat(dst, nlh_src, type);
257 if (IS_ERR(nlh_dst))
258 return PTR_ERR(nlh_dst);
259
260 attrs = nlmsg_attrdata(nlh_src, xfrm_msg_min[type]);
261 len = nlmsg_attrlen(nlh_src, xfrm_msg_min[type]);
262
263 nla_for_each_attr(nla, attrs, len, remaining) {
264 int err = xfrm_xlate64_attr(dst, nla);
265
266 if (err)
267 return err;
268 }
269
270 nlmsg_end(dst, nlh_dst);
271
272 return 0;
273 }
274
> 275 int xfrm_alloc_compat(struct sk_buff *skb)

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

Attachment: .config.gz
Description: application/gzip