xfrm_user: propagate sec ctx allocation errors
[pandora-kernel.git] / net / xfrm / xfrm_user.c
1 /* xfrm_user.c: User interface to configure xfrm engine.
2  *
3  * Copyright (C) 2002 David S. Miller (davem@redhat.com)
4  *
5  * Changes:
6  *      Mitsuru KANDA @USAGI
7  *      Kazunori MIYAZAWA @USAGI
8  *      Kunihiro Ishiguro <kunihiro@ipinfusion.com>
9  *              IPv6 support
10  *
11  */
12
13 #include <linux/crypto.h>
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/types.h>
17 #include <linux/slab.h>
18 #include <linux/socket.h>
19 #include <linux/string.h>
20 #include <linux/net.h>
21 #include <linux/skbuff.h>
22 #include <linux/pfkeyv2.h>
23 #include <linux/ipsec.h>
24 #include <linux/init.h>
25 #include <linux/security.h>
26 #include <net/sock.h>
27 #include <net/xfrm.h>
28 #include <net/netlink.h>
29 #include <net/ah.h>
30 #include <asm/uaccess.h>
31 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
32 #include <linux/in6.h>
33 #endif
34
35 static inline int aead_len(struct xfrm_algo_aead *alg)
36 {
37         return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
38 }
39
40 static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type)
41 {
42         struct nlattr *rt = attrs[type];
43         struct xfrm_algo *algp;
44
45         if (!rt)
46                 return 0;
47
48         algp = nla_data(rt);
49         if (nla_len(rt) < xfrm_alg_len(algp))
50                 return -EINVAL;
51
52         switch (type) {
53         case XFRMA_ALG_AUTH:
54         case XFRMA_ALG_CRYPT:
55         case XFRMA_ALG_COMP:
56                 break;
57
58         default:
59                 return -EINVAL;
60         }
61
62         algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
63         return 0;
64 }
65
66 static int verify_auth_trunc(struct nlattr **attrs)
67 {
68         struct nlattr *rt = attrs[XFRMA_ALG_AUTH_TRUNC];
69         struct xfrm_algo_auth *algp;
70
71         if (!rt)
72                 return 0;
73
74         algp = nla_data(rt);
75         if (nla_len(rt) < xfrm_alg_auth_len(algp))
76                 return -EINVAL;
77
78         algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
79         return 0;
80 }
81
82 static int verify_aead(struct nlattr **attrs)
83 {
84         struct nlattr *rt = attrs[XFRMA_ALG_AEAD];
85         struct xfrm_algo_aead *algp;
86
87         if (!rt)
88                 return 0;
89
90         algp = nla_data(rt);
91         if (nla_len(rt) < aead_len(algp))
92                 return -EINVAL;
93
94         algp->alg_name[CRYPTO_MAX_ALG_NAME - 1] = '\0';
95         return 0;
96 }
97
98 static void verify_one_addr(struct nlattr **attrs, enum xfrm_attr_type_t type,
99                            xfrm_address_t **addrp)
100 {
101         struct nlattr *rt = attrs[type];
102
103         if (rt && addrp)
104                 *addrp = nla_data(rt);
105 }
106
107 static inline int verify_sec_ctx_len(struct nlattr **attrs)
108 {
109         struct nlattr *rt = attrs[XFRMA_SEC_CTX];
110         struct xfrm_user_sec_ctx *uctx;
111
112         if (!rt)
113                 return 0;
114
115         uctx = nla_data(rt);
116         if (uctx->len != (sizeof(struct xfrm_user_sec_ctx) + uctx->ctx_len))
117                 return -EINVAL;
118
119         return 0;
120 }
121
122 static inline int verify_replay(struct xfrm_usersa_info *p,
123                                 struct nlattr **attrs)
124 {
125         struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
126         struct xfrm_replay_state_esn *rs;
127
128         if (p->flags & XFRM_STATE_ESN) {
129                 if (!rt)
130                         return -EINVAL;
131
132                 rs = nla_data(rt);
133
134                 if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8)
135                         return -EINVAL;
136
137                 if (nla_len(rt) < xfrm_replay_state_esn_len(rs) &&
138                     nla_len(rt) != sizeof(*rs))
139                         return -EINVAL;
140         }
141
142         if (!rt)
143                 return 0;
144
145         if (p->id.proto != IPPROTO_ESP)
146                 return -EINVAL;
147
148         if (p->replay_window != 0)
149                 return -EINVAL;
150
151         return 0;
152 }
153
154 static int verify_newsa_info(struct xfrm_usersa_info *p,
155                              struct nlattr **attrs)
156 {
157         int err;
158
159         err = -EINVAL;
160         switch (p->family) {
161         case AF_INET:
162                 break;
163
164         case AF_INET6:
165 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
166                 break;
167 #else
168                 err = -EAFNOSUPPORT;
169                 goto out;
170 #endif
171
172         default:
173                 goto out;
174         }
175
176         err = -EINVAL;
177         switch (p->id.proto) {
178         case IPPROTO_AH:
179                 if ((!attrs[XFRMA_ALG_AUTH]     &&
180                      !attrs[XFRMA_ALG_AUTH_TRUNC]) ||
181                     attrs[XFRMA_ALG_AEAD]       ||
182                     attrs[XFRMA_ALG_CRYPT]      ||
183                     attrs[XFRMA_ALG_COMP]       ||
184                     attrs[XFRMA_TFCPAD])
185                         goto out;
186                 break;
187
188         case IPPROTO_ESP:
189                 if (attrs[XFRMA_ALG_COMP])
190                         goto out;
191                 if (!attrs[XFRMA_ALG_AUTH] &&
192                     !attrs[XFRMA_ALG_AUTH_TRUNC] &&
193                     !attrs[XFRMA_ALG_CRYPT] &&
194                     !attrs[XFRMA_ALG_AEAD])
195                         goto out;
196                 if ((attrs[XFRMA_ALG_AUTH] ||
197                      attrs[XFRMA_ALG_AUTH_TRUNC] ||
198                      attrs[XFRMA_ALG_CRYPT]) &&
199                     attrs[XFRMA_ALG_AEAD])
200                         goto out;
201                 if (attrs[XFRMA_TFCPAD] &&
202                     p->mode != XFRM_MODE_TUNNEL)
203                         goto out;
204                 break;
205
206         case IPPROTO_COMP:
207                 if (!attrs[XFRMA_ALG_COMP]      ||
208                     attrs[XFRMA_ALG_AEAD]       ||
209                     attrs[XFRMA_ALG_AUTH]       ||
210                     attrs[XFRMA_ALG_AUTH_TRUNC] ||
211                     attrs[XFRMA_ALG_CRYPT]      ||
212                     attrs[XFRMA_TFCPAD])
213                         goto out;
214                 break;
215
216 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
217         case IPPROTO_DSTOPTS:
218         case IPPROTO_ROUTING:
219                 if (attrs[XFRMA_ALG_COMP]       ||
220                     attrs[XFRMA_ALG_AUTH]       ||
221                     attrs[XFRMA_ALG_AUTH_TRUNC] ||
222                     attrs[XFRMA_ALG_AEAD]       ||
223                     attrs[XFRMA_ALG_CRYPT]      ||
224                     attrs[XFRMA_ENCAP]          ||
225                     attrs[XFRMA_SEC_CTX]        ||
226                     attrs[XFRMA_TFCPAD]         ||
227                     !attrs[XFRMA_COADDR])
228                         goto out;
229                 break;
230 #endif
231
232         default:
233                 goto out;
234         }
235
236         if ((err = verify_aead(attrs)))
237                 goto out;
238         if ((err = verify_auth_trunc(attrs)))
239                 goto out;
240         if ((err = verify_one_alg(attrs, XFRMA_ALG_AUTH)))
241                 goto out;
242         if ((err = verify_one_alg(attrs, XFRMA_ALG_CRYPT)))
243                 goto out;
244         if ((err = verify_one_alg(attrs, XFRMA_ALG_COMP)))
245                 goto out;
246         if ((err = verify_sec_ctx_len(attrs)))
247                 goto out;
248         if ((err = verify_replay(p, attrs)))
249                 goto out;
250
251         err = -EINVAL;
252         switch (p->mode) {
253         case XFRM_MODE_TRANSPORT:
254         case XFRM_MODE_TUNNEL:
255         case XFRM_MODE_ROUTEOPTIMIZATION:
256         case XFRM_MODE_BEET:
257                 break;
258
259         default:
260                 goto out;
261         }
262
263         err = 0;
264
265 out:
266         return err;
267 }
268
269 static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
270                            struct xfrm_algo_desc *(*get_byname)(const char *, int),
271                            struct nlattr *rta)
272 {
273         struct xfrm_algo *p, *ualg;
274         struct xfrm_algo_desc *algo;
275
276         if (!rta)
277                 return 0;
278
279         ualg = nla_data(rta);
280
281         algo = get_byname(ualg->alg_name, 1);
282         if (!algo)
283                 return -ENOSYS;
284         *props = algo->desc.sadb_alg_id;
285
286         p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL);
287         if (!p)
288                 return -ENOMEM;
289
290         strcpy(p->alg_name, algo->name);
291         *algpp = p;
292         return 0;
293 }
294
295 static int attach_auth(struct xfrm_algo_auth **algpp, u8 *props,
296                        struct nlattr *rta)
297 {
298         struct xfrm_algo *ualg;
299         struct xfrm_algo_auth *p;
300         struct xfrm_algo_desc *algo;
301
302         if (!rta)
303                 return 0;
304
305         ualg = nla_data(rta);
306
307         algo = xfrm_aalg_get_byname(ualg->alg_name, 1);
308         if (!algo)
309                 return -ENOSYS;
310         *props = algo->desc.sadb_alg_id;
311
312         p = kmalloc(sizeof(*p) + (ualg->alg_key_len + 7) / 8, GFP_KERNEL);
313         if (!p)
314                 return -ENOMEM;
315
316         strcpy(p->alg_name, algo->name);
317         p->alg_key_len = ualg->alg_key_len;
318         p->alg_trunc_len = algo->uinfo.auth.icv_truncbits;
319         memcpy(p->alg_key, ualg->alg_key, (ualg->alg_key_len + 7) / 8);
320
321         *algpp = p;
322         return 0;
323 }
324
325 static int attach_auth_trunc(struct xfrm_algo_auth **algpp, u8 *props,
326                              struct nlattr *rta)
327 {
328         struct xfrm_algo_auth *p, *ualg;
329         struct xfrm_algo_desc *algo;
330
331         if (!rta)
332                 return 0;
333
334         ualg = nla_data(rta);
335
336         algo = xfrm_aalg_get_byname(ualg->alg_name, 1);
337         if (!algo)
338                 return -ENOSYS;
339         if ((ualg->alg_trunc_len / 8) > MAX_AH_AUTH_LEN ||
340             ualg->alg_trunc_len > algo->uinfo.auth.icv_fullbits)
341                 return -EINVAL;
342         *props = algo->desc.sadb_alg_id;
343
344         p = kmemdup(ualg, xfrm_alg_auth_len(ualg), GFP_KERNEL);
345         if (!p)
346                 return -ENOMEM;
347
348         strcpy(p->alg_name, algo->name);
349         if (!p->alg_trunc_len)
350                 p->alg_trunc_len = algo->uinfo.auth.icv_truncbits;
351
352         *algpp = p;
353         return 0;
354 }
355
356 static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props,
357                        struct nlattr *rta)
358 {
359         struct xfrm_algo_aead *p, *ualg;
360         struct xfrm_algo_desc *algo;
361
362         if (!rta)
363                 return 0;
364
365         ualg = nla_data(rta);
366
367         algo = xfrm_aead_get_byname(ualg->alg_name, ualg->alg_icv_len, 1);
368         if (!algo)
369                 return -ENOSYS;
370         *props = algo->desc.sadb_alg_id;
371
372         p = kmemdup(ualg, aead_len(ualg), GFP_KERNEL);
373         if (!p)
374                 return -ENOMEM;
375
376         strcpy(p->alg_name, algo->name);
377         *algpp = p;
378         return 0;
379 }
380
381 static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_esn,
382                                          struct nlattr *rp)
383 {
384         struct xfrm_replay_state_esn *up;
385         int ulen;
386
387         if (!replay_esn || !rp)
388                 return 0;
389
390         up = nla_data(rp);
391         ulen = xfrm_replay_state_esn_len(up);
392
393         if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
394                 return -EINVAL;
395
396         return 0;
397 }
398
399 static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn,
400                                        struct xfrm_replay_state_esn **preplay_esn,
401                                        struct nlattr *rta)
402 {
403         struct xfrm_replay_state_esn *p, *pp, *up;
404         int klen, ulen;
405
406         if (!rta)
407                 return 0;
408
409         up = nla_data(rta);
410         klen = xfrm_replay_state_esn_len(up);
411         ulen = nla_len(rta) >= klen ? klen : sizeof(*up);
412
413         p = kzalloc(klen, GFP_KERNEL);
414         if (!p)
415                 return -ENOMEM;
416
417         pp = kzalloc(klen, GFP_KERNEL);
418         if (!pp) {
419                 kfree(p);
420                 return -ENOMEM;
421         }
422
423         memcpy(p, up, ulen);
424         memcpy(pp, up, ulen);
425
426         *replay_esn = p;
427         *preplay_esn = pp;
428
429         return 0;
430 }
431
432 static inline int xfrm_user_sec_ctx_size(struct xfrm_sec_ctx *xfrm_ctx)
433 {
434         int len = 0;
435
436         if (xfrm_ctx) {
437                 len += sizeof(struct xfrm_user_sec_ctx);
438                 len += xfrm_ctx->ctx_len;
439         }
440         return len;
441 }
442
443 static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
444 {
445         memcpy(&x->id, &p->id, sizeof(x->id));
446         memcpy(&x->sel, &p->sel, sizeof(x->sel));
447         memcpy(&x->lft, &p->lft, sizeof(x->lft));
448         x->props.mode = p->mode;
449         x->props.replay_window = p->replay_window;
450         x->props.reqid = p->reqid;
451         x->props.family = p->family;
452         memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr));
453         x->props.flags = p->flags;
454
455         if (!x->sel.family && !(p->flags & XFRM_STATE_AF_UNSPEC))
456                 x->sel.family = p->family;
457 }
458
459 /*
460  * someday when pfkey also has support, we could have the code
461  * somehow made shareable and move it to xfrm_state.c - JHS
462  *
463 */
464 static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs,
465                                   int update_esn)
466 {
467         struct nlattr *rp = attrs[XFRMA_REPLAY_VAL];
468         struct nlattr *re = update_esn ? attrs[XFRMA_REPLAY_ESN_VAL] : NULL;
469         struct nlattr *lt = attrs[XFRMA_LTIME_VAL];
470         struct nlattr *et = attrs[XFRMA_ETIMER_THRESH];
471         struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH];
472
473         if (re) {
474                 struct xfrm_replay_state_esn *replay_esn;
475                 replay_esn = nla_data(re);
476                 memcpy(x->replay_esn, replay_esn,
477                        xfrm_replay_state_esn_len(replay_esn));
478                 memcpy(x->preplay_esn, replay_esn,
479                        xfrm_replay_state_esn_len(replay_esn));
480         }
481
482         if (rp) {
483                 struct xfrm_replay_state *replay;
484                 replay = nla_data(rp);
485                 memcpy(&x->replay, replay, sizeof(*replay));
486                 memcpy(&x->preplay, replay, sizeof(*replay));
487         }
488
489         if (lt) {
490                 struct xfrm_lifetime_cur *ltime;
491                 ltime = nla_data(lt);
492                 x->curlft.bytes = ltime->bytes;
493                 x->curlft.packets = ltime->packets;
494                 x->curlft.add_time = ltime->add_time;
495                 x->curlft.use_time = ltime->use_time;
496         }
497
498         if (et)
499                 x->replay_maxage = nla_get_u32(et);
500
501         if (rt)
502                 x->replay_maxdiff = nla_get_u32(rt);
503 }
504
505 static struct xfrm_state *xfrm_state_construct(struct net *net,
506                                                struct xfrm_usersa_info *p,
507                                                struct nlattr **attrs,
508                                                int *errp)
509 {
510         struct xfrm_state *x = xfrm_state_alloc(net);
511         int err = -ENOMEM;
512
513         if (!x)
514                 goto error_no_put;
515
516         copy_from_user_state(x, p);
517
518         if ((err = attach_aead(&x->aead, &x->props.ealgo,
519                                attrs[XFRMA_ALG_AEAD])))
520                 goto error;
521         if ((err = attach_auth_trunc(&x->aalg, &x->props.aalgo,
522                                      attrs[XFRMA_ALG_AUTH_TRUNC])))
523                 goto error;
524         if (!x->props.aalgo) {
525                 if ((err = attach_auth(&x->aalg, &x->props.aalgo,
526                                        attrs[XFRMA_ALG_AUTH])))
527                         goto error;
528         }
529         if ((err = attach_one_algo(&x->ealg, &x->props.ealgo,
530                                    xfrm_ealg_get_byname,
531                                    attrs[XFRMA_ALG_CRYPT])))
532                 goto error;
533         if ((err = attach_one_algo(&x->calg, &x->props.calgo,
534                                    xfrm_calg_get_byname,
535                                    attrs[XFRMA_ALG_COMP])))
536                 goto error;
537
538         if (attrs[XFRMA_ENCAP]) {
539                 x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
540                                    sizeof(*x->encap), GFP_KERNEL);
541                 if (x->encap == NULL)
542                         goto error;
543         }
544
545         if (attrs[XFRMA_TFCPAD])
546                 x->tfcpad = nla_get_u32(attrs[XFRMA_TFCPAD]);
547
548         if (attrs[XFRMA_COADDR]) {
549                 x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
550                                     sizeof(*x->coaddr), GFP_KERNEL);
551                 if (x->coaddr == NULL)
552                         goto error;
553         }
554
555         xfrm_mark_get(attrs, &x->mark);
556
557         err = __xfrm_init_state(x, false);
558         if (err)
559                 goto error;
560
561         if (attrs[XFRMA_SEC_CTX]) {
562                 err = security_xfrm_state_alloc(x,
563                                                 nla_data(attrs[XFRMA_SEC_CTX]));
564                 if (err)
565                         goto error;
566         }
567
568         if ((err = xfrm_alloc_replay_state_esn(&x->replay_esn, &x->preplay_esn,
569                                                attrs[XFRMA_REPLAY_ESN_VAL])))
570                 goto error;
571
572         x->km.seq = p->seq;
573         x->replay_maxdiff = net->xfrm.sysctl_aevent_rseqth;
574         /* sysctl_xfrm_aevent_etime is in 100ms units */
575         x->replay_maxage = (net->xfrm.sysctl_aevent_etime*HZ)/XFRM_AE_ETH_M;
576
577         if ((err = xfrm_init_replay(x)))
578                 goto error;
579
580         /* override default values from above */
581         xfrm_update_ae_params(x, attrs, 0);
582
583         return x;
584
585 error:
586         x->km.state = XFRM_STATE_DEAD;
587         xfrm_state_put(x);
588 error_no_put:
589         *errp = err;
590         return NULL;
591 }
592
593 static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh,
594                 struct nlattr **attrs)
595 {
596         struct net *net = sock_net(skb->sk);
597         struct xfrm_usersa_info *p = nlmsg_data(nlh);
598         struct xfrm_state *x;
599         int err;
600         struct km_event c;
601         uid_t loginuid = audit_get_loginuid(current);
602         u32 sessionid = audit_get_sessionid(current);
603         u32 sid;
604
605         err = verify_newsa_info(p, attrs);
606         if (err)
607                 return err;
608
609         x = xfrm_state_construct(net, p, attrs, &err);
610         if (!x)
611                 return err;
612
613         xfrm_state_hold(x);
614         if (nlh->nlmsg_type == XFRM_MSG_NEWSA)
615                 err = xfrm_state_add(x);
616         else
617                 err = xfrm_state_update(x);
618
619         security_task_getsecid(current, &sid);
620         xfrm_audit_state_add(x, err ? 0 : 1, loginuid, sessionid, sid);
621
622         if (err < 0) {
623                 x->km.state = XFRM_STATE_DEAD;
624                 __xfrm_state_put(x);
625                 goto out;
626         }
627
628         c.seq = nlh->nlmsg_seq;
629         c.pid = nlh->nlmsg_pid;
630         c.event = nlh->nlmsg_type;
631
632         km_state_notify(x, &c);
633 out:
634         xfrm_state_put(x);
635         return err;
636 }
637
638 static struct xfrm_state *xfrm_user_state_lookup(struct net *net,
639                                                  struct xfrm_usersa_id *p,
640                                                  struct nlattr **attrs,
641                                                  int *errp)
642 {
643         struct xfrm_state *x = NULL;
644         struct xfrm_mark m;
645         int err;
646         u32 mark = xfrm_mark_get(attrs, &m);
647
648         if (xfrm_id_proto_match(p->proto, IPSEC_PROTO_ANY)) {
649                 err = -ESRCH;
650                 x = xfrm_state_lookup(net, mark, &p->daddr, p->spi, p->proto, p->family);
651         } else {
652                 xfrm_address_t *saddr = NULL;
653
654                 verify_one_addr(attrs, XFRMA_SRCADDR, &saddr);
655                 if (!saddr) {
656                         err = -EINVAL;
657                         goto out;
658                 }
659
660                 err = -ESRCH;
661                 x = xfrm_state_lookup_byaddr(net, mark,
662                                              &p->daddr, saddr,
663                                              p->proto, p->family);
664         }
665
666  out:
667         if (!x && errp)
668                 *errp = err;
669         return x;
670 }
671
672 static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh,
673                 struct nlattr **attrs)
674 {
675         struct net *net = sock_net(skb->sk);
676         struct xfrm_state *x;
677         int err = -ESRCH;
678         struct km_event c;
679         struct xfrm_usersa_id *p = nlmsg_data(nlh);
680         uid_t loginuid = audit_get_loginuid(current);
681         u32 sessionid = audit_get_sessionid(current);
682         u32 sid;
683
684         x = xfrm_user_state_lookup(net, p, attrs, &err);
685         if (x == NULL)
686                 return err;
687
688         if ((err = security_xfrm_state_delete(x)) != 0)
689                 goto out;
690
691         if (xfrm_state_kern(x)) {
692                 err = -EPERM;
693                 goto out;
694         }
695
696         err = xfrm_state_delete(x);
697
698         if (err < 0)
699                 goto out;
700
701         c.seq = nlh->nlmsg_seq;
702         c.pid = nlh->nlmsg_pid;
703         c.event = nlh->nlmsg_type;
704         km_state_notify(x, &c);
705
706 out:
707         security_task_getsecid(current, &sid);
708         xfrm_audit_state_delete(x, err ? 0 : 1, loginuid, sessionid, sid);
709         xfrm_state_put(x);
710         return err;
711 }
712
713 static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
714 {
715         memset(p, 0, sizeof(*p));
716         memcpy(&p->id, &x->id, sizeof(p->id));
717         memcpy(&p->sel, &x->sel, sizeof(p->sel));
718         memcpy(&p->lft, &x->lft, sizeof(p->lft));
719         memcpy(&p->curlft, &x->curlft, sizeof(p->curlft));
720         memcpy(&p->stats, &x->stats, sizeof(p->stats));
721         memcpy(&p->saddr, &x->props.saddr, sizeof(p->saddr));
722         p->mode = x->props.mode;
723         p->replay_window = x->props.replay_window;
724         p->reqid = x->props.reqid;
725         p->family = x->props.family;
726         p->flags = x->props.flags;
727         p->seq = x->km.seq;
728 }
729
730 struct xfrm_dump_info {
731         struct sk_buff *in_skb;
732         struct sk_buff *out_skb;
733         u32 nlmsg_seq;
734         u16 nlmsg_flags;
735 };
736
737 static int copy_sec_ctx(struct xfrm_sec_ctx *s, struct sk_buff *skb)
738 {
739         struct xfrm_user_sec_ctx *uctx;
740         struct nlattr *attr;
741         int ctx_size = sizeof(*uctx) + s->ctx_len;
742
743         attr = nla_reserve(skb, XFRMA_SEC_CTX, ctx_size);
744         if (attr == NULL)
745                 return -EMSGSIZE;
746
747         uctx = nla_data(attr);
748         uctx->exttype = XFRMA_SEC_CTX;
749         uctx->len = ctx_size;
750         uctx->ctx_doi = s->ctx_doi;
751         uctx->ctx_alg = s->ctx_alg;
752         uctx->ctx_len = s->ctx_len;
753         memcpy(uctx + 1, s->ctx_str, s->ctx_len);
754
755         return 0;
756 }
757
758 static int copy_to_user_auth(struct xfrm_algo_auth *auth, struct sk_buff *skb)
759 {
760         struct xfrm_algo *algo;
761         struct nlattr *nla;
762
763         nla = nla_reserve(skb, XFRMA_ALG_AUTH,
764                           sizeof(*algo) + (auth->alg_key_len + 7) / 8);
765         if (!nla)
766                 return -EMSGSIZE;
767
768         algo = nla_data(nla);
769         strncpy(algo->alg_name, auth->alg_name, sizeof(algo->alg_name));
770         memcpy(algo->alg_key, auth->alg_key, (auth->alg_key_len + 7) / 8);
771         algo->alg_key_len = auth->alg_key_len;
772
773         return 0;
774 }
775
776 /* Don't change this without updating xfrm_sa_len! */
777 static int copy_to_user_state_extra(struct xfrm_state *x,
778                                     struct xfrm_usersa_info *p,
779                                     struct sk_buff *skb)
780 {
781         copy_to_user_state(x, p);
782
783         if (x->coaddr)
784                 NLA_PUT(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
785
786         if (x->lastused)
787                 NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
788
789         if (x->aead)
790                 NLA_PUT(skb, XFRMA_ALG_AEAD, aead_len(x->aead), x->aead);
791         if (x->aalg) {
792                 if (copy_to_user_auth(x->aalg, skb))
793                         goto nla_put_failure;
794
795                 NLA_PUT(skb, XFRMA_ALG_AUTH_TRUNC,
796                         xfrm_alg_auth_len(x->aalg), x->aalg);
797         }
798         if (x->ealg)
799                 NLA_PUT(skb, XFRMA_ALG_CRYPT, xfrm_alg_len(x->ealg), x->ealg);
800         if (x->calg)
801                 NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg);
802
803         if (x->encap)
804                 NLA_PUT(skb, XFRMA_ENCAP, sizeof(*x->encap), x->encap);
805
806         if (x->tfcpad)
807                 NLA_PUT_U32(skb, XFRMA_TFCPAD, x->tfcpad);
808
809         if (xfrm_mark_put(skb, &x->mark))
810                 goto nla_put_failure;
811
812         if (x->replay_esn)
813                 NLA_PUT(skb, XFRMA_REPLAY_ESN_VAL,
814                         xfrm_replay_state_esn_len(x->replay_esn), x->replay_esn);
815
816         if (x->security && copy_sec_ctx(x->security, skb) < 0)
817                 goto nla_put_failure;
818
819         return 0;
820
821 nla_put_failure:
822         return -EMSGSIZE;
823 }
824
825 static int dump_one_state(struct xfrm_state *x, int count, void *ptr)
826 {
827         struct xfrm_dump_info *sp = ptr;
828         struct sk_buff *in_skb = sp->in_skb;
829         struct sk_buff *skb = sp->out_skb;
830         struct xfrm_usersa_info *p;
831         struct nlmsghdr *nlh;
832         int err;
833
834         nlh = nlmsg_put(skb, NETLINK_CB(in_skb).pid, sp->nlmsg_seq,
835                         XFRM_MSG_NEWSA, sizeof(*p), sp->nlmsg_flags);
836         if (nlh == NULL)
837                 return -EMSGSIZE;
838
839         p = nlmsg_data(nlh);
840
841         err = copy_to_user_state_extra(x, p, skb);
842         if (err)
843                 goto nla_put_failure;
844
845         nlmsg_end(skb, nlh);
846         return 0;
847
848 nla_put_failure:
849         nlmsg_cancel(skb, nlh);
850         return err;
851 }
852
853 static int xfrm_dump_sa_done(struct netlink_callback *cb)
854 {
855         struct xfrm_state_walk *walk = (struct xfrm_state_walk *) &cb->args[1];
856         xfrm_state_walk_done(walk);
857         return 0;
858 }
859
860 static int xfrm_dump_sa(struct sk_buff *skb, struct netlink_callback *cb)
861 {
862         struct net *net = sock_net(skb->sk);
863         struct xfrm_state_walk *walk = (struct xfrm_state_walk *) &cb->args[1];
864         struct xfrm_dump_info info;
865
866         BUILD_BUG_ON(sizeof(struct xfrm_state_walk) >
867                      sizeof(cb->args) - sizeof(cb->args[0]));
868
869         info.in_skb = cb->skb;
870         info.out_skb = skb;
871         info.nlmsg_seq = cb->nlh->nlmsg_seq;
872         info.nlmsg_flags = NLM_F_MULTI;
873
874         if (!cb->args[0]) {
875                 cb->args[0] = 1;
876                 xfrm_state_walk_init(walk, 0);
877         }
878
879         (void) xfrm_state_walk(net, walk, dump_one_state, &info);
880
881         return skb->len;
882 }
883
884 static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb,
885                                           struct xfrm_state *x, u32 seq)
886 {
887         struct xfrm_dump_info info;
888         struct sk_buff *skb;
889         int err;
890
891         skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
892         if (!skb)
893                 return ERR_PTR(-ENOMEM);
894
895         info.in_skb = in_skb;
896         info.out_skb = skb;
897         info.nlmsg_seq = seq;
898         info.nlmsg_flags = 0;
899
900         err = dump_one_state(x, 0, &info);
901         if (err) {
902                 kfree_skb(skb);
903                 return ERR_PTR(err);
904         }
905
906         return skb;
907 }
908
909 static inline size_t xfrm_spdinfo_msgsize(void)
910 {
911         return NLMSG_ALIGN(4)
912                + nla_total_size(sizeof(struct xfrmu_spdinfo))
913                + nla_total_size(sizeof(struct xfrmu_spdhinfo));
914 }
915
916 static int build_spdinfo(struct sk_buff *skb, struct net *net,
917                          u32 pid, u32 seq, u32 flags)
918 {
919         struct xfrmk_spdinfo si;
920         struct xfrmu_spdinfo spc;
921         struct xfrmu_spdhinfo sph;
922         struct nlmsghdr *nlh;
923         u32 *f;
924
925         nlh = nlmsg_put(skb, pid, seq, XFRM_MSG_NEWSPDINFO, sizeof(u32), 0);
926         if (nlh == NULL) /* shouldn't really happen ... */
927                 return -EMSGSIZE;
928
929         f = nlmsg_data(nlh);
930         *f = flags;
931         xfrm_spd_getinfo(net, &si);
932         spc.incnt = si.incnt;
933         spc.outcnt = si.outcnt;
934         spc.fwdcnt = si.fwdcnt;
935         spc.inscnt = si.inscnt;
936         spc.outscnt = si.outscnt;
937         spc.fwdscnt = si.fwdscnt;
938         sph.spdhcnt = si.spdhcnt;
939         sph.spdhmcnt = si.spdhmcnt;
940
941         NLA_PUT(skb, XFRMA_SPD_INFO, sizeof(spc), &spc);
942         NLA_PUT(skb, XFRMA_SPD_HINFO, sizeof(sph), &sph);
943
944         return nlmsg_end(skb, nlh);
945
946 nla_put_failure:
947         nlmsg_cancel(skb, nlh);
948         return -EMSGSIZE;
949 }
950
951 static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
952                 struct nlattr **attrs)
953 {
954         struct net *net = sock_net(skb->sk);
955         struct sk_buff *r_skb;
956         u32 *flags = nlmsg_data(nlh);
957         u32 spid = NETLINK_CB(skb).pid;
958         u32 seq = nlh->nlmsg_seq;
959
960         r_skb = nlmsg_new(xfrm_spdinfo_msgsize(), GFP_ATOMIC);
961         if (r_skb == NULL)
962                 return -ENOMEM;
963
964         if (build_spdinfo(r_skb, net, spid, seq, *flags) < 0)
965                 BUG();
966
967         return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
968 }
969
970 static inline size_t xfrm_sadinfo_msgsize(void)
971 {
972         return NLMSG_ALIGN(4)
973                + nla_total_size(sizeof(struct xfrmu_sadhinfo))
974                + nla_total_size(4); /* XFRMA_SAD_CNT */
975 }
976
977 static int build_sadinfo(struct sk_buff *skb, struct net *net,
978                          u32 pid, u32 seq, u32 flags)
979 {
980         struct xfrmk_sadinfo si;
981         struct xfrmu_sadhinfo sh;
982         struct nlmsghdr *nlh;
983         u32 *f;
984
985         nlh = nlmsg_put(skb, pid, seq, XFRM_MSG_NEWSADINFO, sizeof(u32), 0);
986         if (nlh == NULL) /* shouldn't really happen ... */
987                 return -EMSGSIZE;
988
989         f = nlmsg_data(nlh);
990         *f = flags;
991         xfrm_sad_getinfo(net, &si);
992
993         sh.sadhmcnt = si.sadhmcnt;
994         sh.sadhcnt = si.sadhcnt;
995
996         NLA_PUT_U32(skb, XFRMA_SAD_CNT, si.sadcnt);
997         NLA_PUT(skb, XFRMA_SAD_HINFO, sizeof(sh), &sh);
998
999         return nlmsg_end(skb, nlh);
1000
1001 nla_put_failure:
1002         nlmsg_cancel(skb, nlh);
1003         return -EMSGSIZE;
1004 }
1005
1006 static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
1007                 struct nlattr **attrs)
1008 {
1009         struct net *net = sock_net(skb->sk);
1010         struct sk_buff *r_skb;
1011         u32 *flags = nlmsg_data(nlh);
1012         u32 spid = NETLINK_CB(skb).pid;
1013         u32 seq = nlh->nlmsg_seq;
1014
1015         r_skb = nlmsg_new(xfrm_sadinfo_msgsize(), GFP_ATOMIC);
1016         if (r_skb == NULL)
1017                 return -ENOMEM;
1018
1019         if (build_sadinfo(r_skb, net, spid, seq, *flags) < 0)
1020                 BUG();
1021
1022         return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
1023 }
1024
1025 static int xfrm_get_sa(struct sk_buff *skb, struct nlmsghdr *nlh,
1026                 struct nlattr **attrs)
1027 {
1028         struct net *net = sock_net(skb->sk);
1029         struct xfrm_usersa_id *p = nlmsg_data(nlh);
1030         struct xfrm_state *x;
1031         struct sk_buff *resp_skb;
1032         int err = -ESRCH;
1033
1034         x = xfrm_user_state_lookup(net, p, attrs, &err);
1035         if (x == NULL)
1036                 goto out_noput;
1037
1038         resp_skb = xfrm_state_netlink(skb, x, nlh->nlmsg_seq);
1039         if (IS_ERR(resp_skb)) {
1040                 err = PTR_ERR(resp_skb);
1041         } else {
1042                 err = nlmsg_unicast(net->xfrm.nlsk, resp_skb, NETLINK_CB(skb).pid);
1043         }
1044         xfrm_state_put(x);
1045 out_noput:
1046         return err;
1047 }
1048
1049 static int verify_userspi_info(struct xfrm_userspi_info *p)
1050 {
1051         switch (p->info.id.proto) {
1052         case IPPROTO_AH:
1053         case IPPROTO_ESP:
1054                 break;
1055
1056         case IPPROTO_COMP:
1057                 /* IPCOMP spi is 16-bits. */
1058                 if (p->max >= 0x10000)
1059                         return -EINVAL;
1060                 break;
1061
1062         default:
1063                 return -EINVAL;
1064         }
1065
1066         if (p->min > p->max)
1067                 return -EINVAL;
1068
1069         return 0;
1070 }
1071
1072 static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh,
1073                 struct nlattr **attrs)
1074 {
1075         struct net *net = sock_net(skb->sk);
1076         struct xfrm_state *x;
1077         struct xfrm_userspi_info *p;
1078         struct sk_buff *resp_skb;
1079         xfrm_address_t *daddr;
1080         int family;
1081         int err;
1082         u32 mark;
1083         struct xfrm_mark m;
1084
1085         p = nlmsg_data(nlh);
1086         err = verify_userspi_info(p);
1087         if (err)
1088                 goto out_noput;
1089
1090         family = p->info.family;
1091         daddr = &p->info.id.daddr;
1092
1093         x = NULL;
1094
1095         mark = xfrm_mark_get(attrs, &m);
1096         if (p->info.seq) {
1097                 x = xfrm_find_acq_byseq(net, mark, p->info.seq);
1098                 if (x && xfrm_addr_cmp(&x->id.daddr, daddr, family)) {
1099                         xfrm_state_put(x);
1100                         x = NULL;
1101                 }
1102         }
1103
1104         if (!x)
1105                 x = xfrm_find_acq(net, &m, p->info.mode, p->info.reqid,
1106                                   p->info.id.proto, daddr,
1107                                   &p->info.saddr, 1,
1108                                   family);
1109         err = -ENOENT;
1110         if (x == NULL)
1111                 goto out_noput;
1112
1113         err = xfrm_alloc_spi(x, p->min, p->max);
1114         if (err)
1115                 goto out;
1116
1117         resp_skb = xfrm_state_netlink(skb, x, nlh->nlmsg_seq);
1118         if (IS_ERR(resp_skb)) {
1119                 err = PTR_ERR(resp_skb);
1120                 goto out;
1121         }
1122
1123         err = nlmsg_unicast(net->xfrm.nlsk, resp_skb, NETLINK_CB(skb).pid);
1124
1125 out:
1126         xfrm_state_put(x);
1127 out_noput:
1128         return err;
1129 }
1130
1131 static int verify_policy_dir(u8 dir)
1132 {
1133         switch (dir) {
1134         case XFRM_POLICY_IN:
1135         case XFRM_POLICY_OUT:
1136         case XFRM_POLICY_FWD:
1137                 break;
1138
1139         default:
1140                 return -EINVAL;
1141         }
1142
1143         return 0;
1144 }
1145
1146 static int verify_policy_type(u8 type)
1147 {
1148         switch (type) {
1149         case XFRM_POLICY_TYPE_MAIN:
1150 #ifdef CONFIG_XFRM_SUB_POLICY
1151         case XFRM_POLICY_TYPE_SUB:
1152 #endif
1153                 break;
1154
1155         default:
1156                 return -EINVAL;
1157         }
1158
1159         return 0;
1160 }
1161
1162 static int verify_newpolicy_info(struct xfrm_userpolicy_info *p)
1163 {
1164         switch (p->share) {
1165         case XFRM_SHARE_ANY:
1166         case XFRM_SHARE_SESSION:
1167         case XFRM_SHARE_USER:
1168         case XFRM_SHARE_UNIQUE:
1169                 break;
1170
1171         default:
1172                 return -EINVAL;
1173         }
1174
1175         switch (p->action) {
1176         case XFRM_POLICY_ALLOW:
1177         case XFRM_POLICY_BLOCK:
1178                 break;
1179
1180         default:
1181                 return -EINVAL;
1182         }
1183
1184         switch (p->sel.family) {
1185         case AF_INET:
1186                 break;
1187
1188         case AF_INET6:
1189 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1190                 break;
1191 #else
1192                 return  -EAFNOSUPPORT;
1193 #endif
1194
1195         default:
1196                 return -EINVAL;
1197         }
1198
1199         return verify_policy_dir(p->dir);
1200 }
1201
1202 static int copy_from_user_sec_ctx(struct xfrm_policy *pol, struct nlattr **attrs)
1203 {
1204         struct nlattr *rt = attrs[XFRMA_SEC_CTX];
1205         struct xfrm_user_sec_ctx *uctx;
1206
1207         if (!rt)
1208                 return 0;
1209
1210         uctx = nla_data(rt);
1211         return security_xfrm_policy_alloc(&pol->security, uctx);
1212 }
1213
1214 static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
1215                            int nr)
1216 {
1217         int i;
1218
1219         xp->xfrm_nr = nr;
1220         for (i = 0; i < nr; i++, ut++) {
1221                 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
1222
1223                 memcpy(&t->id, &ut->id, sizeof(struct xfrm_id));
1224                 memcpy(&t->saddr, &ut->saddr,
1225                        sizeof(xfrm_address_t));
1226                 t->reqid = ut->reqid;
1227                 t->mode = ut->mode;
1228                 t->share = ut->share;
1229                 t->optional = ut->optional;
1230                 t->aalgos = ut->aalgos;
1231                 t->ealgos = ut->ealgos;
1232                 t->calgos = ut->calgos;
1233                 /* If all masks are ~0, then we allow all algorithms. */
1234                 t->allalgs = !~(t->aalgos & t->ealgos & t->calgos);
1235                 t->encap_family = ut->family;
1236         }
1237 }
1238
1239 static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
1240 {
1241         int i;
1242
1243         if (nr > XFRM_MAX_DEPTH)
1244                 return -EINVAL;
1245
1246         for (i = 0; i < nr; i++) {
1247                 /* We never validated the ut->family value, so many
1248                  * applications simply leave it at zero.  The check was
1249                  * never made and ut->family was ignored because all
1250                  * templates could be assumed to have the same family as
1251                  * the policy itself.  Now that we will have ipv4-in-ipv6
1252                  * and ipv6-in-ipv4 tunnels, this is no longer true.
1253                  */
1254                 if (!ut[i].family)
1255                         ut[i].family = family;
1256
1257                 switch (ut[i].family) {
1258                 case AF_INET:
1259                         break;
1260 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1261                 case AF_INET6:
1262                         break;
1263 #endif
1264                 default:
1265                         return -EINVAL;
1266                 }
1267         }
1268
1269         return 0;
1270 }
1271
1272 static int copy_from_user_tmpl(struct xfrm_policy *pol, struct nlattr **attrs)
1273 {
1274         struct nlattr *rt = attrs[XFRMA_TMPL];
1275
1276         if (!rt) {
1277                 pol->xfrm_nr = 0;
1278         } else {
1279                 struct xfrm_user_tmpl *utmpl = nla_data(rt);
1280                 int nr = nla_len(rt) / sizeof(*utmpl);
1281                 int err;
1282
1283                 err = validate_tmpl(nr, utmpl, pol->family);
1284                 if (err)
1285                         return err;
1286
1287                 copy_templates(pol, utmpl, nr);
1288         }
1289         return 0;
1290 }
1291
1292 static int copy_from_user_policy_type(u8 *tp, struct nlattr **attrs)
1293 {
1294         struct nlattr *rt = attrs[XFRMA_POLICY_TYPE];
1295         struct xfrm_userpolicy_type *upt;
1296         u8 type = XFRM_POLICY_TYPE_MAIN;
1297         int err;
1298
1299         if (rt) {
1300                 upt = nla_data(rt);
1301                 type = upt->type;
1302         }
1303
1304         err = verify_policy_type(type);
1305         if (err)
1306                 return err;
1307
1308         *tp = type;
1309         return 0;
1310 }
1311
1312 static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p)
1313 {
1314         xp->priority = p->priority;
1315         xp->index = p->index;
1316         memcpy(&xp->selector, &p->sel, sizeof(xp->selector));
1317         memcpy(&xp->lft, &p->lft, sizeof(xp->lft));
1318         xp->action = p->action;
1319         xp->flags = p->flags;
1320         xp->family = p->sel.family;
1321         /* XXX xp->share = p->share; */
1322 }
1323
1324 static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir)
1325 {
1326         memset(p, 0, sizeof(*p));
1327         memcpy(&p->sel, &xp->selector, sizeof(p->sel));
1328         memcpy(&p->lft, &xp->lft, sizeof(p->lft));
1329         memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft));
1330         p->priority = xp->priority;
1331         p->index = xp->index;
1332         p->sel.family = xp->family;
1333         p->dir = dir;
1334         p->action = xp->action;
1335         p->flags = xp->flags;
1336         p->share = XFRM_SHARE_ANY; /* XXX xp->share */
1337 }
1338
1339 static struct xfrm_policy *xfrm_policy_construct(struct net *net, struct xfrm_userpolicy_info *p, struct nlattr **attrs, int *errp)
1340 {
1341         struct xfrm_policy *xp = xfrm_policy_alloc(net, GFP_KERNEL);
1342         int err;
1343
1344         if (!xp) {
1345                 *errp = -ENOMEM;
1346                 return NULL;
1347         }
1348
1349         copy_from_user_policy(xp, p);
1350
1351         err = copy_from_user_policy_type(&xp->type, attrs);
1352         if (err)
1353                 goto error;
1354
1355         if (!(err = copy_from_user_tmpl(xp, attrs)))
1356                 err = copy_from_user_sec_ctx(xp, attrs);
1357         if (err)
1358                 goto error;
1359
1360         xfrm_mark_get(attrs, &xp->mark);
1361
1362         return xp;
1363  error:
1364         *errp = err;
1365         xp->walk.dead = 1;
1366         xfrm_policy_destroy(xp);
1367         return NULL;
1368 }
1369
1370 static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
1371                 struct nlattr **attrs)
1372 {
1373         struct net *net = sock_net(skb->sk);
1374         struct xfrm_userpolicy_info *p = nlmsg_data(nlh);
1375         struct xfrm_policy *xp;
1376         struct km_event c;
1377         int err;
1378         int excl;
1379         uid_t loginuid = audit_get_loginuid(current);
1380         u32 sessionid = audit_get_sessionid(current);
1381         u32 sid;
1382
1383         err = verify_newpolicy_info(p);
1384         if (err)
1385                 return err;
1386         err = verify_sec_ctx_len(attrs);
1387         if (err)
1388                 return err;
1389
1390         xp = xfrm_policy_construct(net, p, attrs, &err);
1391         if (!xp)
1392                 return err;
1393
1394         /* shouldn't excl be based on nlh flags??
1395          * Aha! this is anti-netlink really i.e  more pfkey derived
1396          * in netlink excl is a flag and you wouldnt need
1397          * a type XFRM_MSG_UPDPOLICY - JHS */
1398         excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY;
1399         err = xfrm_policy_insert(p->dir, xp, excl);
1400         security_task_getsecid(current, &sid);
1401         xfrm_audit_policy_add(xp, err ? 0 : 1, loginuid, sessionid, sid);
1402
1403         if (err) {
1404                 security_xfrm_policy_free(xp->security);
1405                 kfree(xp);
1406                 return err;
1407         }
1408
1409         c.event = nlh->nlmsg_type;
1410         c.seq = nlh->nlmsg_seq;
1411         c.pid = nlh->nlmsg_pid;
1412         km_policy_notify(xp, p->dir, &c);
1413
1414         xfrm_pol_put(xp);
1415
1416         return 0;
1417 }
1418
1419 static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
1420 {
1421         struct xfrm_user_tmpl vec[XFRM_MAX_DEPTH];
1422         int i;
1423
1424         if (xp->xfrm_nr == 0)
1425                 return 0;
1426
1427         for (i = 0; i < xp->xfrm_nr; i++) {
1428                 struct xfrm_user_tmpl *up = &vec[i];
1429                 struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
1430
1431                 memset(up, 0, sizeof(*up));
1432                 memcpy(&up->id, &kp->id, sizeof(up->id));
1433                 up->family = kp->encap_family;
1434                 memcpy(&up->saddr, &kp->saddr, sizeof(up->saddr));
1435                 up->reqid = kp->reqid;
1436                 up->mode = kp->mode;
1437                 up->share = kp->share;
1438                 up->optional = kp->optional;
1439                 up->aalgos = kp->aalgos;
1440                 up->ealgos = kp->ealgos;
1441                 up->calgos = kp->calgos;
1442         }
1443
1444         return nla_put(skb, XFRMA_TMPL,
1445                        sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr, vec);
1446 }
1447
1448 static inline int copy_to_user_state_sec_ctx(struct xfrm_state *x, struct sk_buff *skb)
1449 {
1450         if (x->security) {
1451                 return copy_sec_ctx(x->security, skb);
1452         }
1453         return 0;
1454 }
1455
1456 static inline int copy_to_user_sec_ctx(struct xfrm_policy *xp, struct sk_buff *skb)
1457 {
1458         if (xp->security) {
1459                 return copy_sec_ctx(xp->security, skb);
1460         }
1461         return 0;
1462 }
1463 static inline size_t userpolicy_type_attrsize(void)
1464 {
1465 #ifdef CONFIG_XFRM_SUB_POLICY
1466         return nla_total_size(sizeof(struct xfrm_userpolicy_type));
1467 #else
1468         return 0;
1469 #endif
1470 }
1471
1472 #ifdef CONFIG_XFRM_SUB_POLICY
1473 static int copy_to_user_policy_type(u8 type, struct sk_buff *skb)
1474 {
1475         struct xfrm_userpolicy_type upt = {
1476                 .type = type,
1477         };
1478
1479         return nla_put(skb, XFRMA_POLICY_TYPE, sizeof(upt), &upt);
1480 }
1481
1482 #else
1483 static inline int copy_to_user_policy_type(u8 type, struct sk_buff *skb)
1484 {
1485         return 0;
1486 }
1487 #endif
1488
1489 static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr)
1490 {
1491         struct xfrm_dump_info *sp = ptr;
1492         struct xfrm_userpolicy_info *p;
1493         struct sk_buff *in_skb = sp->in_skb;
1494         struct sk_buff *skb = sp->out_skb;
1495         struct nlmsghdr *nlh;
1496
1497         nlh = nlmsg_put(skb, NETLINK_CB(in_skb).pid, sp->nlmsg_seq,
1498                         XFRM_MSG_NEWPOLICY, sizeof(*p), sp->nlmsg_flags);
1499         if (nlh == NULL)
1500                 return -EMSGSIZE;
1501
1502         p = nlmsg_data(nlh);
1503         copy_to_user_policy(xp, p, dir);
1504         if (copy_to_user_tmpl(xp, skb) < 0)
1505                 goto nlmsg_failure;
1506         if (copy_to_user_sec_ctx(xp, skb))
1507                 goto nlmsg_failure;
1508         if (copy_to_user_policy_type(xp->type, skb) < 0)
1509                 goto nlmsg_failure;
1510         if (xfrm_mark_put(skb, &xp->mark))
1511                 goto nla_put_failure;
1512
1513         nlmsg_end(skb, nlh);
1514         return 0;
1515
1516 nla_put_failure:
1517 nlmsg_failure:
1518         nlmsg_cancel(skb, nlh);
1519         return -EMSGSIZE;
1520 }
1521
1522 static int xfrm_dump_policy_done(struct netlink_callback *cb)
1523 {
1524         struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *) &cb->args[1];
1525
1526         xfrm_policy_walk_done(walk);
1527         return 0;
1528 }
1529
1530 static int xfrm_dump_policy(struct sk_buff *skb, struct netlink_callback *cb)
1531 {
1532         struct net *net = sock_net(skb->sk);
1533         struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *) &cb->args[1];
1534         struct xfrm_dump_info info;
1535
1536         BUILD_BUG_ON(sizeof(struct xfrm_policy_walk) >
1537                      sizeof(cb->args) - sizeof(cb->args[0]));
1538
1539         info.in_skb = cb->skb;
1540         info.out_skb = skb;
1541         info.nlmsg_seq = cb->nlh->nlmsg_seq;
1542         info.nlmsg_flags = NLM_F_MULTI;
1543
1544         if (!cb->args[0]) {
1545                 cb->args[0] = 1;
1546                 xfrm_policy_walk_init(walk, XFRM_POLICY_TYPE_ANY);
1547         }
1548
1549         (void) xfrm_policy_walk(net, walk, dump_one_policy, &info);
1550
1551         return skb->len;
1552 }
1553
1554 static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb,
1555                                           struct xfrm_policy *xp,
1556                                           int dir, u32 seq)
1557 {
1558         struct xfrm_dump_info info;
1559         struct sk_buff *skb;
1560         int err;
1561
1562         skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1563         if (!skb)
1564                 return ERR_PTR(-ENOMEM);
1565
1566         info.in_skb = in_skb;
1567         info.out_skb = skb;
1568         info.nlmsg_seq = seq;
1569         info.nlmsg_flags = 0;
1570
1571         err = dump_one_policy(xp, dir, 0, &info);
1572         if (err) {
1573                 kfree_skb(skb);
1574                 return ERR_PTR(err);
1575         }
1576
1577         return skb;
1578 }
1579
1580 static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
1581                 struct nlattr **attrs)
1582 {
1583         struct net *net = sock_net(skb->sk);
1584         struct xfrm_policy *xp;
1585         struct xfrm_userpolicy_id *p;
1586         u8 type = XFRM_POLICY_TYPE_MAIN;
1587         int err;
1588         struct km_event c;
1589         int delete;
1590         struct xfrm_mark m;
1591         u32 mark = xfrm_mark_get(attrs, &m);
1592
1593         p = nlmsg_data(nlh);
1594         delete = nlh->nlmsg_type == XFRM_MSG_DELPOLICY;
1595
1596         err = copy_from_user_policy_type(&type, attrs);
1597         if (err)
1598                 return err;
1599
1600         err = verify_policy_dir(p->dir);
1601         if (err)
1602                 return err;
1603
1604         if (p->index)
1605                 xp = xfrm_policy_byid(net, mark, type, p->dir, p->index, delete, &err);
1606         else {
1607                 struct nlattr *rt = attrs[XFRMA_SEC_CTX];
1608                 struct xfrm_sec_ctx *ctx;
1609
1610                 err = verify_sec_ctx_len(attrs);
1611                 if (err)
1612                         return err;
1613
1614                 ctx = NULL;
1615                 if (rt) {
1616                         struct xfrm_user_sec_ctx *uctx = nla_data(rt);
1617
1618                         err = security_xfrm_policy_alloc(&ctx, uctx);
1619                         if (err)
1620                                 return err;
1621                 }
1622                 xp = xfrm_policy_bysel_ctx(net, mark, type, p->dir, &p->sel,
1623                                            ctx, delete, &err);
1624                 security_xfrm_policy_free(ctx);
1625         }
1626         if (xp == NULL)
1627                 return -ENOENT;
1628
1629         if (!delete) {
1630                 struct sk_buff *resp_skb;
1631
1632                 resp_skb = xfrm_policy_netlink(skb, xp, p->dir, nlh->nlmsg_seq);
1633                 if (IS_ERR(resp_skb)) {
1634                         err = PTR_ERR(resp_skb);
1635                 } else {
1636                         err = nlmsg_unicast(net->xfrm.nlsk, resp_skb,
1637                                             NETLINK_CB(skb).pid);
1638                 }
1639         } else {
1640                 uid_t loginuid = audit_get_loginuid(current);
1641                 u32 sessionid = audit_get_sessionid(current);
1642                 u32 sid;
1643
1644                 security_task_getsecid(current, &sid);
1645                 xfrm_audit_policy_delete(xp, err ? 0 : 1, loginuid, sessionid,
1646                                          sid);
1647
1648                 if (err != 0)
1649                         goto out;
1650
1651                 c.data.byid = p->index;
1652                 c.event = nlh->nlmsg_type;
1653                 c.seq = nlh->nlmsg_seq;
1654                 c.pid = nlh->nlmsg_pid;
1655                 km_policy_notify(xp, p->dir, &c);
1656         }
1657
1658 out:
1659         xfrm_pol_put(xp);
1660         return err;
1661 }
1662
1663 static int xfrm_flush_sa(struct sk_buff *skb, struct nlmsghdr *nlh,
1664                 struct nlattr **attrs)
1665 {
1666         struct net *net = sock_net(skb->sk);
1667         struct km_event c;
1668         struct xfrm_usersa_flush *p = nlmsg_data(nlh);
1669         struct xfrm_audit audit_info;
1670         int err;
1671
1672         audit_info.loginuid = audit_get_loginuid(current);
1673         audit_info.sessionid = audit_get_sessionid(current);
1674         security_task_getsecid(current, &audit_info.secid);
1675         err = xfrm_state_flush(net, p->proto, &audit_info);
1676         if (err) {
1677                 if (err == -ESRCH) /* empty table */
1678                         return 0;
1679                 return err;
1680         }
1681         c.data.proto = p->proto;
1682         c.event = nlh->nlmsg_type;
1683         c.seq = nlh->nlmsg_seq;
1684         c.pid = nlh->nlmsg_pid;
1685         c.net = net;
1686         km_state_notify(NULL, &c);
1687
1688         return 0;
1689 }
1690
1691 static inline size_t xfrm_aevent_msgsize(struct xfrm_state *x)
1692 {
1693         size_t replay_size = x->replay_esn ?
1694                               xfrm_replay_state_esn_len(x->replay_esn) :
1695                               sizeof(struct xfrm_replay_state);
1696
1697         return NLMSG_ALIGN(sizeof(struct xfrm_aevent_id))
1698                + nla_total_size(replay_size)
1699                + nla_total_size(sizeof(struct xfrm_lifetime_cur))
1700                + nla_total_size(sizeof(struct xfrm_mark))
1701                + nla_total_size(4) /* XFRM_AE_RTHR */
1702                + nla_total_size(4); /* XFRM_AE_ETHR */
1703 }
1704
1705 static int build_aevent(struct sk_buff *skb, struct xfrm_state *x, const struct km_event *c)
1706 {
1707         struct xfrm_aevent_id *id;
1708         struct nlmsghdr *nlh;
1709
1710         nlh = nlmsg_put(skb, c->pid, c->seq, XFRM_MSG_NEWAE, sizeof(*id), 0);
1711         if (nlh == NULL)
1712                 return -EMSGSIZE;
1713
1714         id = nlmsg_data(nlh);
1715         memcpy(&id->sa_id.daddr, &x->id.daddr,sizeof(x->id.daddr));
1716         id->sa_id.spi = x->id.spi;
1717         id->sa_id.family = x->props.family;
1718         id->sa_id.proto = x->id.proto;
1719         memcpy(&id->saddr, &x->props.saddr,sizeof(x->props.saddr));
1720         id->reqid = x->props.reqid;
1721         id->flags = c->data.aevent;
1722
1723         if (x->replay_esn)
1724                 NLA_PUT(skb, XFRMA_REPLAY_ESN_VAL,
1725                         xfrm_replay_state_esn_len(x->replay_esn),
1726                         x->replay_esn);
1727         else
1728                 NLA_PUT(skb, XFRMA_REPLAY_VAL, sizeof(x->replay), &x->replay);
1729
1730         NLA_PUT(skb, XFRMA_LTIME_VAL, sizeof(x->curlft), &x->curlft);
1731
1732         if (id->flags & XFRM_AE_RTHR)
1733                 NLA_PUT_U32(skb, XFRMA_REPLAY_THRESH, x->replay_maxdiff);
1734
1735         if (id->flags & XFRM_AE_ETHR)
1736                 NLA_PUT_U32(skb, XFRMA_ETIMER_THRESH,
1737                             x->replay_maxage * 10 / HZ);
1738
1739         if (xfrm_mark_put(skb, &x->mark))
1740                 goto nla_put_failure;
1741
1742         return nlmsg_end(skb, nlh);
1743
1744 nla_put_failure:
1745         nlmsg_cancel(skb, nlh);
1746         return -EMSGSIZE;
1747 }
1748
1749 static int xfrm_get_ae(struct sk_buff *skb, struct nlmsghdr *nlh,
1750                 struct nlattr **attrs)
1751 {
1752         struct net *net = sock_net(skb->sk);
1753         struct xfrm_state *x;
1754         struct sk_buff *r_skb;
1755         int err;
1756         struct km_event c;
1757         u32 mark;
1758         struct xfrm_mark m;
1759         struct xfrm_aevent_id *p = nlmsg_data(nlh);
1760         struct xfrm_usersa_id *id = &p->sa_id;
1761
1762         mark = xfrm_mark_get(attrs, &m);
1763
1764         x = xfrm_state_lookup(net, mark, &id->daddr, id->spi, id->proto, id->family);
1765         if (x == NULL)
1766                 return -ESRCH;
1767
1768         r_skb = nlmsg_new(xfrm_aevent_msgsize(x), GFP_ATOMIC);
1769         if (r_skb == NULL) {
1770                 xfrm_state_put(x);
1771                 return -ENOMEM;
1772         }
1773
1774         /*
1775          * XXX: is this lock really needed - none of the other
1776          * gets lock (the concern is things getting updated
1777          * while we are still reading) - jhs
1778         */
1779         spin_lock_bh(&x->lock);
1780         c.data.aevent = p->flags;
1781         c.seq = nlh->nlmsg_seq;
1782         c.pid = nlh->nlmsg_pid;
1783
1784         if (build_aevent(r_skb, x, &c) < 0)
1785                 BUG();
1786         err = nlmsg_unicast(net->xfrm.nlsk, r_skb, NETLINK_CB(skb).pid);
1787         spin_unlock_bh(&x->lock);
1788         xfrm_state_put(x);
1789         return err;
1790 }
1791
1792 static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh,
1793                 struct nlattr **attrs)
1794 {
1795         struct net *net = sock_net(skb->sk);
1796         struct xfrm_state *x;
1797         struct km_event c;
1798         int err = - EINVAL;
1799         u32 mark = 0;
1800         struct xfrm_mark m;
1801         struct xfrm_aevent_id *p = nlmsg_data(nlh);
1802         struct nlattr *rp = attrs[XFRMA_REPLAY_VAL];
1803         struct nlattr *re = attrs[XFRMA_REPLAY_ESN_VAL];
1804         struct nlattr *lt = attrs[XFRMA_LTIME_VAL];
1805
1806         if (!lt && !rp && !re)
1807                 return err;
1808
1809         /* pedantic mode - thou shalt sayeth replaceth */
1810         if (!(nlh->nlmsg_flags&NLM_F_REPLACE))
1811                 return err;
1812
1813         mark = xfrm_mark_get(attrs, &m);
1814
1815         x = xfrm_state_lookup(net, mark, &p->sa_id.daddr, p->sa_id.spi, p->sa_id.proto, p->sa_id.family);
1816         if (x == NULL)
1817                 return -ESRCH;
1818
1819         if (x->km.state != XFRM_STATE_VALID)
1820                 goto out;
1821
1822         err = xfrm_replay_verify_len(x->replay_esn, rp);
1823         if (err)
1824                 goto out;
1825
1826         spin_lock_bh(&x->lock);
1827         xfrm_update_ae_params(x, attrs, 1);
1828         spin_unlock_bh(&x->lock);
1829
1830         c.event = nlh->nlmsg_type;
1831         c.seq = nlh->nlmsg_seq;
1832         c.pid = nlh->nlmsg_pid;
1833         c.data.aevent = XFRM_AE_CU;
1834         km_state_notify(x, &c);
1835         err = 0;
1836 out:
1837         xfrm_state_put(x);
1838         return err;
1839 }
1840
1841 static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
1842                 struct nlattr **attrs)
1843 {
1844         struct net *net = sock_net(skb->sk);
1845         struct km_event c;
1846         u8 type = XFRM_POLICY_TYPE_MAIN;
1847         int err;
1848         struct xfrm_audit audit_info;
1849
1850         err = copy_from_user_policy_type(&type, attrs);
1851         if (err)
1852                 return err;
1853
1854         audit_info.loginuid = audit_get_loginuid(current);
1855         audit_info.sessionid = audit_get_sessionid(current);
1856         security_task_getsecid(current, &audit_info.secid);
1857         err = xfrm_policy_flush(net, type, &audit_info);
1858         if (err) {
1859                 if (err == -ESRCH) /* empty table */
1860                         return 0;
1861                 return err;
1862         }
1863
1864         c.data.type = type;
1865         c.event = nlh->nlmsg_type;
1866         c.seq = nlh->nlmsg_seq;
1867         c.pid = nlh->nlmsg_pid;
1868         c.net = net;
1869         km_policy_notify(NULL, 0, &c);
1870         return 0;
1871 }
1872
1873 static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
1874                 struct nlattr **attrs)
1875 {
1876         struct net *net = sock_net(skb->sk);
1877         struct xfrm_policy *xp;
1878         struct xfrm_user_polexpire *up = nlmsg_data(nlh);
1879         struct xfrm_userpolicy_info *p = &up->pol;
1880         u8 type = XFRM_POLICY_TYPE_MAIN;
1881         int err = -ENOENT;
1882         struct xfrm_mark m;
1883         u32 mark = xfrm_mark_get(attrs, &m);
1884
1885         err = copy_from_user_policy_type(&type, attrs);
1886         if (err)
1887                 return err;
1888
1889         err = verify_policy_dir(p->dir);
1890         if (err)
1891                 return err;
1892
1893         if (p->index)
1894                 xp = xfrm_policy_byid(net, mark, type, p->dir, p->index, 0, &err);
1895         else {
1896                 struct nlattr *rt = attrs[XFRMA_SEC_CTX];
1897                 struct xfrm_sec_ctx *ctx;
1898
1899                 err = verify_sec_ctx_len(attrs);
1900                 if (err)
1901                         return err;
1902
1903                 ctx = NULL;
1904                 if (rt) {
1905                         struct xfrm_user_sec_ctx *uctx = nla_data(rt);
1906
1907                         err = security_xfrm_policy_alloc(&ctx, uctx);
1908                         if (err)
1909                                 return err;
1910                 }
1911                 xp = xfrm_policy_bysel_ctx(net, mark, type, p->dir,
1912                                            &p->sel, ctx, 0, &err);
1913                 security_xfrm_policy_free(ctx);
1914         }
1915         if (xp == NULL)
1916                 return -ENOENT;
1917
1918         if (unlikely(xp->walk.dead))
1919                 goto out;
1920
1921         err = 0;
1922         if (up->hard) {
1923                 uid_t loginuid = audit_get_loginuid(current);
1924                 u32 sessionid = audit_get_sessionid(current);
1925                 u32 sid;
1926
1927                 security_task_getsecid(current, &sid);
1928                 xfrm_policy_delete(xp, p->dir);
1929                 xfrm_audit_policy_delete(xp, 1, loginuid, sessionid, sid);
1930
1931         } else {
1932                 // reset the timers here?
1933                 WARN(1, "Dont know what to do with soft policy expire\n");
1934         }
1935         km_policy_expired(xp, p->dir, up->hard, current->pid);
1936
1937 out:
1938         xfrm_pol_put(xp);
1939         return err;
1940 }
1941
1942 static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
1943                 struct nlattr **attrs)
1944 {
1945         struct net *net = sock_net(skb->sk);
1946         struct xfrm_state *x;
1947         int err;
1948         struct xfrm_user_expire *ue = nlmsg_data(nlh);
1949         struct xfrm_usersa_info *p = &ue->state;
1950         struct xfrm_mark m;
1951         u32 mark = xfrm_mark_get(attrs, &m);
1952
1953         x = xfrm_state_lookup(net, mark, &p->id.daddr, p->id.spi, p->id.proto, p->family);
1954
1955         err = -ENOENT;
1956         if (x == NULL)
1957                 return err;
1958
1959         spin_lock_bh(&x->lock);
1960         err = -EINVAL;
1961         if (x->km.state != XFRM_STATE_VALID)
1962                 goto out;
1963         km_state_expired(x, ue->hard, current->pid);
1964
1965         if (ue->hard) {
1966                 uid_t loginuid = audit_get_loginuid(current);
1967                 u32 sessionid = audit_get_sessionid(current);
1968                 u32 sid;
1969
1970                 security_task_getsecid(current, &sid);
1971                 __xfrm_state_delete(x);
1972                 xfrm_audit_state_delete(x, 1, loginuid, sessionid, sid);
1973         }
1974         err = 0;
1975 out:
1976         spin_unlock_bh(&x->lock);
1977         xfrm_state_put(x);
1978         return err;
1979 }
1980
1981 static int xfrm_add_acquire(struct sk_buff *skb, struct nlmsghdr *nlh,
1982                 struct nlattr **attrs)
1983 {
1984         struct net *net = sock_net(skb->sk);
1985         struct xfrm_policy *xp;
1986         struct xfrm_user_tmpl *ut;
1987         int i;
1988         struct nlattr *rt = attrs[XFRMA_TMPL];
1989         struct xfrm_mark mark;
1990
1991         struct xfrm_user_acquire *ua = nlmsg_data(nlh);
1992         struct xfrm_state *x = xfrm_state_alloc(net);
1993         int err = -ENOMEM;
1994
1995         if (!x)
1996                 goto nomem;
1997
1998         xfrm_mark_get(attrs, &mark);
1999
2000         err = verify_newpolicy_info(&ua->policy);
2001         if (err)
2002                 goto bad_policy;
2003
2004         /*   build an XP */
2005         xp = xfrm_policy_construct(net, &ua->policy, attrs, &err);
2006         if (!xp)
2007                 goto free_state;
2008
2009         memcpy(&x->id, &ua->id, sizeof(ua->id));
2010         memcpy(&x->props.saddr, &ua->saddr, sizeof(ua->saddr));
2011         memcpy(&x->sel, &ua->sel, sizeof(ua->sel));
2012         xp->mark.m = x->mark.m = mark.m;
2013         xp->mark.v = x->mark.v = mark.v;
2014         ut = nla_data(rt);
2015         /* extract the templates and for each call km_key */
2016         for (i = 0; i < xp->xfrm_nr; i++, ut++) {
2017                 struct xfrm_tmpl *t = &xp->xfrm_vec[i];
2018                 memcpy(&x->id, &t->id, sizeof(x->id));
2019                 x->props.mode = t->mode;
2020                 x->props.reqid = t->reqid;
2021                 x->props.family = ut->family;
2022                 t->aalgos = ua->aalgos;
2023                 t->ealgos = ua->ealgos;
2024                 t->calgos = ua->calgos;
2025                 err = km_query(x, t, xp);
2026
2027         }
2028
2029         kfree(x);
2030         kfree(xp);
2031
2032         return 0;
2033
2034 bad_policy:
2035         WARN(1, "BAD policy passed\n");
2036 free_state:
2037         kfree(x);
2038 nomem:
2039         return err;
2040 }
2041
2042 #ifdef CONFIG_XFRM_MIGRATE
2043 static int copy_from_user_migrate(struct xfrm_migrate *ma,
2044                                   struct xfrm_kmaddress *k,
2045                                   struct nlattr **attrs, int *num)
2046 {
2047         struct nlattr *rt = attrs[XFRMA_MIGRATE];
2048         struct xfrm_user_migrate *um;
2049         int i, num_migrate;
2050
2051         if (k != NULL) {
2052                 struct xfrm_user_kmaddress *uk;
2053
2054                 uk = nla_data(attrs[XFRMA_KMADDRESS]);
2055                 memcpy(&k->local, &uk->local, sizeof(k->local));
2056                 memcpy(&k->remote, &uk->remote, sizeof(k->remote));
2057                 k->family = uk->family;
2058                 k->reserved = uk->reserved;
2059         }
2060
2061         um = nla_data(rt);
2062         num_migrate = nla_len(rt) / sizeof(*um);
2063
2064         if (num_migrate <= 0 || num_migrate > XFRM_MAX_DEPTH)
2065                 return -EINVAL;
2066
2067         for (i = 0; i < num_migrate; i++, um++, ma++) {
2068                 memcpy(&ma->old_daddr, &um->old_daddr, sizeof(ma->old_daddr));
2069                 memcpy(&ma->old_saddr, &um->old_saddr, sizeof(ma->old_saddr));
2070                 memcpy(&ma->new_daddr, &um->new_daddr, sizeof(ma->new_daddr));
2071                 memcpy(&ma->new_saddr, &um->new_saddr, sizeof(ma->new_saddr));
2072
2073                 ma->proto = um->proto;
2074                 ma->mode = um->mode;
2075                 ma->reqid = um->reqid;
2076
2077                 ma->old_family = um->old_family;
2078                 ma->new_family = um->new_family;
2079         }
2080
2081         *num = i;
2082         return 0;
2083 }
2084
2085 static int xfrm_do_migrate(struct sk_buff *skb, struct nlmsghdr *nlh,
2086                            struct nlattr **attrs)
2087 {
2088         struct xfrm_userpolicy_id *pi = nlmsg_data(nlh);
2089         struct xfrm_migrate m[XFRM_MAX_DEPTH];
2090         struct xfrm_kmaddress km, *kmp;
2091         u8 type;
2092         int err;
2093         int n = 0;
2094
2095         if (attrs[XFRMA_MIGRATE] == NULL)
2096                 return -EINVAL;
2097
2098         kmp = attrs[XFRMA_KMADDRESS] ? &km : NULL;
2099
2100         err = copy_from_user_policy_type(&type, attrs);
2101         if (err)
2102                 return err;
2103
2104         err = copy_from_user_migrate((struct xfrm_migrate *)m, kmp, attrs, &n);
2105         if (err)
2106                 return err;
2107
2108         if (!n)
2109                 return 0;
2110
2111         xfrm_migrate(&pi->sel, pi->dir, type, m, n, kmp);
2112
2113         return 0;
2114 }
2115 #else
2116 static int xfrm_do_migrate(struct sk_buff *skb, struct nlmsghdr *nlh,
2117                            struct nlattr **attrs)
2118 {
2119         return -ENOPROTOOPT;
2120 }
2121 #endif
2122
2123 #ifdef CONFIG_XFRM_MIGRATE
2124 static int copy_to_user_migrate(const struct xfrm_migrate *m, struct sk_buff *skb)
2125 {
2126         struct xfrm_user_migrate um;
2127
2128         memset(&um, 0, sizeof(um));
2129         um.proto = m->proto;
2130         um.mode = m->mode;
2131         um.reqid = m->reqid;
2132         um.old_family = m->old_family;
2133         memcpy(&um.old_daddr, &m->old_daddr, sizeof(um.old_daddr));
2134         memcpy(&um.old_saddr, &m->old_saddr, sizeof(um.old_saddr));
2135         um.new_family = m->new_family;
2136         memcpy(&um.new_daddr, &m->new_daddr, sizeof(um.new_daddr));
2137         memcpy(&um.new_saddr, &m->new_saddr, sizeof(um.new_saddr));
2138
2139         return nla_put(skb, XFRMA_MIGRATE, sizeof(um), &um);
2140 }
2141
2142 static int copy_to_user_kmaddress(const struct xfrm_kmaddress *k, struct sk_buff *skb)
2143 {
2144         struct xfrm_user_kmaddress uk;
2145
2146         memset(&uk, 0, sizeof(uk));
2147         uk.family = k->family;
2148         uk.reserved = k->reserved;
2149         memcpy(&uk.local, &k->local, sizeof(uk.local));
2150         memcpy(&uk.remote, &k->remote, sizeof(uk.remote));
2151
2152         return nla_put(skb, XFRMA_KMADDRESS, sizeof(uk), &uk);
2153 }
2154
2155 static inline size_t xfrm_migrate_msgsize(int num_migrate, int with_kma)
2156 {
2157         return NLMSG_ALIGN(sizeof(struct xfrm_userpolicy_id))
2158               + (with_kma ? nla_total_size(sizeof(struct xfrm_kmaddress)) : 0)
2159               + nla_total_size(sizeof(struct xfrm_user_migrate) * num_migrate)
2160               + userpolicy_type_attrsize();
2161 }
2162
2163 static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
2164                          int num_migrate, const struct xfrm_kmaddress *k,
2165                          const struct xfrm_selector *sel, u8 dir, u8 type)
2166 {
2167         const struct xfrm_migrate *mp;
2168         struct xfrm_userpolicy_id *pol_id;
2169         struct nlmsghdr *nlh;
2170         int i;
2171
2172         nlh = nlmsg_put(skb, 0, 0, XFRM_MSG_MIGRATE, sizeof(*pol_id), 0);
2173         if (nlh == NULL)
2174                 return -EMSGSIZE;
2175
2176         pol_id = nlmsg_data(nlh);
2177         /* copy data from selector, dir, and type to the pol_id */
2178         memset(pol_id, 0, sizeof(*pol_id));
2179         memcpy(&pol_id->sel, sel, sizeof(pol_id->sel));
2180         pol_id->dir = dir;
2181
2182         if (k != NULL && (copy_to_user_kmaddress(k, skb) < 0))
2183                         goto nlmsg_failure;
2184
2185         if (copy_to_user_policy_type(type, skb) < 0)
2186                 goto nlmsg_failure;
2187
2188         for (i = 0, mp = m ; i < num_migrate; i++, mp++) {
2189                 if (copy_to_user_migrate(mp, skb) < 0)
2190                         goto nlmsg_failure;
2191         }
2192
2193         return nlmsg_end(skb, nlh);
2194 nlmsg_failure:
2195         nlmsg_cancel(skb, nlh);
2196         return -EMSGSIZE;
2197 }
2198
2199 static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
2200                              const struct xfrm_migrate *m, int num_migrate,
2201                              const struct xfrm_kmaddress *k)
2202 {
2203         struct net *net = &init_net;
2204         struct sk_buff *skb;
2205
2206         skb = nlmsg_new(xfrm_migrate_msgsize(num_migrate, !!k), GFP_ATOMIC);
2207         if (skb == NULL)
2208                 return -ENOMEM;
2209
2210         /* build migrate */
2211         if (build_migrate(skb, m, num_migrate, k, sel, dir, type) < 0)
2212                 BUG();
2213
2214         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_MIGRATE, GFP_ATOMIC);
2215 }
2216 #else
2217 static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
2218                              const struct xfrm_migrate *m, int num_migrate,
2219                              const struct xfrm_kmaddress *k)
2220 {
2221         return -ENOPROTOOPT;
2222 }
2223 #endif
2224
2225 #define XMSGSIZE(type) sizeof(struct type)
2226
2227 static const int xfrm_msg_min[XFRM_NR_MSGTYPES] = {
2228         [XFRM_MSG_NEWSA       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_usersa_info),
2229         [XFRM_MSG_DELSA       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_usersa_id),
2230         [XFRM_MSG_GETSA       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_usersa_id),
2231         [XFRM_MSG_NEWPOLICY   - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userpolicy_info),
2232         [XFRM_MSG_DELPOLICY   - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userpolicy_id),
2233         [XFRM_MSG_GETPOLICY   - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userpolicy_id),
2234         [XFRM_MSG_ALLOCSPI    - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userspi_info),
2235         [XFRM_MSG_ACQUIRE     - XFRM_MSG_BASE] = XMSGSIZE(xfrm_user_acquire),
2236         [XFRM_MSG_EXPIRE      - XFRM_MSG_BASE] = XMSGSIZE(xfrm_user_expire),
2237         [XFRM_MSG_UPDPOLICY   - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userpolicy_info),
2238         [XFRM_MSG_UPDSA       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_usersa_info),
2239         [XFRM_MSG_POLEXPIRE   - XFRM_MSG_BASE] = XMSGSIZE(xfrm_user_polexpire),
2240         [XFRM_MSG_FLUSHSA     - XFRM_MSG_BASE] = XMSGSIZE(xfrm_usersa_flush),
2241         [XFRM_MSG_FLUSHPOLICY - XFRM_MSG_BASE] = 0,
2242         [XFRM_MSG_NEWAE       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_aevent_id),
2243         [XFRM_MSG_GETAE       - XFRM_MSG_BASE] = XMSGSIZE(xfrm_aevent_id),
2244         [XFRM_MSG_REPORT      - XFRM_MSG_BASE] = XMSGSIZE(xfrm_user_report),
2245         [XFRM_MSG_MIGRATE     - XFRM_MSG_BASE] = XMSGSIZE(xfrm_userpolicy_id),
2246         [XFRM_MSG_GETSADINFO  - XFRM_MSG_BASE] = sizeof(u32),
2247         [XFRM_MSG_GETSPDINFO  - XFRM_MSG_BASE] = sizeof(u32),
2248 };
2249
2250 #undef XMSGSIZE
2251
2252 static const struct nla_policy xfrma_policy[XFRMA_MAX+1] = {
2253         [XFRMA_SA]              = { .len = sizeof(struct xfrm_usersa_info)},
2254         [XFRMA_POLICY]          = { .len = sizeof(struct xfrm_userpolicy_info)},
2255         [XFRMA_LASTUSED]        = { .type = NLA_U64},
2256         [XFRMA_ALG_AUTH_TRUNC]  = { .len = sizeof(struct xfrm_algo_auth)},
2257         [XFRMA_ALG_AEAD]        = { .len = sizeof(struct xfrm_algo_aead) },
2258         [XFRMA_ALG_AUTH]        = { .len = sizeof(struct xfrm_algo) },
2259         [XFRMA_ALG_CRYPT]       = { .len = sizeof(struct xfrm_algo) },
2260         [XFRMA_ALG_COMP]        = { .len = sizeof(struct xfrm_algo) },
2261         [XFRMA_ENCAP]           = { .len = sizeof(struct xfrm_encap_tmpl) },
2262         [XFRMA_TMPL]            = { .len = sizeof(struct xfrm_user_tmpl) },
2263         [XFRMA_SEC_CTX]         = { .len = sizeof(struct xfrm_sec_ctx) },
2264         [XFRMA_LTIME_VAL]       = { .len = sizeof(struct xfrm_lifetime_cur) },
2265         [XFRMA_REPLAY_VAL]      = { .len = sizeof(struct xfrm_replay_state) },
2266         [XFRMA_REPLAY_THRESH]   = { .type = NLA_U32 },
2267         [XFRMA_ETIMER_THRESH]   = { .type = NLA_U32 },
2268         [XFRMA_SRCADDR]         = { .len = sizeof(xfrm_address_t) },
2269         [XFRMA_COADDR]          = { .len = sizeof(xfrm_address_t) },
2270         [XFRMA_POLICY_TYPE]     = { .len = sizeof(struct xfrm_userpolicy_type)},
2271         [XFRMA_MIGRATE]         = { .len = sizeof(struct xfrm_user_migrate) },
2272         [XFRMA_KMADDRESS]       = { .len = sizeof(struct xfrm_user_kmaddress) },
2273         [XFRMA_MARK]            = { .len = sizeof(struct xfrm_mark) },
2274         [XFRMA_TFCPAD]          = { .type = NLA_U32 },
2275         [XFRMA_REPLAY_ESN_VAL]  = { .len = sizeof(struct xfrm_replay_state_esn) },
2276 };
2277
2278 static struct xfrm_link {
2279         int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **);
2280         int (*dump)(struct sk_buff *, struct netlink_callback *);
2281         int (*done)(struct netlink_callback *);
2282 } xfrm_dispatch[XFRM_NR_MSGTYPES] = {
2283         [XFRM_MSG_NEWSA       - XFRM_MSG_BASE] = { .doit = xfrm_add_sa        },
2284         [XFRM_MSG_DELSA       - XFRM_MSG_BASE] = { .doit = xfrm_del_sa        },
2285         [XFRM_MSG_GETSA       - XFRM_MSG_BASE] = { .doit = xfrm_get_sa,
2286                                                    .dump = xfrm_dump_sa,
2287                                                    .done = xfrm_dump_sa_done  },
2288         [XFRM_MSG_NEWPOLICY   - XFRM_MSG_BASE] = { .doit = xfrm_add_policy    },
2289         [XFRM_MSG_DELPOLICY   - XFRM_MSG_BASE] = { .doit = xfrm_get_policy    },
2290         [XFRM_MSG_GETPOLICY   - XFRM_MSG_BASE] = { .doit = xfrm_get_policy,
2291                                                    .dump = xfrm_dump_policy,
2292                                                    .done = xfrm_dump_policy_done },
2293         [XFRM_MSG_ALLOCSPI    - XFRM_MSG_BASE] = { .doit = xfrm_alloc_userspi },
2294         [XFRM_MSG_ACQUIRE     - XFRM_MSG_BASE] = { .doit = xfrm_add_acquire   },
2295         [XFRM_MSG_EXPIRE      - XFRM_MSG_BASE] = { .doit = xfrm_add_sa_expire },
2296         [XFRM_MSG_UPDPOLICY   - XFRM_MSG_BASE] = { .doit = xfrm_add_policy    },
2297         [XFRM_MSG_UPDSA       - XFRM_MSG_BASE] = { .doit = xfrm_add_sa        },
2298         [XFRM_MSG_POLEXPIRE   - XFRM_MSG_BASE] = { .doit = xfrm_add_pol_expire},
2299         [XFRM_MSG_FLUSHSA     - XFRM_MSG_BASE] = { .doit = xfrm_flush_sa      },
2300         [XFRM_MSG_FLUSHPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_flush_policy  },
2301         [XFRM_MSG_NEWAE       - XFRM_MSG_BASE] = { .doit = xfrm_new_ae  },
2302         [XFRM_MSG_GETAE       - XFRM_MSG_BASE] = { .doit = xfrm_get_ae  },
2303         [XFRM_MSG_MIGRATE     - XFRM_MSG_BASE] = { .doit = xfrm_do_migrate    },
2304         [XFRM_MSG_GETSADINFO  - XFRM_MSG_BASE] = { .doit = xfrm_get_sadinfo   },
2305         [XFRM_MSG_GETSPDINFO  - XFRM_MSG_BASE] = { .doit = xfrm_get_spdinfo   },
2306 };
2307
2308 static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2309 {
2310         struct net *net = sock_net(skb->sk);
2311         struct nlattr *attrs[XFRMA_MAX+1];
2312         struct xfrm_link *link;
2313         int type, err;
2314
2315         type = nlh->nlmsg_type;
2316         if (type > XFRM_MSG_MAX)
2317                 return -EINVAL;
2318
2319         type -= XFRM_MSG_BASE;
2320         link = &xfrm_dispatch[type];
2321
2322         /* All operations require privileges, even GET */
2323         if (security_netlink_recv(skb, CAP_NET_ADMIN))
2324                 return -EPERM;
2325
2326         if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) ||
2327              type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) &&
2328             (nlh->nlmsg_flags & NLM_F_DUMP)) {
2329                 if (link->dump == NULL)
2330                         return -EINVAL;
2331
2332                 return netlink_dump_start(net->xfrm.nlsk, skb, nlh,
2333                                           link->dump, link->done, 0);
2334         }
2335
2336         err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,
2337                           xfrma_policy);
2338         if (err < 0)
2339                 return err;
2340
2341         if (link->doit == NULL)
2342                 return -EINVAL;
2343
2344         return link->doit(skb, nlh, attrs);
2345 }
2346
2347 static void xfrm_netlink_rcv(struct sk_buff *skb)
2348 {
2349         mutex_lock(&xfrm_cfg_mutex);
2350         netlink_rcv_skb(skb, &xfrm_user_rcv_msg);
2351         mutex_unlock(&xfrm_cfg_mutex);
2352 }
2353
2354 static inline size_t xfrm_expire_msgsize(void)
2355 {
2356         return NLMSG_ALIGN(sizeof(struct xfrm_user_expire))
2357                + nla_total_size(sizeof(struct xfrm_mark));
2358 }
2359
2360 static int build_expire(struct sk_buff *skb, struct xfrm_state *x, const struct km_event *c)
2361 {
2362         struct xfrm_user_expire *ue;
2363         struct nlmsghdr *nlh;
2364
2365         nlh = nlmsg_put(skb, c->pid, 0, XFRM_MSG_EXPIRE, sizeof(*ue), 0);
2366         if (nlh == NULL)
2367                 return -EMSGSIZE;
2368
2369         ue = nlmsg_data(nlh);
2370         copy_to_user_state(x, &ue->state);
2371         ue->hard = (c->data.hard != 0) ? 1 : 0;
2372
2373         if (xfrm_mark_put(skb, &x->mark))
2374                 goto nla_put_failure;
2375
2376         return nlmsg_end(skb, nlh);
2377
2378 nla_put_failure:
2379         return -EMSGSIZE;
2380 }
2381
2382 static int xfrm_exp_state_notify(struct xfrm_state *x, const struct km_event *c)
2383 {
2384         struct net *net = xs_net(x);
2385         struct sk_buff *skb;
2386
2387         skb = nlmsg_new(xfrm_expire_msgsize(), GFP_ATOMIC);
2388         if (skb == NULL)
2389                 return -ENOMEM;
2390
2391         if (build_expire(skb, x, c) < 0) {
2392                 kfree_skb(skb);
2393                 return -EMSGSIZE;
2394         }
2395
2396         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_EXPIRE, GFP_ATOMIC);
2397 }
2398
2399 static int xfrm_aevent_state_notify(struct xfrm_state *x, const struct km_event *c)
2400 {
2401         struct net *net = xs_net(x);
2402         struct sk_buff *skb;
2403
2404         skb = nlmsg_new(xfrm_aevent_msgsize(x), GFP_ATOMIC);
2405         if (skb == NULL)
2406                 return -ENOMEM;
2407
2408         if (build_aevent(skb, x, c) < 0)
2409                 BUG();
2410
2411         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_AEVENTS, GFP_ATOMIC);
2412 }
2413
2414 static int xfrm_notify_sa_flush(const struct km_event *c)
2415 {
2416         struct net *net = c->net;
2417         struct xfrm_usersa_flush *p;
2418         struct nlmsghdr *nlh;
2419         struct sk_buff *skb;
2420         int len = NLMSG_ALIGN(sizeof(struct xfrm_usersa_flush));
2421
2422         skb = nlmsg_new(len, GFP_ATOMIC);
2423         if (skb == NULL)
2424                 return -ENOMEM;
2425
2426         nlh = nlmsg_put(skb, c->pid, c->seq, XFRM_MSG_FLUSHSA, sizeof(*p), 0);
2427         if (nlh == NULL) {
2428                 kfree_skb(skb);
2429                 return -EMSGSIZE;
2430         }
2431
2432         p = nlmsg_data(nlh);
2433         p->proto = c->data.proto;
2434
2435         nlmsg_end(skb, nlh);
2436
2437         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_SA, GFP_ATOMIC);
2438 }
2439
2440 static inline size_t xfrm_sa_len(struct xfrm_state *x)
2441 {
2442         size_t l = 0;
2443         if (x->aead)
2444                 l += nla_total_size(aead_len(x->aead));
2445         if (x->aalg) {
2446                 l += nla_total_size(sizeof(struct xfrm_algo) +
2447                                     (x->aalg->alg_key_len + 7) / 8);
2448                 l += nla_total_size(xfrm_alg_auth_len(x->aalg));
2449         }
2450         if (x->ealg)
2451                 l += nla_total_size(xfrm_alg_len(x->ealg));
2452         if (x->calg)
2453                 l += nla_total_size(sizeof(*x->calg));
2454         if (x->encap)
2455                 l += nla_total_size(sizeof(*x->encap));
2456         if (x->tfcpad)
2457                 l += nla_total_size(sizeof(x->tfcpad));
2458         if (x->replay_esn)
2459                 l += nla_total_size(xfrm_replay_state_esn_len(x->replay_esn));
2460         if (x->security)
2461                 l += nla_total_size(sizeof(struct xfrm_user_sec_ctx) +
2462                                     x->security->ctx_len);
2463         if (x->coaddr)
2464                 l += nla_total_size(sizeof(*x->coaddr));
2465
2466         /* Must count x->lastused as it may become non-zero behind our back. */
2467         l += nla_total_size(sizeof(u64));
2468
2469         return l;
2470 }
2471
2472 static int xfrm_notify_sa(struct xfrm_state *x, const struct km_event *c)
2473 {
2474         struct net *net = xs_net(x);
2475         struct xfrm_usersa_info *p;
2476         struct xfrm_usersa_id *id;
2477         struct nlmsghdr *nlh;
2478         struct sk_buff *skb;
2479         int len = xfrm_sa_len(x);
2480         int headlen;
2481
2482         headlen = sizeof(*p);
2483         if (c->event == XFRM_MSG_DELSA) {
2484                 len += nla_total_size(headlen);
2485                 headlen = sizeof(*id);
2486                 len += nla_total_size(sizeof(struct xfrm_mark));
2487         }
2488         len += NLMSG_ALIGN(headlen);
2489
2490         skb = nlmsg_new(len, GFP_ATOMIC);
2491         if (skb == NULL)
2492                 return -ENOMEM;
2493
2494         nlh = nlmsg_put(skb, c->pid, c->seq, c->event, headlen, 0);
2495         if (nlh == NULL)
2496                 goto nla_put_failure;
2497
2498         p = nlmsg_data(nlh);
2499         if (c->event == XFRM_MSG_DELSA) {
2500                 struct nlattr *attr;
2501
2502                 id = nlmsg_data(nlh);
2503                 memcpy(&id->daddr, &x->id.daddr, sizeof(id->daddr));
2504                 id->spi = x->id.spi;
2505                 id->family = x->props.family;
2506                 id->proto = x->id.proto;
2507
2508                 attr = nla_reserve(skb, XFRMA_SA, sizeof(*p));
2509                 if (attr == NULL)
2510                         goto nla_put_failure;
2511
2512                 p = nla_data(attr);
2513         }
2514
2515         if (copy_to_user_state_extra(x, p, skb))
2516                 goto nla_put_failure;
2517
2518         nlmsg_end(skb, nlh);
2519
2520         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_SA, GFP_ATOMIC);
2521
2522 nla_put_failure:
2523         /* Somebody screwed up with xfrm_sa_len! */
2524         WARN_ON(1);
2525         kfree_skb(skb);
2526         return -1;
2527 }
2528
2529 static int xfrm_send_state_notify(struct xfrm_state *x, const struct km_event *c)
2530 {
2531
2532         switch (c->event) {
2533         case XFRM_MSG_EXPIRE:
2534                 return xfrm_exp_state_notify(x, c);
2535         case XFRM_MSG_NEWAE:
2536                 return xfrm_aevent_state_notify(x, c);
2537         case XFRM_MSG_DELSA:
2538         case XFRM_MSG_UPDSA:
2539         case XFRM_MSG_NEWSA:
2540                 return xfrm_notify_sa(x, c);
2541         case XFRM_MSG_FLUSHSA:
2542                 return xfrm_notify_sa_flush(c);
2543         default:
2544                 printk(KERN_NOTICE "xfrm_user: Unknown SA event %d\n",
2545                        c->event);
2546                 break;
2547         }
2548
2549         return 0;
2550
2551 }
2552
2553 static inline size_t xfrm_acquire_msgsize(struct xfrm_state *x,
2554                                           struct xfrm_policy *xp)
2555 {
2556         return NLMSG_ALIGN(sizeof(struct xfrm_user_acquire))
2557                + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
2558                + nla_total_size(sizeof(struct xfrm_mark))
2559                + nla_total_size(xfrm_user_sec_ctx_size(x->security))
2560                + userpolicy_type_attrsize();
2561 }
2562
2563 static int build_acquire(struct sk_buff *skb, struct xfrm_state *x,
2564                          struct xfrm_tmpl *xt, struct xfrm_policy *xp,
2565                          int dir)
2566 {
2567         struct xfrm_user_acquire *ua;
2568         struct nlmsghdr *nlh;
2569         __u32 seq = xfrm_get_acqseq();
2570
2571         nlh = nlmsg_put(skb, 0, 0, XFRM_MSG_ACQUIRE, sizeof(*ua), 0);
2572         if (nlh == NULL)
2573                 return -EMSGSIZE;
2574
2575         ua = nlmsg_data(nlh);
2576         memcpy(&ua->id, &x->id, sizeof(ua->id));
2577         memcpy(&ua->saddr, &x->props.saddr, sizeof(ua->saddr));
2578         memcpy(&ua->sel, &x->sel, sizeof(ua->sel));
2579         copy_to_user_policy(xp, &ua->policy, dir);
2580         ua->aalgos = xt->aalgos;
2581         ua->ealgos = xt->ealgos;
2582         ua->calgos = xt->calgos;
2583         ua->seq = x->km.seq = seq;
2584
2585         if (copy_to_user_tmpl(xp, skb) < 0)
2586                 goto nlmsg_failure;
2587         if (copy_to_user_state_sec_ctx(x, skb))
2588                 goto nlmsg_failure;
2589         if (copy_to_user_policy_type(xp->type, skb) < 0)
2590                 goto nlmsg_failure;
2591         if (xfrm_mark_put(skb, &xp->mark))
2592                 goto nla_put_failure;
2593
2594         return nlmsg_end(skb, nlh);
2595
2596 nla_put_failure:
2597 nlmsg_failure:
2598         nlmsg_cancel(skb, nlh);
2599         return -EMSGSIZE;
2600 }
2601
2602 static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt,
2603                              struct xfrm_policy *xp, int dir)
2604 {
2605         struct net *net = xs_net(x);
2606         struct sk_buff *skb;
2607
2608         skb = nlmsg_new(xfrm_acquire_msgsize(x, xp), GFP_ATOMIC);
2609         if (skb == NULL)
2610                 return -ENOMEM;
2611
2612         if (build_acquire(skb, x, xt, xp, dir) < 0)
2613                 BUG();
2614
2615         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_ACQUIRE, GFP_ATOMIC);
2616 }
2617
2618 /* User gives us xfrm_user_policy_info followed by an array of 0
2619  * or more templates.
2620  */
2621 static struct xfrm_policy *xfrm_compile_policy(struct sock *sk, int opt,
2622                                                u8 *data, int len, int *dir)
2623 {
2624         struct net *net = sock_net(sk);
2625         struct xfrm_userpolicy_info *p = (struct xfrm_userpolicy_info *)data;
2626         struct xfrm_user_tmpl *ut = (struct xfrm_user_tmpl *) (p + 1);
2627         struct xfrm_policy *xp;
2628         int nr;
2629
2630         switch (sk->sk_family) {
2631         case AF_INET:
2632                 if (opt != IP_XFRM_POLICY) {
2633                         *dir = -EOPNOTSUPP;
2634                         return NULL;
2635                 }
2636                 break;
2637 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2638         case AF_INET6:
2639                 if (opt != IPV6_XFRM_POLICY) {
2640                         *dir = -EOPNOTSUPP;
2641                         return NULL;
2642                 }
2643                 break;
2644 #endif
2645         default:
2646                 *dir = -EINVAL;
2647                 return NULL;
2648         }
2649
2650         *dir = -EINVAL;
2651
2652         if (len < sizeof(*p) ||
2653             verify_newpolicy_info(p))
2654                 return NULL;
2655
2656         nr = ((len - sizeof(*p)) / sizeof(*ut));
2657         if (validate_tmpl(nr, ut, p->sel.family))
2658                 return NULL;
2659
2660         if (p->dir > XFRM_POLICY_OUT)
2661                 return NULL;
2662
2663         xp = xfrm_policy_alloc(net, GFP_ATOMIC);
2664         if (xp == NULL) {
2665                 *dir = -ENOBUFS;
2666                 return NULL;
2667         }
2668
2669         copy_from_user_policy(xp, p);
2670         xp->type = XFRM_POLICY_TYPE_MAIN;
2671         copy_templates(xp, ut, nr);
2672
2673         *dir = p->dir;
2674
2675         return xp;
2676 }
2677
2678 static inline size_t xfrm_polexpire_msgsize(struct xfrm_policy *xp)
2679 {
2680         return NLMSG_ALIGN(sizeof(struct xfrm_user_polexpire))
2681                + nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr)
2682                + nla_total_size(xfrm_user_sec_ctx_size(xp->security))
2683                + nla_total_size(sizeof(struct xfrm_mark))
2684                + userpolicy_type_attrsize();
2685 }
2686
2687 static int build_polexpire(struct sk_buff *skb, struct xfrm_policy *xp,
2688                            int dir, const struct km_event *c)
2689 {
2690         struct xfrm_user_polexpire *upe;
2691         struct nlmsghdr *nlh;
2692         int hard = c->data.hard;
2693
2694         nlh = nlmsg_put(skb, c->pid, 0, XFRM_MSG_POLEXPIRE, sizeof(*upe), 0);
2695         if (nlh == NULL)
2696                 return -EMSGSIZE;
2697
2698         upe = nlmsg_data(nlh);
2699         copy_to_user_policy(xp, &upe->pol, dir);
2700         if (copy_to_user_tmpl(xp, skb) < 0)
2701                 goto nlmsg_failure;
2702         if (copy_to_user_sec_ctx(xp, skb))
2703                 goto nlmsg_failure;
2704         if (copy_to_user_policy_type(xp->type, skb) < 0)
2705                 goto nlmsg_failure;
2706         if (xfrm_mark_put(skb, &xp->mark))
2707                 goto nla_put_failure;
2708         upe->hard = !!hard;
2709
2710         return nlmsg_end(skb, nlh);
2711
2712 nla_put_failure:
2713 nlmsg_failure:
2714         nlmsg_cancel(skb, nlh);
2715         return -EMSGSIZE;
2716 }
2717
2718 static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
2719 {
2720         struct net *net = xp_net(xp);
2721         struct sk_buff *skb;
2722
2723         skb = nlmsg_new(xfrm_polexpire_msgsize(xp), GFP_ATOMIC);
2724         if (skb == NULL)
2725                 return -ENOMEM;
2726
2727         if (build_polexpire(skb, xp, dir, c) < 0)
2728                 BUG();
2729
2730         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_EXPIRE, GFP_ATOMIC);
2731 }
2732
2733 static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c)
2734 {
2735         struct net *net = xp_net(xp);
2736         struct xfrm_userpolicy_info *p;
2737         struct xfrm_userpolicy_id *id;
2738         struct nlmsghdr *nlh;
2739         struct sk_buff *skb;
2740         int len = nla_total_size(sizeof(struct xfrm_user_tmpl) * xp->xfrm_nr);
2741         int headlen;
2742
2743         headlen = sizeof(*p);
2744         if (c->event == XFRM_MSG_DELPOLICY) {
2745                 len += nla_total_size(headlen);
2746                 headlen = sizeof(*id);
2747         }
2748         len += userpolicy_type_attrsize();
2749         len += nla_total_size(sizeof(struct xfrm_mark));
2750         len += NLMSG_ALIGN(headlen);
2751
2752         skb = nlmsg_new(len, GFP_ATOMIC);
2753         if (skb == NULL)
2754                 return -ENOMEM;
2755
2756         nlh = nlmsg_put(skb, c->pid, c->seq, c->event, headlen, 0);
2757         if (nlh == NULL)
2758                 goto nlmsg_failure;
2759
2760         p = nlmsg_data(nlh);
2761         if (c->event == XFRM_MSG_DELPOLICY) {
2762                 struct nlattr *attr;
2763
2764                 id = nlmsg_data(nlh);
2765                 memset(id, 0, sizeof(*id));
2766                 id->dir = dir;
2767                 if (c->data.byid)
2768                         id->index = xp->index;
2769                 else
2770                         memcpy(&id->sel, &xp->selector, sizeof(id->sel));
2771
2772                 attr = nla_reserve(skb, XFRMA_POLICY, sizeof(*p));
2773                 if (attr == NULL)
2774                         goto nlmsg_failure;
2775
2776                 p = nla_data(attr);
2777         }
2778
2779         copy_to_user_policy(xp, p, dir);
2780         if (copy_to_user_tmpl(xp, skb) < 0)
2781                 goto nlmsg_failure;
2782         if (copy_to_user_policy_type(xp->type, skb) < 0)
2783                 goto nlmsg_failure;
2784
2785         if (xfrm_mark_put(skb, &xp->mark))
2786                 goto nla_put_failure;
2787
2788         nlmsg_end(skb, nlh);
2789
2790         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_POLICY, GFP_ATOMIC);
2791
2792 nla_put_failure:
2793 nlmsg_failure:
2794         kfree_skb(skb);
2795         return -1;
2796 }
2797
2798 static int xfrm_notify_policy_flush(const struct km_event *c)
2799 {
2800         struct net *net = c->net;
2801         struct nlmsghdr *nlh;
2802         struct sk_buff *skb;
2803
2804         skb = nlmsg_new(userpolicy_type_attrsize(), GFP_ATOMIC);
2805         if (skb == NULL)
2806                 return -ENOMEM;
2807
2808         nlh = nlmsg_put(skb, c->pid, c->seq, XFRM_MSG_FLUSHPOLICY, 0, 0);
2809         if (nlh == NULL)
2810                 goto nlmsg_failure;
2811         if (copy_to_user_policy_type(c->data.type, skb) < 0)
2812                 goto nlmsg_failure;
2813
2814         nlmsg_end(skb, nlh);
2815
2816         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_POLICY, GFP_ATOMIC);
2817
2818 nlmsg_failure:
2819         kfree_skb(skb);
2820         return -1;
2821 }
2822
2823 static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
2824 {
2825
2826         switch (c->event) {
2827         case XFRM_MSG_NEWPOLICY:
2828         case XFRM_MSG_UPDPOLICY:
2829         case XFRM_MSG_DELPOLICY:
2830                 return xfrm_notify_policy(xp, dir, c);
2831         case XFRM_MSG_FLUSHPOLICY:
2832                 return xfrm_notify_policy_flush(c);
2833         case XFRM_MSG_POLEXPIRE:
2834                 return xfrm_exp_policy_notify(xp, dir, c);
2835         default:
2836                 printk(KERN_NOTICE "xfrm_user: Unknown Policy event %d\n",
2837                        c->event);
2838         }
2839
2840         return 0;
2841
2842 }
2843
2844 static inline size_t xfrm_report_msgsize(void)
2845 {
2846         return NLMSG_ALIGN(sizeof(struct xfrm_user_report));
2847 }
2848
2849 static int build_report(struct sk_buff *skb, u8 proto,
2850                         struct xfrm_selector *sel, xfrm_address_t *addr)
2851 {
2852         struct xfrm_user_report *ur;
2853         struct nlmsghdr *nlh;
2854
2855         nlh = nlmsg_put(skb, 0, 0, XFRM_MSG_REPORT, sizeof(*ur), 0);
2856         if (nlh == NULL)
2857                 return -EMSGSIZE;
2858
2859         ur = nlmsg_data(nlh);
2860         ur->proto = proto;
2861         memcpy(&ur->sel, sel, sizeof(ur->sel));
2862
2863         if (addr)
2864                 NLA_PUT(skb, XFRMA_COADDR, sizeof(*addr), addr);
2865
2866         return nlmsg_end(skb, nlh);
2867
2868 nla_put_failure:
2869         nlmsg_cancel(skb, nlh);
2870         return -EMSGSIZE;
2871 }
2872
2873 static int xfrm_send_report(struct net *net, u8 proto,
2874                             struct xfrm_selector *sel, xfrm_address_t *addr)
2875 {
2876         struct sk_buff *skb;
2877
2878         skb = nlmsg_new(xfrm_report_msgsize(), GFP_ATOMIC);
2879         if (skb == NULL)
2880                 return -ENOMEM;
2881
2882         if (build_report(skb, proto, sel, addr) < 0)
2883                 BUG();
2884
2885         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_REPORT, GFP_ATOMIC);
2886 }
2887
2888 static inline size_t xfrm_mapping_msgsize(void)
2889 {
2890         return NLMSG_ALIGN(sizeof(struct xfrm_user_mapping));
2891 }
2892
2893 static int build_mapping(struct sk_buff *skb, struct xfrm_state *x,
2894                          xfrm_address_t *new_saddr, __be16 new_sport)
2895 {
2896         struct xfrm_user_mapping *um;
2897         struct nlmsghdr *nlh;
2898
2899         nlh = nlmsg_put(skb, 0, 0, XFRM_MSG_MAPPING, sizeof(*um), 0);
2900         if (nlh == NULL)
2901                 return -EMSGSIZE;
2902
2903         um = nlmsg_data(nlh);
2904
2905         memcpy(&um->id.daddr, &x->id.daddr, sizeof(um->id.daddr));
2906         um->id.spi = x->id.spi;
2907         um->id.family = x->props.family;
2908         um->id.proto = x->id.proto;
2909         memcpy(&um->new_saddr, new_saddr, sizeof(um->new_saddr));
2910         memcpy(&um->old_saddr, &x->props.saddr, sizeof(um->old_saddr));
2911         um->new_sport = new_sport;
2912         um->old_sport = x->encap->encap_sport;
2913         um->reqid = x->props.reqid;
2914
2915         return nlmsg_end(skb, nlh);
2916 }
2917
2918 static int xfrm_send_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
2919                              __be16 sport)
2920 {
2921         struct net *net = xs_net(x);
2922         struct sk_buff *skb;
2923
2924         if (x->id.proto != IPPROTO_ESP)
2925                 return -EINVAL;
2926
2927         if (!x->encap)
2928                 return -EINVAL;
2929
2930         skb = nlmsg_new(xfrm_mapping_msgsize(), GFP_ATOMIC);
2931         if (skb == NULL)
2932                 return -ENOMEM;
2933
2934         if (build_mapping(skb, x, ipaddr, sport) < 0)
2935                 BUG();
2936
2937         return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_MAPPING, GFP_ATOMIC);
2938 }
2939
2940 static struct xfrm_mgr netlink_mgr = {
2941         .id             = "netlink",
2942         .notify         = xfrm_send_state_notify,
2943         .acquire        = xfrm_send_acquire,
2944         .compile_policy = xfrm_compile_policy,
2945         .notify_policy  = xfrm_send_policy_notify,
2946         .report         = xfrm_send_report,
2947         .migrate        = xfrm_send_migrate,
2948         .new_mapping    = xfrm_send_mapping,
2949 };
2950
2951 static int __net_init xfrm_user_net_init(struct net *net)
2952 {
2953         struct sock *nlsk;
2954
2955         nlsk = netlink_kernel_create(net, NETLINK_XFRM, XFRMNLGRP_MAX,
2956                                      xfrm_netlink_rcv, NULL, THIS_MODULE);
2957         if (nlsk == NULL)
2958                 return -ENOMEM;
2959         net->xfrm.nlsk_stash = nlsk; /* Don't set to NULL */
2960         rcu_assign_pointer(net->xfrm.nlsk, nlsk);
2961         return 0;
2962 }
2963
2964 static void __net_exit xfrm_user_net_exit(struct list_head *net_exit_list)
2965 {
2966         struct net *net;
2967         list_for_each_entry(net, net_exit_list, exit_list)
2968                 RCU_INIT_POINTER(net->xfrm.nlsk, NULL);
2969         synchronize_net();
2970         list_for_each_entry(net, net_exit_list, exit_list)
2971                 netlink_kernel_release(net->xfrm.nlsk_stash);
2972 }
2973
2974 static struct pernet_operations xfrm_user_net_ops = {
2975         .init       = xfrm_user_net_init,
2976         .exit_batch = xfrm_user_net_exit,
2977 };
2978
2979 static int __init xfrm_user_init(void)
2980 {
2981         int rv;
2982
2983         printk(KERN_INFO "Initializing XFRM netlink socket\n");
2984
2985         rv = register_pernet_subsys(&xfrm_user_net_ops);
2986         if (rv < 0)
2987                 return rv;
2988         rv = xfrm_register_km(&netlink_mgr);
2989         if (rv < 0)
2990                 unregister_pernet_subsys(&xfrm_user_net_ops);
2991         return rv;
2992 }
2993
2994 static void __exit xfrm_user_exit(void)
2995 {
2996         xfrm_unregister_km(&netlink_mgr);
2997         unregister_pernet_subsys(&xfrm_user_net_ops);
2998 }
2999
3000 module_init(xfrm_user_init);
3001 module_exit(xfrm_user_exit);
3002 MODULE_LICENSE("GPL");
3003 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_XFRM);
3004