<div dir="ltr">It seems like patchwork is picking up the patches, but it&#39;s unhappy with the formatted corruption caused by my Vim config<div>(basically, tabs were rendered as spaces and caused merge conflicts when included in the patch).</div><div>Let me try one last time before I&#39;m banned from this mailing list for spam :)</div><div><br></div><div><br></div><div><br></div><div><div>From: Radoslaw Burny &lt;rburny at <a href="http://google.com">google.com</a>&gt;</div><div><br></div><div>Subject: [PATCH] Fix UB in choose_service_fd_base.</div><div><br></div><div>Signed-off-by: Radoslaw Burny &lt;rburny at <a href="http://google.com">google.com</a>&gt;</div><div><br></div><div>---</div><div> criu/util.c | 4 ++--</div><div> 1 file changed, 2 insertions(+), 2 deletions(-)</div><div><br></div><div>diff --git a/criu/util.c b/criu/util.c</div><div>index b19bf517..48ba09a8 100644</div><div>--- a/criu/util.c</div><div>+++ b/criu/util.c</div><div>@@ -588,9 +588,9 @@ static int choose_service_fd_base(struct pstree_item *me)</div><div> <span style="white-space:pre">        </span>nr += 16; /* Safety pad */</div><div> <span style="white-space:pre">        </span>real_nr = nr;</div><div> </div><div>-<span style="white-space:pre">        </span>nr /= (1024 / sizeof(void *));</div><div>+<span style="white-space:pre">        </span>/* Align nr to the power of 2 for easier debugging */</div><div>+<span style="white-space:pre">        </span>BUG_ON(nr &lt;= 0);</div><div> <span style="white-space:pre">        </span>nr = 1 &lt;&lt; (32 - __builtin_clz(nr));</div><div>-<span style="white-space:pre">        </span>nr *= (1024 / sizeof(void *));</div><div> </div><div> <span style="white-space:pre">        </span>if (nr &gt; service_fd_rlim_cur) {</div><div> <span style="white-space:pre">                </span>/* Right border is bigger, than rlim. OK, then just aligned value is enough */</div><div>-- </div><div>2.17.0.484.g0c8726318c-goog</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 9, 2018 at 6:19 PM, Kirill Tkhai <span dir="ltr">&lt;<a href="mailto:ktkhai@virtuozzo.com" target="_blank">ktkhai@virtuozzo.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 09.04.2018 19:16, Radoslaw Burny wrote:<br>
&gt; Ah, I see. Even with the fds that CRIU adds, it&#39;s still possible to fit<br>
&gt; below 64 or even 32.<br>
&gt; I&#39;ve reverted the patch to the version you suggested and attached it below<br>
&gt; - I presume this is the code review process for CRIU, right?<br>
<br>
</span>I assume, criu patchwork will be able to pick this patch up from the reply. Andrew, is this OK?<br>
<span class=""><br>
&gt; BTW, if you want to make any changes to the patch before merging it -<br>
&gt; feel free to do so :)<br>
&gt; It will be faster than us two iterating over the email.<br>
&gt;<br>
&gt; Thanks!<br>
<br>
</span>Thanks,<br>
Kirill<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; On Mon, Apr 9, 2018 at 6:03 PM, Kirill Tkhai &lt;<a href="mailto:ktkhai@virtuozzo.com">ktkhai@virtuozzo.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; On 09.04.2018 17:57, Radoslaw Burny wrote:<br>
&gt;&gt;&gt; From: Radoslaw Burny &lt;<a href="mailto:rburny@google.com">rburny@google.com</a>&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Subject: [PATCH] Fix UB in choose_service_fd_base.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Signed-off-by: Radoslaw Burny &lt;<a href="mailto:rburny@google.com">rburny@google.com</a>&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ---<br>
&gt;&gt;&gt;  criu/util.c | 4 ++--<br>
&gt;&gt;&gt;  1 file changed, 2 insertions(+), 2 deletions(-)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; diff --git a/criu/util.c b/criu/util.c<br>
&gt;&gt;&gt; index b19bf517..48ba09a8 100644<br>
&gt;&gt;&gt; --- a/criu/util.c<br>
&gt;&gt;&gt; +++ b/criu/util.c<br>
&gt;&gt;&gt; @@ -588,9 +588,9 @@ static int choose_service_fd_base(struct pstree_item<br>
&gt;&gt;&gt; *me)<br>
&gt;&gt;&gt;         nr += 16; /* Safety pad */<br>
&gt;&gt;&gt;         real_nr = nr;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; -       nr /= (1024 / sizeof(void *));<br>
&gt;&gt;&gt; +       /* Align nr to the power of 2 for easier debugging */<br>
&gt;&gt;&gt; +       BUG_ON(nr &lt;= 0);<br>
&gt;&gt;&gt;         nr = 1 &lt;&lt; (32 - __builtin_clz(nr));<br>
&gt;&gt;&gt; -       nr *= (1024 / sizeof(void *));<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;         if (nr &gt; service_fd_rlim_cur) {<br>
&gt;&gt;&gt;                 /* Right border is bigger, than rlim. OK, then just<br>
&gt;&gt; aligned<br>
&gt;&gt;&gt; value is enough */<br>
&gt;&gt;<br>
&gt;&gt; It&#39;s not a round up power of 2, it&#39;s round up power of 2 rounded to 128.<br>
&gt;&gt; This goes from kernel: <a href="https://git.kernel.org/pub/" rel="noreferrer" target="_blank">https://git.kernel.org/pub/</a><br>
&gt;&gt; scm/linux/kernel/git/torvalds/<wbr>linux.git/tree/fs/file.c#n85<br>
&gt;&gt;<br>
&gt;&gt; #include &lt;limits.h&gt;<br>
&gt;&gt; int main(void)<br>
&gt;&gt; {<br>
&gt;&gt; unsigned int i, was, nr;<br>
&gt;&gt;<br>
&gt;&gt;     for (i = 0; i &lt; INT_MAX; i++) {<br>
&gt;&gt;             nr = i;<br>
&gt;&gt;             nr /= (1024 / sizeof(void *));<br>
&gt;&gt;             if (nr)<br>
&gt;&gt;                     nr = 1 &lt;&lt; (32 - __builtin_clz(nr));<br>
&gt;&gt;             else<br>
&gt;&gt;                     nr = 1;<br>
&gt;&gt;             nr *= (1024 / sizeof(void *));<br>
&gt;&gt;<br>
&gt;&gt;             printf(&quot;nr=%d, i=%d\n&quot;, nr, i);<br>
&gt;&gt;             if (nr &lt; i || (nr-1) &amp; nr) {<br>
&gt;&gt;                     printf(&quot;error\n&quot;);<br>
&gt;&gt;                     exit(1);<br>
&gt;&gt;             }<br>
&gt;&gt;     }<br>
&gt;&gt;<br>
&gt;&gt;     return 0;<br>
&gt;&gt;<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; nr=128, i=16<br>
&gt;&gt; nr=128, i=17<br>
&gt;&gt; nr=128, i=18<br>
&gt;&gt; nr=128, i=19<br>
&gt;&gt; nr=128, i=20<br>
&gt;&gt; nr=128, i=21<br>
&gt;&gt; nr=128, i=22<br>
&gt;&gt; nr=128, i=23<br>
&gt;&gt; nr=128, i=24<br>
&gt;&gt; nr=128, i=25<br>
&gt;&gt; nr=128, i=26<br>
&gt;&gt; nr=128, i=27<br>
&gt;&gt; nr=128, i=28<br>
&gt;&gt; nr=128, i=29<br>
&gt;&gt; nr=128, i=30<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; From: Radoslaw Burny &lt;rburny at <a href="http://google.com" rel="noreferrer" target="_blank">google.com</a>&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Subject: [PATCH] Fix UB in choose_service_fd_base (rev 2).<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Signed-off-by: Radoslaw Burny &lt;rburny at <a href="http://google.com" rel="noreferrer" target="_blank">google.com</a>&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ---<br>
&gt;  criu/util.c | 5 ++++-<br>
&gt;  1 file changed, 4 insertions(+), 1 deletion(-)<br>
&gt;<br>
&gt; diff --git a/criu/util.c b/criu/util.c<br>
&gt; index b19bf517..56a1683e 100644<br>
&gt; --- a/criu/util.c<br>
&gt;<br>
&gt; +++ b/criu/util.c<br>
&gt;<br>
&gt; @@ -589,7 +589,10 @@ static int choose_service_fd_base(struct pstree_item<br>
&gt; *me)<br>
&gt;         real_nr = nr;<br>
&gt;<br>
&gt;         nr /= (1024 / sizeof(void *));<br>
&gt; -       nr = 1 &lt;&lt; (32 - __builtin_clz(nr));<br>
&gt; +       if (nr != 0)<br>
&gt; +               nr = 1 &lt;&lt; (32 - __builtin_clz(nr));<br>
&gt; +       else<br>
&gt; +               nr = 1;<br>
&gt;         nr *= (1024 / sizeof(void *));<br>
&gt;<br>
&gt;         if (nr &gt; service_fd_rlim_cur) {<br>
&gt; --<br>
&gt; 2.17.0.484.g0c8726318c-goog<br>
&gt;<br>
</div></div></blockquote></div><br></div>