poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] poke: Change addresses in commands to unsigned


From: Jose E. Marchesi
Subject: Re: [PATCH] poke: Change addresses in commands to unsigned
Date: Fri, 26 Jan 2024 10:29:41 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

Hi Andreas.

OK for both master and maint/poke-4.
Thanks!


> 2024-01-25  Andreas Klinger  <ak@it-klinger.de>
>
>         * poke/pk-cmd.h: New command arg type PK_CMD_ARG_UINT
>         * poke/pk-cmd.c (pk_atou): New function
>         * poke/pk-cmd-ios.c (pk_cmd_mmap, pk_cmd_sub):
>                                    Change base and size to PK_CMD_ARG_UINT
> ---
>
> This patch is also available in the poke repo as branch
> "anderl/unsigned-address-command".
>
> Background:
> Addresses are interpreted as integer so far. For example on a 32 bit system it
> can happen that one is using the address 0x80000000 or a higher one which is
> interpreted as negative value and thus a segmentation fault happens when 
> trying
> to use it.
>
>  poke/pk-cmd-ios.c | 20 ++++++++++----------
>  poke/pk-cmd.c     | 32 ++++++++++++++++++++++++++++++++
>  poke/pk-cmd.h     |  3 +++
>  3 files changed, 45 insertions(+), 10 deletions(-)
>
> diff --git a/poke/pk-cmd-ios.c b/poke/pk-cmd-ios.c
> index 034cc09c..54839fa2 100644
> --- a/poke/pk-cmd-ios.c
> +++ b/poke/pk-cmd-ios.c
> @@ -118,11 +118,11 @@ pk_cmd_sub (int argc, struct pk_cmd_arg argv[], 
> uint64_t uflags)
>    if (ios == NULL)
>      return 0;
>  
> -  assert (PK_CMD_ARG_TYPE (argv[2]) == PK_CMD_ARG_INT);
> -  base = PK_CMD_ARG_INT (argv[2]);
> +  assert (PK_CMD_ARG_TYPE (argv[2]) == PK_CMD_ARG_UINT);
> +  base = PK_CMD_ARG_UINT (argv[2]);
>  
> -  assert (PK_CMD_ARG_TYPE (argv[3]) == PK_CMD_ARG_INT);
> -  size = PK_CMD_ARG_INT (argv[3]);
> +  assert (PK_CMD_ARG_TYPE (argv[3]) == PK_CMD_ARG_UINT);
> +  size = PK_CMD_ARG_UINT (argv[3]);
>  
>    name = (PK_CMD_ARG_TYPE (argv[4]) == PK_CMD_ARG_STR
>            ? PK_CMD_ARG_STR (argv[4])
> @@ -591,11 +591,11 @@ pk_cmd_mmap (int argc, struct pk_cmd_arg argv[], 
> uint64_t uflags)
>    /* Create a new IO space.  */
>    const char *filename = PK_CMD_ARG_STR (argv[1]);
>  
> -  assert (PK_CMD_ARG_TYPE (argv[2]) == PK_CMD_ARG_INT);
> -  base = PK_CMD_ARG_INT (argv[2]);
> +  assert (PK_CMD_ARG_TYPE (argv[2]) == PK_CMD_ARG_UINT);
> +  base = PK_CMD_ARG_UINT (argv[2]);
>  
> -  assert (PK_CMD_ARG_TYPE (argv[3]) == PK_CMD_ARG_INT);
> -  size = PK_CMD_ARG_INT (argv[3]);
> +  assert (PK_CMD_ARG_TYPE (argv[3]) == PK_CMD_ARG_UINT);
> +  size = PK_CMD_ARG_UINT (argv[3]);
>  
>    if (access (filename, F_OK) == 0)
>  
> @@ -636,7 +636,7 @@ const struct pk_cmd proc_cmd =
>    {"proc", "i", PK_PROC_UFLAGS, 0, NULL, NULL, pk_cmd_proc, ".proc PID", 
> NULL};
>  
>  const struct pk_cmd sub_cmd =
> -  {"sub", "s,i,i,?s", "", 0, NULL, NULL, pk_cmd_sub, ".sub IOS, BASE, SIZE, 
> [NAME]",
> +  {"sub", "s,u,u,?s", "", 0, NULL, NULL, pk_cmd_sub, ".sub IOS, BASE, SIZE, 
> [NAME]",
>     poke_completion_function};
>  
>  const struct pk_cmd mem_cmd =
> @@ -649,7 +649,7 @@ const struct pk_cmd nbd_cmd =
>  
>  #ifdef HAVE_MMAP
>  const struct pk_cmd mmap_cmd =
> -  {"mmap", "s,i,i", "", 0, NULL, NULL, pk_cmd_mmap, ".mmap FILE-NAME, BASE, 
> SIZE",
> +  {"mmap", "s,u,u", "", 0, NULL, NULL, pk_cmd_mmap, ".mmap FILE-NAME, BASE, 
> SIZE",
>     rl_filename_completion_function};
>  #endif
>  
> diff --git a/poke/pk-cmd.c b/poke/pk-cmd.c
> index 76dd4cf3..f571342a 100644
> --- a/poke/pk-cmd.c
> +++ b/poke/pk-cmd.c
> @@ -110,6 +110,23 @@ skip_blanks (const char *p)
>    return p;
>  }
>  
> +static inline int
> +pk_atou (const char **p, uint64_t *number)
> +{
> +  unsigned long int li;
> +  char *end;
> +
> +  errno = 0;
> +  li = strtoull (*p, &end, 0);
> +  if ((errno != 0 && li == 0)
> +      || end == *p)
> +    return 0;
> +
> +  *number = li;
> +  *p = end;
> +  return 1;
> +}
> +
>  static inline int
>  pk_atoi (const char **p, int64_t *number)
>  {
> @@ -409,6 +426,21 @@ pk_cmd_exec_1 (const char *str, struct pk_trie 
> *cmds_trie, char *prefix)
>                          }
>                      }
>  
> +                  break;
> +                case 'u':
> +                  /* Parse an unsigned integer.  */
> +                  p = skip_blanks (p);
> +                  if (pk_atou (&p, &(argv[argc].val.uinteger))
> +                      && (*a == 'i' || argv[argc].val.uinteger >= 0))
> +                    {
> +                      p = skip_blanks (p);
> +                      if (*p == ',' || *p == '\0')
> +                        {
> +                          argv[argc].type = PK_CMD_ARG_UINT;
> +                          match = 1;
> +                        }
> +                    }
> +
>                    break;
>                  case 's':
>                    {
> diff --git a/poke/pk-cmd.h b/poke/pk-cmd.h
> index f60a6c25..65d9af4c 100644
> --- a/poke/pk-cmd.h
> +++ b/poke/pk-cmd.h
> @@ -28,11 +28,13 @@ enum pk_cmd_arg_type
>  {
>    PK_CMD_ARG_NULL,
>    PK_CMD_ARG_INT,
> +  PK_CMD_ARG_UINT,
>    PK_CMD_ARG_STR
>  };
>  
>  #define PK_CMD_ARG_TYPE(arg) ((arg).type)
>  #define PK_CMD_ARG_INT(arg) ((arg).val.integer)
> +#define PK_CMD_ARG_UINT(arg) ((arg).val.uinteger)
>  #define PK_CMD_ARG_STR(arg) ((arg).val.str)
>  
>  struct pk_cmd_arg
> @@ -41,6 +43,7 @@ struct pk_cmd_arg
>    union
>    {
>      int64_t integer;
> +    uint64_t uinteger;
>      char *str;
>      int64_t tag;
>    } val;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]