[Crash-utility] Adding a new command rbtree

qiaonuohan qiaonuohan at cn.fujitsu.com
Tue Jun 12 01:51:28 UTC 2012


At 2012-6-1 2:34, Dave Anderson wrote:
> So I believe that the 1-bit should be stripped off when a user
> inadvertently enters such an address as a -N radix_tree_node address.
> With this change to cmd_tree():
>
>          if (hexadecimal_only(args[optind], 0)) {
>                  value = htol(args[optind], FAULT_ON_ERROR, NULL);
>                  if (IS_KVADDR(value)) {
>                          td->start = value;
> +                       if ((td->start&  1)&&
> +                           (td->flags&  TREE_NODE_POINTER)&&
> +                           (type_flag == RADIXTREE_REQUEST))
> +                               td->start&= ~1;
>                          goto next_arg;
>                  }
>          }
>
> it works OK regardless of the 1-bit setting:

Hello Dave,

I have to point out that you only involved the situation that user input 
a hexadecimal number. The tree command can get starting address from 
three place.

<cut>

         if ((sp = symbol_search(args[optind]))) {
                 td->start = sp->value;
                 goto next_arg;
         }

         if (!IS_A_NUMBER(args[optind])) {
                 if (can_eval(args[optind])) {
                         value = eval(args[optind], FAULT_ON_ERROR, NULL);
                         if (IS_KVADDR(value)) {
                                 td->start = value;
                                 goto next_arg;
                         }
                 }
                 error(FATAL, "invalid argument: %s\n", args[optind]);
         }

         if (hexadecimal_only(args[optind], 0)) {
                 value = htol(args[optind], FAULT_ON_ERROR, NULL);
                 if (IS_KVADDR(value)) {
                         td->start = value;
                         goto next_arg;
                 }
         }

<cut>

So I prefer change like this.
<cut>
         if (td->flags & TREE_NODE_POINTER) {
                 node_p = td->start;
+
+               if (node_p & 1)
+                       node_p &= ~1;
+
                 if (VALID_MEMBER(radix_tree_node_height)) {
                         readmem(node_p + 
OFFSET(radix_tree_node_height), KVADDR,
                                 &height, sizeof(uint), "radix_tree_node 
height",
                                 FAULT_ON_ERROR);
<cut>

-- 
--
Regards
Qiao Nuohan






More information about the Crash-utility mailing list