Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[sfrench/cifs-2.6.git] / net / ipv4 / udp.c
index f49e14cd3891792ebe358819b20f73230fbbae78..24b5c59b1c533a9793042c134f23891953527752 100644 (file)
@@ -1658,6 +1658,19 @@ csum_copy_err:
        goto try_again;
 }
 
+int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+{
+       /* This check is replicated from __ip4_datagram_connect() and
+        * intended to prevent BPF program called below from accessing bytes
+        * that are out of the bound specified by user in addr_len.
+        */
+       if (addr_len < sizeof(struct sockaddr_in))
+               return -EINVAL;
+
+       return BPF_CGROUP_RUN_PROG_INET4_CONNECT_LOCK(sk, uaddr);
+}
+EXPORT_SYMBOL(udp_pre_connect);
+
 int __udp_disconnect(struct sock *sk, int flags)
 {
        struct inet_sock *inet = inet_sk(sk);
@@ -2530,6 +2543,7 @@ struct proto udp_prot = {
        .name                   = "UDP",
        .owner                  = THIS_MODULE,
        .close                  = udp_lib_close,
+       .pre_connect            = udp_pre_connect,
        .connect                = ip4_datagram_connect,
        .disconnect             = udp_disconnect,
        .ioctl                  = udp_ioctl,