• Guillaume Nault's avatar
    pptp: Fix fib lookup calls. · 84bef5b6
    Guillaume Nault authored
    PPTP uses pppox sockets (struct pppox_sock). These sockets don't embed
    an inet_sock structure, so it's invalid to call inet_sk() on them.
    
    Therefore, the ip_route_output_ports() call in pptp_connect() has two
    problems:
    
      * The tos variable is set with RT_CONN_FLAGS(sk), which calls
        inet_sk() on the pppox socket.
    
      * ip_route_output_ports() tries to retrieve routing flags using
        inet_sk_flowi_flags(), which is also going to call inet_sk() on the
        pppox socket.
    
    While PPTP doesn't use inet sockets, it's actually really layered on
    top of IP and therefore needs a proper way to do fib lookups. So let's
    define pptp_route_output() to get a struct rtable from a pptp socket.
    Let's also replace the ip_route_output_ports() call of pptp_xmit() for
    consistency.
    
    In practice, this means that:
    
      * pptp_connect() sets ->flowi4_tos and ->flowi4_flags to zero instead
        of using bits of unrelated struct pppox_sock fields.
    
      * pptp_xmit() now respects ->sk_mark and ->sk_uid.
    
      * pptp_xmit() now calls the security_sk_classify_flow() security
        hook, thus allowing to set ->flowic_secid.
    
      * pptp_xmit() now passes the pppox socket to xfrm_lookup_route().
    
    Found by code inspection.
    
    Fixes: 00959ade
    
     ("PPTP: PPP over IPv4 (Point-to-Point Tunneling Protocol)")
    Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    84bef5b6
pptp.c 15.7 KB