[PATCH 1/1] Make xdrproc_t non-variadic

Jonas Bonn jonas at southpole.se
Fri Jun 18 11:47:38 UTC 2010


Hi,
Has anyone been able to consider this...  This is a real issue for us
working with the OR32 (OpenRisc) toolchain, so comment on the approach
and/or problem itself would be appreciated.  Sorry for the noise, but I
don't want this to get lost.
Regards,
Jonas

On Wed, 2010-06-09 at 12:07 +0200, Jonas Bonn wrote:
> Casting a non-variadic function to a variadic type is not permitted in C and
> results in undefined behaviour.  Although it may work for some architectures,
> on the OR32 architecture (and for others, from what I can find through Google),
> the parameters are passed differently depending on whether the function is
> declared varidic or not, thus casting between the two types results in
> failure.
> 
> Specifically, the following is not permitted:
> 
> /* Define non-variadic function */
> int foo(int x, int y) {
> 	...
> }
> 
> typedef int (*bar_t)(int x, int y, ...);
> 
> void f() {
> 	int x,y;
> 	bar_t bar;
> 
> 	/* Cast foo to variadic type... not allowed */
> 	bar = (bar_t) foo;
> 	(*bar)(x,y);
> }
> 
> This patch redeclares the xdrproc_t to be non-variadic.  None of the functions
> that are cast to xdrproc_t in uClibc are actually variadic; this applies to
> Busybox, as well.
> 
> Signed-off-by: Jonas Bonn <jonas at southpole.se>
> ---
>  include/rpc/xdr.h             |    2 +-
>  libc/inet/rpc/xdr.c           |    4 ++--
>  libc/inet/rpc/xdr_array.c     |    4 ++--
>  libc/inet/rpc/xdr_reference.c |    2 +-
>  4 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/include/rpc/xdr.h b/include/rpc/xdr.h
> index 9981e3a..4b663d7 100644
> --- a/include/rpc/xdr.h
> +++ b/include/rpc/xdr.h
> @@ -159,7 +159,7 @@ struct XDR
>   * allocate dynamic storage of the appropriate size and return it.
>   * bool_t       (*xdrproc_t)(XDR *, caddr_t *);
>   */
> -typedef bool_t (*xdrproc_t) (XDR *, void *,...);
> +typedef bool_t (*xdrproc_t) (XDR *, void *);
>  
> 
>  /*
> diff --git a/libc/inet/rpc/xdr.c b/libc/inet/rpc/xdr.c
> index 78f4d04..5aec83e 100644
> --- a/libc/inet/rpc/xdr.c
> +++ b/libc/inet/rpc/xdr.c
> @@ -633,14 +633,14 @@ xdr_union (XDR *xdrs, enum_t *dscmp, char *unp, const struct xdr_discrim *choice
>    for (; choices->proc != NULL_xdrproc_t; choices++)
>      {
>        if (choices->value == dscm)
> -	return (*(choices->proc)) (xdrs, unp, LASTUNSIGNED);
> +	return (*(choices->proc)) (xdrs, unp);
>      }
>  
>    /*
>     * no match - execute the default xdr routine if there is one
>     */
>    return ((dfault == NULL_xdrproc_t) ? FALSE :
> -	  (*dfault) (xdrs, unp, LASTUNSIGNED));
> +	  (*dfault) (xdrs, unp));
>  }
>  libc_hidden_def(xdr_union)
>  
> diff --git a/libc/inet/rpc/xdr_array.c b/libc/inet/rpc/xdr_array.c
> index bb3e51e..a80e11c 100644
> --- a/libc/inet/rpc/xdr_array.c
> +++ b/libc/inet/rpc/xdr_array.c
> @@ -125,7 +125,7 @@ xdr_array (XDR *xdrs, caddr_t *addrp, u_int *sizep, u_int maxsize, u_int elsize,
>     */
>    for (i = 0; (i < c) && stat; i++)
>      {
> -      stat = (*elproc) (xdrs, target, LASTUNSIGNED);
> +      stat = (*elproc) (xdrs, target);
>        target += elsize;
>      }
>  
> @@ -165,7 +165,7 @@ xdr_vector (xdrs, basep, nelem, elemsize, xdr_elem)
>    elptr = basep;
>    for (i = 0; i < nelem; i++)
>      {
> -      if (!(*xdr_elem) (xdrs, elptr, LASTUNSIGNED))
> +      if (!(*xdr_elem) (xdrs, elptr))
>  	{
>  	  return FALSE;
>  	}
> diff --git a/libc/inet/rpc/xdr_reference.c b/libc/inet/rpc/xdr_reference.c
> index 937b0cc..9ef0eb4 100644
> --- a/libc/inet/rpc/xdr_reference.c
> +++ b/libc/inet/rpc/xdr_reference.c
> @@ -97,7 +97,7 @@ xdr_reference (XDR *xdrs, caddr_t *pp, u_int size, xdrproc_t proc)
>  	break;
>        }
>  
> -  stat = (*proc) (xdrs, loc, LASTUNSIGNED);
> +  stat = (*proc) (xdrs, loc);
>  
>    if (xdrs->x_op == XDR_FREE)
>      {

-- 
Jonas Bonn                       South Pole AB
Phone : +46-8-56237100           Anderstorpsvägen 16
Mobile: +46-768-527755           SE-17154 Solna
jonas at southpole.se               www.southpoleconsulting.com




-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://lists.busybox.net/pipermail/uclibc/attachments/20100618/fc08d192/attachment-0001.pgp>


More information about the uClibc mailing list