[PATCH 1/1] Make xdrproc_t non-variadic

Khem Raj raj.khem at gmail.com
Fri Jun 18 20:02:47 UTC 2010


On Fri, Jun 18, 2010 at 4:47 AM, Jonas Bonn <jonas at southpole.se> wrote:
> 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.

yes this is a problem and though your fix sounds fine to me. I know
not much about rpc
this code is similar to glibc. Do you also see the problem with glibc
(if you have a port for it)

-Khem

> 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
>
>
>
>
>
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc
>


More information about the uClibc mailing list