Re: proposed patch to rpcbind to provide finer-grained security controls than offered by the -i option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Dec 10, 2010, at 4:57 PM, Andrew J. Schorr wrote:

> Adding CC libtirpc-devel@xxxxxxxxxxxxxxx:
> 
> On Fri, Dec 10, 2010 at 12:14:47PM -0500, Chuck Lever wrote:
>> The libtirpc legacy API should be the same as the glibc RPC API.  If you spot any truly non-ABI compatible changes, or have any other related questions, please let us know.  (we should probably cc libtirpc-devel@xxxxxxxxxxxxxxx).
>> 
> 
> I have not inspected closely yet, but did notice that the XDR structure
> has changed.  In /usr/include/rpc/xdr.h, there is this:
> 
> struct XDR
>  {
>    enum xdr_op x_op;           /* operation; fast additional param */
>    struct xdr_ops
>      {
>        bool_t (*x_getlong) (XDR *__xdrs, long *__lp);
>        /* get a long from underlying stream */
>        bool_t (*x_putlong) (XDR *__xdrs, __const long *__lp);
>        /* put a long to " */
>        bool_t (*x_getbytes) (XDR *__xdrs, caddr_t __addr, u_int __len);
>        /* get some bytes from " */
>        bool_t (*x_putbytes) (XDR *__xdrs, __const char *__addr, u_int __len);
>        /* put some bytes to " */
>        u_int (*x_getpostn) (__const XDR *__xdrs);
>        /* returns bytes off from beginning */
>        bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos);
>        /* lets you reposition the stream */
>        int32_t *(*x_inline) (XDR *__xdrs, u_int __len);
>        /* buf quick ptr to buffered data */
>        void (*x_destroy) (XDR *__xdrs);
>        /* free privates of this xdr_stream */
>        bool_t (*x_getint32) (XDR *__xdrs, int32_t *__ip);
>        /* get a int from underlying stream */
>        bool_t (*x_putint32) (XDR *__xdrs, __const int32_t *__ip);
>        /* put a int to " */
>      }
>     *x_ops;
>    caddr_t x_public;           /* users' data */
>    caddr_t x_private;          /* pointer to private data */
>    caddr_t x_base;             /* private used for position info */
>    u_int x_handy;              /* extra private word */
>  };
> 
> Whereas the new tirpc/rpc/xdr.h has this:
> 
> typedef struct __rpc_xdr {
>        enum xdr_op     x_op;           /* operation; fast additional param */
>        const struct xdr_ops {
>                /* get a long from underlying stream */
>                bool_t  (*x_getlong)(struct __rpc_xdr *, long *);
>                /* put a long to " */
>                bool_t  (*x_putlong)(struct __rpc_xdr *, const long *);
>                /* get some bytes from " */
>                bool_t  (*x_getbytes)(struct __rpc_xdr *, char *, u_int);
>                /* put some bytes to " */
>                bool_t  (*x_putbytes)(struct __rpc_xdr *, const char *, u_int);
>                /* returns bytes off from beginning */
>                u_int   (*x_getpostn)(struct __rpc_xdr *);
>                /* lets you reposition the stream */
>                bool_t  (*x_setpostn)(struct __rpc_xdr *, u_int);
>                /* buf quick ptr to buffered data */
>                int32_t *(*x_inline)(struct __rpc_xdr *, u_int);
>                /* free privates of this xdr_stream */
>                void    (*x_destroy)(struct __rpc_xdr *);
>                bool_t  (*x_control)(struct __rpc_xdr *, int, void *);
>        } *x_ops;
>        char *          x_public;       /* users' data */
>        void *          x_private;      /* pointer to private data */
>        char *          x_base;         /* private used for position info */
>        u_int           x_handy;        /* extra private word */
> } XDR;
> 
> 
> As you can see, the structure has changed (some methods added and others
> removed).  As a result, my code to implement a new XDR type no longer compiles,
> and will require porting (which presumably will not be major).
> 
> So I claim that tirpc is not fully ABI compatible with the legacy RPC
> implementation.

Thanks for the report.  We are aware of a handful of other minor instances, so it is true that there is not full ABI compatibility.  For most RPC applications of sufficient complexity, the differences are not significant.  At a guess, the use of RPCL and rpcgen to construct your XDR type might be helpful for avoiding this problem.

The XDR struct is not part of the published RPC API, is it?  See Sun doc 816-1435.

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux