[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