[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