[PATCH] librpc: Fix for short enums
Gedare Bloom
gedare at rtems.org
Mon Apr 23 12:58:15 UTC 2012
Ugly. Fix seems OK but hackish.
Any chance to fix it upstream?
-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
More information about the devel
mailing list