<div dir="ltr"><div>From: Yicheng Qin &lt;<a href="mailto:yichengq@google.com">yichengq@google.com</a>&gt;</div><div>Subject: [PATCH] test/zdtm/sockets_dgram: Use shorter pathname to support</div><div> struct sockaddr_un</div>
<div><br></div><div>Struct sockaddr_un is used in program for bind() to listen on a local file.</div><div><br></div><div>Path is one of its attributes and only has 108-byte size. It may happen</div><div>that the path is too small to contain the whole real path, which contains</div>
<div>current working directory now. This may lead to two sockets listening on</div><div>the same file.</div><div><br></div><div>So, we change the path to be &quot;/tmp&quot;. It ensures that filename cannot</div><div>exceed the limit.</div>
<div><br></div><div>Additionally, to run it well with namespace, make new directory named</div><div>&#39;tmp&#39; under constructed root.</div><div><br></div><div>Signed-off-by: Yicheng Qin &lt;<a href="mailto:yichengq@google.com">yichengq@google.com</a>&gt;</div>
<div>---</div><div> test/zdtm.sh                          |  5 +++++</div><div> test/zdtm/live/static/sockets_dgram.c | 32 +++++++++++++++++++++-----------</div><div> 2 files changed, 26 insertions(+), 11 deletions(-)</div>
<div><br></div><div>diff --git a/test/zdtm.sh b/test/zdtm.sh</div><div>index 98eb075..f640cd7 100755</div><div>--- a/test/zdtm.sh</div><div>+++ b/test/zdtm.sh</div><div>@@ -223,6 +223,7 @@ construct_root()</div><div> <span class="" style="white-space:pre">        </span>local ps_path=`type -P ps`</div>
<div> <span class="" style="white-space:pre">        </span>local libdir=$root/lib</div><div> <span class="" style="white-space:pre">        </span>local libdir2=$root/lib64</div><div>+<span class="" style="white-space:pre">        </span>local tmpdir=$root/tmp</div>
<div> </div><div> <span class="" style="white-space:pre">        </span>mkdir -p $root/bin</div><div> <span class="" style="white-space:pre">        </span>cp $ps_path $root/bin</div><div>@@ -250,6 +251,10 @@ construct_root()</div><div>
 <span class="" style="white-space:pre">                </span>[ -f /lib/x86_64-linux-gnu/$i ] &amp;&amp; cp /lib/x86_64-linux-gnu/$i $libdir &amp;&amp; cp /lib/x86_64-linux-gnu/$i $libdir2 &amp;&amp; continue ||</div><div> <span class="" style="white-space:pre">                </span>[ -f /lib/arm-linux-gnueabi/$i ] &amp;&amp; cp /lib/arm-linux-gnueabi/$i $libdir &amp;&amp; cp /lib/arm-linux-gnueabi/$i $libdir2 &amp;&amp; continue || echo &quot;Failed at &quot; $i &amp;&amp; return 1</div>
<div> <span class="" style="white-space:pre">        </span>done</div><div>+</div><div>+<span class="" style="white-space:pre">        </span># make &#39;tmp&#39; dir under new root</div><div>+<span class="" style="white-space:pre">        </span>mkdir $tmpdir</div>
<div>+<span class="" style="white-space:pre">        </span>chmod 0777 $tmpdir</div><div> }</div><div> </div><div> export MAKEFLAGS=--no-print-directory</div><div>diff --git a/test/zdtm/live/static/sockets_dgram.c b/test/zdtm/live/static/sockets_dgram.c</div>
<div>index 1df0570..6bdb857 100644</div><div>--- a/test/zdtm/live/static/sockets_dgram.c</div><div>+++ b/test/zdtm/live/static/sockets_dgram.c</div><div>@@ -39,19 +39,22 @@ int main(int argc, char *argv[])</div><div> </div>
<div> <span class="" style="white-space:pre">        </span>char path[PATH_MAX];</div><div> <span class="" style="white-space:pre">        </span>char buf[64];</div><div>-<span class="" style="white-space:pre">        </span>char *cwd;</div><div>
+<span class="" style="white-space:pre">        </span>/*</div><div>+<span class="" style="white-space:pre">        </span> * The original code makes dir to be current working</div><div>+<span class="" style="white-space:pre">        </span> * directory. But it may be too long in google environment</div>
<div>+<span class="" style="white-space:pre">        </span> * for path to be fit into struct sockaddr_un.</div><div>+<span class="" style="white-space:pre">        </span> * One alternate way to resolve it is to use relative path</div>
<div>+<span class="" style="white-space:pre">        </span> * for sockaddr_un, but criu has not supported relative</div><div>+<span class="" style="white-space:pre">        </span> * bind path yet.</div><div>+<span class="" style="white-space:pre">        </span> * We change it to &quot;/tmp&quot; to ensure its short length.</div>
<div>+<span class="" style="white-space:pre">        </span> */</div><div>+<span class="" style="white-space:pre">        </span>char *dirname = &quot;/tmp&quot;;</div><div> </div><div> <span class="" style="white-space:pre">        </span>int ret;</div>
<div> </div><div> <span class="" style="white-space:pre">        </span>test_init(argc, argv);</div><div> </div><div>-<span class="" style="white-space:pre">        </span>cwd = get_current_dir_name();</div><div>-<span class="" style="white-space:pre">        </span>if (!cwd) {</div>
<div>-<span class="" style="white-space:pre">                </span>fail(&quot;getcwd\n&quot;);</div><div>-<span class="" style="white-space:pre">                </span>exit(1);</div><div>-<span class="" style="white-space:pre">        </span>}</div><div>-</div>
<div>-<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s&quot;, cwd, filename);</div><div>+<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s&quot;, dirname, filename);</div>
<div> <span class="" style="white-space:pre">        </span>unlink(path);</div><div> </div><div> <span class="" style="white-space:pre">        </span>sk_dgram_bound_client<span class="" style="white-space:pre">        </span>= socket(AF_UNIX, SOCK_DGRAM, 0);</div>
<div>@@ -71,7 +74,7 @@ int main(int argc, char *argv[])</div><div> <span class="" style="white-space:pre">                </span>exit(1);</div><div> <span class="" style="white-space:pre">        </span>}</div><div> </div><div>-<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.bound&quot;, cwd, filename);</div>
<div>+<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.bound&quot;, dirname, filename);</div><div> <span class="" style="white-space:pre">        </span>unlink(path);</div><div> <span class="" style="white-space:pre">        </span>if (strlen(path) &gt;= sizeof(name_bound.sun_path)) {</div>
<div> <span class="" style="white-space:pre">                </span>fail(&quot;too long path&quot;);</div><div>@@ -81,7 +84,7 @@ int main(int argc, char *argv[])</div><div> <span class="" style="white-space:pre">        </span>name_bound.sun_family = AF_UNIX;</div>
<div> <span class="" style="white-space:pre">        </span>strncpy(name_bound.sun_path, path, sizeof(name_bound.sun_path));</div><div> </div><div>-<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.conn&quot;, cwd, filename);</div>
<div>+<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.conn&quot;, dirname, filename);</div><div> <span class="" style="white-space:pre">        </span>unlink(path);</div><div> <span class="" style="white-space:pre">        </span>if (strlen(path) &gt;= sizeof(name_conn.sun_path)) {</div>
<div> <span class="" style="white-space:pre">                </span>fail(&quot;too long path&quot;);</div><div>@@ -91,7 +94,7 @@ int main(int argc, char *argv[])</div><div> <span class="" style="white-space:pre">        </span>name_conn.sun_family = AF_UNIX;</div>
<div> <span class="" style="white-space:pre">        </span>strncpy(name_conn.sun_path, path, sizeof(name_conn.sun_path));</div><div> </div><div>-<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.bound-conn&quot;, cwd, filename);</div>
<div>+<span class="" style="white-space:pre">        </span>snprintf(path, sizeof(path), &quot;%s/%s.bound-conn&quot;, dirname, filename);</div><div> <span class="" style="white-space:pre">        </span>unlink(path);</div><div> <span class="" style="white-space:pre">        </span>if (strlen(path) &gt;= sizeof(name_bound_conn.sun_path)) {</div>
<div> <span class="" style="white-space:pre">                </span>fail(&quot;too long path&quot;);</div><div>@@ -198,5 +201,12 @@ int main(int argc, char *argv[])</div><div> <span class="" style="white-space:pre">        </span>test_msg(&quot;dgram-bound-conn  : &#39;%s&#39;\n&quot;, buf);</div>
<div> </div><div> <span class="" style="white-space:pre">        </span>pass();</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>/*</div><div>+<span class="" style="white-space:pre">        </span> * Do cleanup work</div>
<div>+<span class="" style="white-space:pre">        </span> */</div><div>+<span class="" style="white-space:pre">        </span>unlink(name_bound.sun_path);</div><div>+<span class="" style="white-space:pre">        </span>unlink(name_conn.sun_path);</div>
<div>+<span class="" style="white-space:pre">        </span>unlink(name_bound_conn.sun_path);</div><div> <span class="" style="white-space:pre">        </span>return 0;</div><div> }</div><div>-- </div><div>1.8.3</div><div><br></div></div>