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 <[email protected]>
> ---
>  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
[email protected]               www.southpoleconsulting.com




Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to