<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hello.<br>
    <br>
    I've found some bug with newest release of Torque 4.2.6.<br>
    <br>
    When compiled with options:<br>
    ./configure --with-default-server=### --with-rcp=/usr/bin/scp
    --enable-cpuset --enable-nvidia-gpus --enable-blcr
    --enable-geometry-requests --enable-unixsockets=no<br>
    <br>
    ...if just won't start (mom client), hanging during reading files
    /sys/devices/system/nodes/.../cpulist.<br>
    <br>
    The problem is in function:<br>
    /scr/resmom/linux/numa_node.cpp -&gt; void
    numa_node::parse_cpu_string()<br>
    There is a loop, parsing subsequent parts of string (this is line of
    text read from files mentioned above):<br>
    <br>
    LINE 121:<br>
      while (*ptr != '\0')<br>
        {<br>
        prev = strtol(ptr, &amp;ptr, 10);<br>
    <br>
        if (*ptr == '-')<br>
          {<br>
          ptr++;<br>
          curr = strtol(ptr, &amp;ptr, 10);<br>
    <br>
          while (prev &lt;= curr)<br>
            {<br>
    #ifdef PENABLE_LINUX26_CPUSETS<br>
            if ((MOMConfigUseSMT == 1) ||<br>
                (is_physical_core(prev) == true))<br>
    #endif<br>
              {<br>
              this-&gt;cpu_indices.push_back(prev);<br>
              this-&gt;cpu_avail.push_back(true);<br>
              this-&gt;total_cpus++;<br>
              this-&gt;available_cpus++;<br>
              }<br>
    <br>
            prev++;<br>
            }<br>
    <br>
          if (*ptr == ',')<br>
            ptr++;<br>
          }<br>
        else if ((*ptr == ',') ||<br>
                 (*ptr == '\0'))<br>
          {<br>
    #ifdef PENABLE_LINUX26_CPUSETS<br>
          if ((MOMConfigUseSMT == 1) ||<br>
              (is_physical_core(prev) == true))<br>
    #endif<br>
            {<br>
            this-&gt;cpu_indices.push_back(prev);<br>
            this-&gt;cpu_avail.push_back(true);<br>
            this-&gt;total_cpus++;<br>
            this-&gt;available_cpus++;<br>
            }<br>
    <br>
          ptr++;<br>
          }<br>
        }<br>
    <br>
    This loop omits character '\0' ending the string: it enters second
    "if" (because *ptr == '\0') and then increments pointer which leads
    to pointer overflow.<br>
    Then... in subsequent iterations it just does nothing (because there
    are usually some rubbish data after '\0' and "strtol" cannot parse
    them so the pointer remains the same).<br>
    <div id="gt-res-content" class="almost_half_cell">
      <div dir="ltr" style="zoom:1"><span id="result_box"
          class="short_text" lang="en"><span class="hps"><br>
            To resolve this problem I've just added one line.<br>
            <br>
            Previous version:<br>
            161: }<br>
            162:<br>
            163:ptr++;<br>
            <br>
            I've hanged to:<br>
            161: }<br>
            162:<br>
            163: if(*ptr == '\n') break;<br>
            164: ptr++;<br>
            <br>
            Now, when it enters second if (when *ptr == '\0'), it saves
            data about the core and exits the loop.<br>
            Maybe there is more elegant way to do this but this is
            simple and just works (tested).<br>
            <br>
            Regards,<br>
            Peter.<br>
            <br>
          </span></span></div>
    </div>
    <br>
  </body>
</html>