net/ipv4/ip_sockglue.c

  1.  int ip_getsockopt(struct sock *sk, int level,
  2.   int optname, char __user *optval, int __user *optlen)
  3.  {
  4.   int err;
  5.  
  6.   err = do_ip_getsockopt(sk, level, optname, optval, optlen);
  7.  #ifdef CONFIG_NETFILTER
  8.   /* we need to exclude all possible ENOPROTOOPTs except default case */
  9.   if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS &&
  10.   !ip_mroute_opt(optname)) {
  11.   int len;
  12.  
  13.   if (get_user(len,optlen))
  14.   return -EFAULT;
  15.  
  16.   lock_sock(sk);
  17.   err = nf_getsockopt(sk, PF_INET, optname, optval,
  18.   &len);
  19.   release_sock(sk);
  20.   if (err >= 0)
  21.   err = put_user(len, optlen);
  22.   return err;
  23.   }
  24.  #endif
  25.   return err;
  26.  }