Re: [hackers] [sbase][PATCH] od: Fix argument parsing for -t flag

From: Quentin Rameau <quinq_AT_fifth.space>
Date: Sun, 16 Feb 2020 22:36:40 +0100

Hi prez,

> when the -t flag is used without a number of bytes, od exits with
> usage(). 'od -tx foo' should behave like 'od -tx4 foo'.

Indeed,

> ---
> od.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/od.c b/od.c
> index 0b1c5c6..1780710 100644
> --- a/od.c
> +++ b/od.c
> _AT_@ -250,6 +250,7 @@ main(int argc, char *argv[])
> break;
> case 't':
> s = EARGF(usage());
> + int done = 0;
> for (; *s; s++) {
> switch (*s) {
> case 'a':
> _AT_@ -277,11 +278,15 @@ main(int argc, char *argv[])
> case 'L':
> len = sizeof(long);
> break;
> - default:
> + case '\0':
> len = sizeof(int);
> + done = 1;
> + break;
> + default:
> + usage();
> }
> }
> - addtype(*s++, len);
> + addtype(*(done ? s : s++), len);
> break;
> default:
> usage();

This is slightly wrong though, we don't want to error on default
because it's allowed to concatenate multiple types.

I think something like that is better, what do you think?

diff --git a/od.c b/od.c
index 0b1c5c6..9ff8ff2 100644
--- a/od.c
+++ b/od.c
_AT_@ -212,7 +212,7 @@ main(int argc, char *argv[])
 {
         int fd;
         struct type *t;
- int ret = 0, len;
+ int ret = 0, len, defbytes;
         char *s;
 
         big_endian = (*(uint16_t *)"\0\xff" == 0xff);
_AT_@ -260,6 +260,7 @@ main(int argc, char *argv[])
                         case 'o':
                         case 'u':
                         case 'x':
+ defbytes = 0;
                                 /* todo: allow multiple digits */
                                 if (*(s+1) > '0' && *(s+1) <= '9') {
                                         len = *(s+1) - '0';
_AT_@ -271,17 +272,17 @@ main(int argc, char *argv[])
                                         case 'S':
                                                 len = sizeof(short);
                                                 break;
+ default:
+ defbytes = 1;
                                         case 'I':
                                                 len = sizeof(int);
                                                 break;
                                         case 'L':
                                                 len = sizeof(long);
                                                 break;
- default:
- len = sizeof(int);
                                         }
                                 }
- addtype(*s++, len);
+ addtype(defbytes ? *s : *s++, len);
                                 break;
                         default:
                                 usage();
Received on Sun Feb 16 2020 - 22:36:40 CET

This archive was generated by hypermail 2.3.0 : Sun Feb 16 2020 - 22:48:27 CET