[PATCH] librpc: Fix for short enums

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Apr 23 13:30:42 UTC 2012


On 04/23/2012 02:58 PM, Gedare Bloom wrote:
> Ugly. Fix seems OK but hackish.
>
> Any chance to fix it upstream?

Who is the upstream?  I got no response on the FreeBSD list:

http://lists.freebsd.org/pipermail/freebsd-hackers/2012-April/038498.html

> -Gedare
>
> On Mon, Apr 23, 2012 at 8:51 AM,<sebastian.huber at embedded-brains.de>  wrote:
>> From: Sebastian Huber<sebastian.huber at embedded-brains.de>
>>
>> The XDR library has a problem on architectures with short enums like the
>> default ARM EABI.  Short enums means that the size of the enum type is
>> variable and the smallest integer type to hold all enum values will be
>> selected.  For many enums this is char.  The XDR library uses int32_t
>> for enum_t.  There are several evil casts from an enum type to enum_t
>> which leads to invalid memory accesses on short enum architectures.  A
>> workaround is to add appropriate dummy enum values.
>> ---
>>   cpukit/librpc/include/rpc/auth.h       |    3 ++-
>>   cpukit/librpc/include/rpc/clnt_stat.h  |    3 ++-
>>   cpukit/librpc/include/rpc/rpc_msg.h    |   12 ++++++++----
>>   cpukit/librpc/include/rpc/svc.h        |    3 ++-
>>   cpukit/librpc/include/rpc/xdr.h        |    3 ++-
>>   cpukit/librpc/include/rpcsvc/nis_db.h  |    6 ++++--
>>   cpukit/librpc/include/rpcsvc/yp_prot.h |    3 ++-
>>   cpukit/librpc/src/xdr/xdr.c            |    8 +++-----
>>   8 files changed, 25 insertions(+), 16 deletions(-)
>>
>> diff --git a/cpukit/librpc/include/rpc/auth.h b/cpukit/librpc/include/rpc/auth.h
>> index 1b4367c..13432bd 100644
>> --- a/cpukit/librpc/include/rpc/auth.h
>> +++ b/cpukit/librpc/include/rpc/auth.h
>> @@ -67,7 +67,8 @@ enum auth_stat {
>>          * failed locally
>>         */
>>         AUTH_INVALIDRESP=6,             /* bogus response verifier */
>> -       AUTH_FAILED=7                   /* some unknown reason */
>> +       AUTH_FAILED=7,                  /* some unknown reason */
>> +       _AUTH_STAT = 0xffffffff
>>   };
>>
>>   union des_block {
>> diff --git a/cpukit/librpc/include/rpc/clnt_stat.h b/cpukit/librpc/include/rpc/clnt_stat.h
>> index 397bdbc..2c68745 100644
>> --- a/cpukit/librpc/include/rpc/clnt_stat.h
>> +++ b/cpukit/librpc/include/rpc/clnt_stat.h
>> @@ -73,7 +73,8 @@ enum clnt_stat {
>>         RPC_STALERACHANDLE = 25,
>>         RPC_CANTCONNECT = 26,           /* couldn't make connection (cots) */
>>         RPC_XPRTFAILED = 27,            /* received discon from remote (cots) */
>> -       RPC_CANTCREATESTREAM = 28       /* can't push rpc module (cots) */
>> +       RPC_CANTCREATESTREAM = 28,      /* can't push rpc module (cots) */
>> +       _CLNT_STAT = 0xffffffff
>>   };
>>
>>   #ifdef __cplusplus
>> diff --git a/cpukit/librpc/include/rpc/rpc_msg.h b/cpukit/librpc/include/rpc/rpc_msg.h
>> index 85d2c70..3f5fa51 100644
>> --- a/cpukit/librpc/include/rpc/rpc_msg.h
>> +++ b/cpukit/librpc/include/rpc/rpc_msg.h
>> @@ -62,12 +62,14 @@ struct rpc_err; /* forward */
>>
>>   enum msg_type {
>>         CALL=0,
>> -       REPLY=1
>> +       REPLY=1,
>> +       _MSG_TYPE = 0xffffffff
>>   };
>>
>>   enum reply_stat {
>>         MSG_ACCEPTED=0,
>> -       MSG_DENIED=1
>> +       MSG_DENIED=1,
>> +       _REPLY_STAT = 0xffffffff
>>   };
>>
>>   enum accept_stat {
>> @@ -76,12 +78,14 @@ enum accept_stat {
>>         PROG_MISMATCH=2,
>>         PROC_UNAVAIL=3,
>>         GARBAGE_ARGS=4,
>> -       SYSTEM_ERR=5
>> +       SYSTEM_ERR=5,
>> +       _ACCEPT_STAT = 0xffffffff
>>   };
>>
>>   enum reject_stat {
>>         RPC_MISMATCH=0,
>> -       AUTH_ERROR=1
>> +       AUTH_ERROR=1,
>> +       _REJECT_STAT = 0xffffffff
>>   };
>>
>>   /*
>> diff --git a/cpukit/librpc/include/rpc/svc.h b/cpukit/librpc/include/rpc/svc.h
>> index 969d2c5..0ef3b8c 100644
>> --- a/cpukit/librpc/include/rpc/svc.h
>> +++ b/cpukit/librpc/include/rpc/svc.h
>> @@ -72,7 +72,8 @@
>>   enum xprt_stat {
>>         XPRT_DIED,
>>         XPRT_MOREREQS,
>> -       XPRT_IDLE
>> +       XPRT_IDLE,
>> +       _XPRT_STAT = 0xffffffff
>>   };
>>
>>   struct rpc_msg;
>> diff --git a/cpukit/librpc/include/rpc/xdr.h b/cpukit/librpc/include/rpc/xdr.h
>> index 30f2bcc..bcdf399 100644
>> --- a/cpukit/librpc/include/rpc/xdr.h
>> +++ b/cpukit/librpc/include/rpc/xdr.h
>> @@ -84,7 +84,8 @@
>>   enum xdr_op {
>>         XDR_ENCODE=0,
>>         XDR_DECODE=1,
>> -       XDR_FREE=2
>> +       XDR_FREE=2,
>> +       _XDR_OP = 0xffffffff
>>   };
>>
>>   /*
>> diff --git a/cpukit/librpc/include/rpcsvc/nis_db.h b/cpukit/librpc/include/rpcsvc/nis_db.h
>> index dbdee5a..71785b0 100644
>> --- a/cpukit/librpc/include/rpcsvc/nis_db.h
>> +++ b/cpukit/librpc/include/rpcsvc/nis_db.h
>> @@ -69,7 +69,8 @@ enum db_status {
>>         DB_BADOBJECT = 5,
>>         DB_MEMORY_LIMIT = 6,
>>         DB_STORAGE_LIMIT = 7,
>> -       DB_INTERNAL_ERROR = 8
>> +       DB_INTERNAL_ERROR = 8,
>> +       _DB_STATUS = 0xffffffff
>>   };
>>   typedef enum db_status db_status;
>>
>> @@ -80,7 +81,8 @@ enum db_action {
>>         DB_FIRST = 3,
>>         DB_NEXT = 4,
>>         DB_ALL = 5,
>> -       DB_RESET_NEXT = 6
>> +       DB_RESET_NEXT = 6,
>> +       _DB_ACTION = 0xffffffff
>>   };
>>   typedef enum db_action db_action;
>>
>> diff --git a/cpukit/librpc/include/rpcsvc/yp_prot.h b/cpukit/librpc/include/rpcsvc/yp_prot.h
>> index 5abe0e2..f29f3ce 100644
>> --- a/cpukit/librpc/include/rpcsvc/yp_prot.h
>> +++ b/cpukit/librpc/include/rpcsvc/yp_prot.h
>> @@ -233,7 +233,8 @@ struct dom_binding {
>>   /* error code in ypbind_resp.ypbind_status */
>>   enum ypbind_resptype {
>>         YPBIND_SUCC_VAL = 1,
>> -       YPBIND_FAIL_VAL = 2
>> +       YPBIND_FAIL_VAL = 2,
>> +       _YPBIND_RESPTYPE = 0xffffffff
>>   };
>>
>>   /* network order, of course */
>> diff --git a/cpukit/librpc/src/xdr/xdr.c b/cpukit/librpc/src/xdr/xdr.c
>> index 02631e6..80c29bb 100644
>> --- a/cpukit/librpc/src/xdr/xdr.c
>> +++ b/cpukit/librpc/src/xdr/xdr.c
>> @@ -458,16 +458,14 @@ xdr_enum(
>>         enum_t *ep)
>>   {
>>   #ifndef lint
>> -       enum sizecheck { SIZEVAL };     /* used to find the size of an enum */
>> -
>>         /*
>>          * enums are treated as ints
>>          */
>> -       if (sizeof (enum sizecheck) == sizeof (long)) {
>> +       if (sizeof (enum_t) == sizeof (long)) {
>>                 return (xdr_long(xdrs, (long *)ep));
>> -       } else if (sizeof (enum sizecheck) == sizeof (int)) {
>> +       } else if (sizeof (enum_t) == sizeof (int)) {
>>                 return (xdr_int(xdrs, (int *)ep));
>> -       } else if (sizeof (enum sizecheck) == sizeof (short)) {
>> +       } else if (sizeof (enum_t) == sizeof (short)) {
>>                 return (xdr_short(xdrs, (short *)ep));
>>         } else {
>>                 return (FALSE);
>> --
>> 1.7.1
>>
>> _______________________________________________
>> rtems-devel mailing list
>> rtems-devel at rtems.org
>> http://www.rtems.org/mailman/listinfo/rtems-devel


-- 
Sebastian Huber, embedded brains GmbH

Address : Obere Lagerstr. 30, D-82178 Puchheim, Germany
Phone   : +49 89 18 90 80 79-6
Fax     : +49 89 18 90 80 79-9
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the devel mailing list