[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