handle xlat_styles when decoding sa_mask

shankarapailoor shankarapailoor at gmail.com
Sat Mar 23 18:23:16 UTC 2019


Hi Dmitry,

Here is my updated patch. Let me know if this is what you had in mind.

Regards,
Shankara

On Sat, Mar 23, 2019 at 10:01 AM shankarapailoor <shankarapailoor at gmail.com>
wrote:

> Hi Dmitry,
>
> Sorry for the late reply but when you say "explicit length" do you mean
> the long should be printed the same string length regardless of
> architecture?
>
> On Sun, Mar 17, 2019 at 3:42 PM Dmitry V. Levin <ldv at altlinux.org> wrote:
>
>> Hi,
>>
>> On Sun, Feb 17, 2019 at 12:43:59PM -0600, shankarapailoor wrote:
>> > Hi,
>> >
>> > > I hope you understand that the output produced by your parser
>> > > is different between big-endian and little-endian architectures.
>> >
>> > Yes I understood. How do you think we should decode the sa_mask field
>> under
>> > XLAT_RAW?
>>
>> There seems to be no obvious way of printing sa_mask under XLAT_RAW,
>> so the question is how to print sa_mask under XLAT_RAW
>> in the least confusing way.
>>
>> Since sa_mask is implemented as an array of target long integers,
>> what if we printed sa_mask as an array of hexadecimal values with explicit
>> length, e.g. tprintf("%#0*" PRI_klx, (int) elem_size * 2 + 2, elem_value)?
>>
>> > On Fri, Feb 8, 2019 at 1:46 PM Dmitry V. Levin <ldv at altlinux.org>
>> wrote:
>> >
>> > > On Fri, Feb 08, 2019 at 10:32:52PM +0300, Dmitry V. Levin wrote:
>> > > > Hi,
>> > > >
>> > > > On Sat, Jan 05, 2019 at 12:10:38PM -0800, shankarapailoor wrote:
>> > > > > Hi,
>> > > > >
>> > > > > Strace doesn't handle xlat styles properly when decoding the
>> sa_mask
>> > > > > field of the sigaction struct,  Attached is a patch which decodes
>> the
>> > > > > field as an array of bytes. Let me know what you think!
>> > > > >
>> > > > > Regards,
>> > > > > Shankara Pailoor
>> > > >
>> > > > > From 41d7cac5cf000f4e8b6ee675d231038cb786d2e1 Mon Sep 17 00:00:00
>> 2001
>> > > > > From: Shankara Pailoor <shankarapailoor at gmail.com>
>> > > > > Date: Sat, 5 Jan 2019 11:49:28 -0800
>> > > > > Subject: [PATCH v1] properly handle xlat_styles when decoding
>> > > sigaction mask
>> > > > >
>> > > > > * signal.c (sprintsigmask_n): Decode sigaction mask as array of
>> bytes
>> > > under XLAT_RAW, VERBOSE.
>> > > > > * tests/printsamask.c: New file.
>> > > > > * tests/printsamask-Xabbrev.c: Likewise.
>> > > > > * tests/printsamask-Xraw.c: Likewise.
>> > > > > * tests/printsamask-Xverbose.c: Likewise.
>> > > > > * tests/pure_executables.list: Add printsamask-Xabbrev,
>> > > printsamask-Xraw, printsamask-Xverbose.
>> > > > > * tests/gen_tests.in: Likewise.
>> > > > > ---
>> > > > >  signal.c                     | 32 +++++++++++++-
>> > > > >  tests/.gitignore             |  3 ++
>> > > > >  tests/gen_tests.in           |  3 ++
>> > > > >  tests/printsamask-Xabbrev.c  |  1 +
>> > > > >  tests/printsamask-Xraw.c     |  2 +
>> > > > >  tests/printsamask-Xverbose.c |  2 +
>> > > > >  tests/printsamask.c          | 81
>> ++++++++++++++++++++++++++++++++++++
>> > > > >  tests/pure_executables.list  |  3 ++
>> > > > >  8 files changed, 126 insertions(+), 1 deletion(-)
>> > > > >  create mode 100644 tests/printsamask-Xabbrev.c
>> > > > >  create mode 100644 tests/printsamask-Xraw.c
>> > > > >  create mode 100644 tests/printsamask-Xverbose.c
>> > > > >  create mode 100644 tests/printsamask.c
>> > > > >
>> > > > > diff --git a/signal.c b/signal.c
>> > > > > index 418905f0..e3c5d8c3 100644
>> > > > > --- a/signal.c
>> > > > > +++ b/signal.c
>> > > > > @@ -166,8 +166,11 @@ sprintsigmask_n(const char *prefix, const
>> void
>> > > *sig_mask, unsigned int bytes)
>> > > > >      * Most of signal names have length 7,
>> > > > >      * average length of signal names is less than 7.
>> > > > >      * The length of prefix string does not exceed 16.
>> > > > > +    * Under xlat_verbose we may have at most NSIG_BYTES in
>> > > > > +    * the raw sa_mask array. We can safely allocate 8 bytes per
>> entry
>> > > > >      */
>> > > > > -   static char outstr[128 + 8 * (NSIG_BYTES * 8 * 2 / 3)];
>> > > > > +   static char outstr[128 + 8 * (NSIG_BYTES * 8 * 2 / 3)
>> > > > > +                           + 8 * NSIG_BYTES];
>> > > > >
>> > > > >     char *s;
>> > > > >     const uint32_t *mask;
>> > > > > @@ -178,6 +181,29 @@ sprintsigmask_n(const char *prefix, const
>> void
>> > > *sig_mask, unsigned int bytes)
>> > > > >
>> > > > >     s = stpcpy(outstr, prefix);
>> > > > >
>> > > > > +   if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV) {
>> > > > > +           const char *mask = (char *) sig_mask;
>> > > > > +           const char *sep = "[";
>> > > > > +           unsigned int i, size;
>> > > > > +
>> > > > > +           size = (bytes >= NSIG_BYTES) ? NSIG_BYTES : bytes;
>> > > > > +           for (i = 0; i < size; i++) {
>> > > > > +                   s = xappendstr(outstr, s, "%s0x%02x", sep,
>> > > mask[i]);
>> > > > > +                   sep = ", ";
>> > > > > +           }
>> > > >
>> > > > I hope you understand that the output produced by your parser
>> > > > is different between big-endian and little-endian architectures.
>> > > >
>> > > > [...]
>> > > > > +int
>> > > > > +main(void)
>> > > > > +{
>> > > > > +   unsigned int set_size = NSIG / 8;
>> > > > > +   void *const k_set = tail_alloc(set_size);
>> > > > > +   void *const old_set = tail_alloc(set_size);
>> > > > > +   TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set);
>> > > > > +
>> > > > > +   memset(k_set, 0, set_size);
>> > > > > +   sigemptyset(libc_set);
>> > > > > +   sigaddset(libc_set, SIGHUP);
>> > > > > +   memcpy(k_set, libc_set, set_size);
>> > > > > +
>> > > > > +   int rc = k_sigprocmask(SIG_SETMASK, k_set, old_set, set_size);
>> > > > > +#if XLAT_RAW
>> > > > > +   tprintf("rt_sigprocmask(0x2"
>> > > > > +           ", [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]"
>> > > > > +           ", [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]"
>> > > > > +           ", %u) = %s\n", set_size, sprintrc(rc));
>> > > > > +#elif XLAT_VERBOSE
>> > > > > +   tprintf("rt_sigprocmask(0x2 /* SIG_SETMASK */"
>> > > > > +           ", [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] /*
>> > > [HUP] */"
>> > > > > +           ", [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
>> /* []
>> > > */, %u) = %s\n",
>> > > > > +                   set_size, sprintrc(rc));
>> > > > > +#else /* XLAT_ABBREV */
>> > > > > +   tprintf("rt_sigprocmask(SIG_SETMASK, [HUP], [], %u) = %s\n",
>> > > > > +                   set_size, sprintrc(rc));
>> > > > > +#endif
>> > > >
>> > > > Your test assumes that the output is produced on a big-endian
>> > >
>> > > s/big-endian/little-endian/
>> > >
>> > > > architecture, so it fails on big-endian architectures.
>>
>>
>> --
>> ldv
>> --
>> Strace-devel mailing list
>> Strace-devel at lists.strace.io
>> https://lists.strace.io/mailman/listinfo/strace-devel
>>
>
>
> --
> Regards,
> Shankara Pailoor
>


-- 
Regards,
Shankara Pailoor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20190323/c893951a/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v2-0001-properly-handle-xlat_styles-when-decoding-sigacti.patch
Type: text/x-patch
Size: 7865 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20190323/c893951a/attachment.bin>


More information about the Strace-devel mailing list