lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Fri, 8 Dec 2006 13:07:37 -0500
From:	"Chuck Lever" <chucklever@...il.com>
To:	"Trond Myklebust" <trond.myklebust@....uio.no>
Cc:	NeilBrown <neilb@...e.de>, "Andrew Morton" <akpm@...l.org>,
	nfs@...ts.sourceforge.net, linux-kernel@...r.kernel.org
Subject: Re: [NFS] [PATCH 002 of 13] knfsd: SUNRPC: allow creating an RPC service without registering with portmapper

Oops.  This one looks old.  Let me see if I can dig up the latest.

On 12/8/06, Trond Myklebust <trond.myklebust@....uio.no> wrote:
> On Fri, 2006-12-08 at 23:01 +1100, NeilBrown wrote:
> > From: Chuck Lever <chuck.lever@...cle.com>
> > Sometimes we need to create an RPC service but not register it with the
> > local portmapper.  NFSv4 delegation callback, for example.
> >
> > Change the svc_makesock() API to allow optionally creating temporary or
> > permanent sockets, optionally registering with the local portmapper, and
> > make it return the ephemeral port of the new socket.
>
> NAK. This one is still buggy.
>
> The NFSv4 callback server should _NOT_ be registering its listening
> socket on the RPC server 'temporary' list.
>
> Trond
>
>
> > Signed-off-by: Chuck Lever <chuck.lever@...cle.com>
> > Cc: Aurelien Charbon <aurelien.charbon@....bull.net>
> > Signed-off-by: Neil Brown <neilb@...e.de>
> >
> > ### Diffstat output
> >  ./fs/lockd/svc.c                 |   26 ++++++++++++++++----------
> >  ./fs/nfs/callback.c              |   20 +++++++++-----------
> >  ./fs/nfsd/nfssvc.c               |    6 ++++--
> >  ./include/linux/sunrpc/svcsock.h |    2 +-
> >  ./net/sunrpc/svcsock.c           |    6 ++++--
> >  5 files changed, 34 insertions(+), 26 deletions(-)
> >
> > diff .prev/fs/lockd/svc.c ./fs/lockd/svc.c
> > --- .prev/fs/lockd/svc.c      2006-12-08 13:36:33.000000000 +1100
> > +++ ./fs/lockd/svc.c  2006-12-08 13:36:33.000000000 +1100
> > @@ -223,23 +223,29 @@ static int find_socket(struct svc_serv *
> >       return found;
> >  }
> >
> > +/*
> > + * Make any sockets that are needed but not present.
> > + * If nlm_udpport or nlm_tcpport were set as module
> > + * options, make those sockets unconditionally
> > + */
> >  static int make_socks(struct svc_serv *serv, int proto)
> >  {
> > -     /* Make any sockets that are needed but not present.
> > -      * If nlm_udpport or nlm_tcpport were set as module
> > -      * options, make those sockets unconditionally
> > -      */
> > -     static int              warned;
> > +     static int warned;
> >       int err = 0;
> > +
> >       if (proto == IPPROTO_UDP || nlm_udpport)
> >               if (!find_socket(serv, IPPROTO_UDP))
> > -                     err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport);
> > -     if (err == 0 && (proto == IPPROTO_TCP || nlm_tcpport))
> > +                     err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport,
> > +                                             SVC_SOCK_DEFAULTS);
> > +     if (err >= 0 && (proto == IPPROTO_TCP || nlm_tcpport))
> >               if (!find_socket(serv, IPPROTO_TCP))
> > -                     err= svc_makesock(serv, IPPROTO_TCP, nlm_tcpport);
> > -     if (!err)
> > +                     err = svc_makesock(serv, IPPROTO_TCP, nlm_tcpport,
> > +                                             SVC_SOCK_DEFAULTS);
> > +
> > +     if (err >= 0) {
> >               warned = 0;
> > -     else if (warned++ == 0)
> > +             err = 0;
> > +     } else if (warned++ == 0)
> >               printk(KERN_WARNING
> >                      "lockd_up: makesock failed, error=%d\n", err);
> >       return err;
> >
> > diff .prev/fs/nfs/callback.c ./fs/nfs/callback.c
> > --- .prev/fs/nfs/callback.c   2006-12-08 13:36:33.000000000 +1100
> > +++ ./fs/nfs/callback.c       2006-12-08 13:36:33.000000000 +1100
> > @@ -106,7 +106,6 @@ static void nfs_callback_svc(struct svc_
> >  int nfs_callback_up(void)
> >  {
> >       struct svc_serv *serv;
> > -     struct svc_sock *svsk;
> >       int ret = 0;
> >
> >       lock_kernel();
> > @@ -119,17 +118,14 @@ int nfs_callback_up(void)
> >       ret = -ENOMEM;
> >       if (!serv)
> >               goto out_err;
> > -     /* FIXME: We don't want to register this socket with the portmapper */
> > -     ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport);
> > -     if (ret < 0)
> > +
> > +     ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport,
> > +                             (SVC_SOCK_ANONYMOUS | SVC_SOCK_TEMPORARY));
> > +     if (ret <= 0)
> >               goto out_destroy;
> > -     if (!list_empty(&serv->sv_permsocks)) {
> > -             svsk = list_entry(serv->sv_permsocks.next,
> > -                             struct svc_sock, sk_list);
> > -             nfs_callback_tcpport = ntohs(inet_sk(svsk->sk_sk)->sport);
> > -             dprintk ("Callback port = 0x%x\n", nfs_callback_tcpport);
> > -     } else
> > -             BUG();
> > +     nfs_callback_tcpport = ret;
> > +     dprintk("Callback port = 0x%x\n", nfs_callback_tcpport);
> > +
> >       ret = svc_create_thread(nfs_callback_svc, serv);
> >       if (ret < 0)
> >               goto out_destroy;
> > @@ -140,6 +136,8 @@ out:
> >       unlock_kernel();
> >       return ret;
> >  out_destroy:
> > +     dprintk("Couldn't create callback socket or server thread; err = %d\n",
> > +             ret);
> >       svc_destroy(serv);
> >  out_err:
> >       nfs_callback_info.users--;
> >
> > diff .prev/fs/nfsd/nfssvc.c ./fs/nfsd/nfssvc.c
> > --- .prev/fs/nfsd/nfssvc.c    2006-12-08 13:36:33.000000000 +1100
> > +++ ./fs/nfsd/nfssvc.c        2006-12-08 13:36:33.000000000 +1100
> > @@ -235,7 +235,8 @@ static int nfsd_init_socks(int port)
> >
> >       error = lockd_up(IPPROTO_UDP);
> >       if (error >= 0) {
> > -             error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
> > +             error = svc_makesock(nfsd_serv, IPPROTO_UDP, port,
> > +                                     SVC_SOCK_DEFAULTS);
> >               if (error < 0)
> >                       lockd_down();
> >       }
> > @@ -245,7 +246,8 @@ static int nfsd_init_socks(int port)
> >  #ifdef CONFIG_NFSD_TCP
> >       error = lockd_up(IPPROTO_TCP);
> >       if (error >= 0) {
> > -             error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
> > +             error = svc_makesock(nfsd_serv, IPPROTO_TCP, port,
> > +                                     SVC_SOCK_DEFAULTS);
> >               if (error < 0)
> >                       lockd_down();
> >       }
> >
> > diff .prev/include/linux/sunrpc/svcsock.h ./include/linux/sunrpc/svcsock.h
> > --- .prev/include/linux/sunrpc/svcsock.h      2006-12-08 13:35:43.000000000 +1100
> > +++ ./include/linux/sunrpc/svcsock.h  2006-12-08 13:36:33.000000000 +1100
> > @@ -62,7 +62,7 @@ struct svc_sock {
> >  /*
> >   * Function prototypes.
> >   */
> > -int          svc_makesock(struct svc_serv *, int, unsigned short);
> > +int          svc_makesock(struct svc_serv *, int, unsigned short, int flags);
> >  void         svc_delete_socket(struct svc_sock *);
> >  int          svc_recv(struct svc_rqst *, long);
> >  int          svc_send(struct svc_rqst *);
> >
> > diff .prev/net/sunrpc/svcsock.c ./net/sunrpc/svcsock.c
> > --- .prev/net/sunrpc/svcsock.c        2006-12-08 13:35:43.000000000 +1100
> > +++ ./net/sunrpc/svcsock.c    2006-12-08 13:36:33.000000000 +1100
> > @@ -1659,9 +1659,11 @@ svc_delete_socket(struct svc_sock *svsk)
> >   * @serv: RPC server structure
> >   * @protocol: transport protocol to use
> >   * @port: port to use
> > + * @flags: requested socket characteristics
> >   *
> >   */
> > -int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port)
> > +int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port,
> > +                     int flags)
> >  {
> >       struct sockaddr_in sin = {
> >               .sin_family             = AF_INET,
> > @@ -1670,7 +1672,7 @@ int svc_makesock(struct svc_serv *serv,
> >       };
> >
> >       dprintk("svc: creating socket proto = %d\n", protocol);
> > -     return svc_create_socket(serv, protocol, &sin, SVC_SOCK_DEFAULTS);
> > +     return svc_create_socket(serv, protocol, &sin, flags);
> >  }
> >
> >  /*
> >
> > -------------------------------------------------------------------------
> > Take Surveys. Earn Cash. Influence the Future of IT
> > Join SourceForge.net's Techsay panel and you'll get the chance to share your
> > opinions on IT & business topics through brief surveys - and earn cash
> > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> > _______________________________________________
> > NFS maillist  -  NFS@...ts.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/nfs
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> NFS maillist  -  NFS@...ts.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/nfs
>


-- 
"We who cut mere stones must always be envisioning cathedrals"
   -- Quarry worker's creed
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ