Previously, the start and end identifier for union is "  {\n"
and "  }, \n". However the end identifier is not always as
expected. "  },\n" can also be the end identifier. As a result,
variable "randomized" is in incorrect state after union, and
fails to identify the later struct members. For example, we can
reproduce the issue as follows:

    crash> task
    PID: 847      TASK: ffff94f8038f4000  CPU: 72   COMMAND: "khungtaskd"
    struct task_struct {
      thread_info = {
        flags = 2148024320,
        status = 0,
        preempt_lazy_count = 0
      },
      {
        <the union>
      },
      ...
      wake_entry = {
        next = 0x0
      },
      ...

Before patch:

    crash> task -R wake_entry
    PID: 847      TASK: ffff94f8038f4000  CPU: 72   COMMAND: "khungtaskd"

After patch:

    crash> task -R wake_entry
    PID: 847      TASK: ffff94f8038f4000  CPU: 72   COMMAND: "khungtaskd"
      wake_entry = {
        next = 0x0
      },

Signed-off-by: Tao Liu <l...@redhat.com>
---

v1 -> v2: Rewrite the commit log.

---
 task.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/task.c b/task.c
index 071c787..db2abc8 100644
--- a/task.c
+++ b/task.c
@@ -3436,7 +3436,8 @@ parse_task_thread(int argcnt, char *arglist[], struct 
task_context *tc) {
         while (fgets(buf, BUFSIZE, pc->tmpfile)) {
                if (STREQ(buf, "  {\n"))
                        randomized = TRUE;
-               else if (randomized && STREQ(buf, "  }, \n"))
+               else if (randomized &&
+                        (STREQ(buf, "  }, \n") || STREQ(buf, "  },\n")))
                        randomized = FALSE;
 
                if (strlen(lookfor2)) {
-- 
2.33.1

--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to