<div dir="ltr"><div class="gmail_extra"><div class="gmail_extra">2017-06-14 12:35 GMT+08:00 Dmitry V. Levin <<a href="mailto:ldv@altlinux.org">ldv@altlinux.org</a>>:</div><div class="gmail_extra">> On Wed, Jun 14, 2017 at 11:53:02AM +0800, JingPiao Chen wrote:</div><div class="gmail_extra">> > On Wed, Jun 14, 2017 at 05:06:06AM +0300, Dmitry V. Levin wrote:</div><div class="gmail_extra">> > > On Wed, Jun 14, 2017 at 03:19:46AM +0300, Dmitry V. Levin wrote:</div><div class="gmail_extra">> > > > On Wed, Jun 14, 2017 at 07:49:34AM +0800, JingPiao Chen wrote:</div><div class="gmail_extra">> > > > > On Tue, Jun 13, 2017 at 07:10:13PM +0300, Dmitry V. Levin wrote:</div><div class="gmail_extra">> > > > > > On Tue, Jun 13, 2017 at 07:04:21PM +0800, JingPiao Chen wrote:</div><div class="gmail_extra">> > > > > > > +static void</div><div class="gmail_extra">> > > > > > > +test_unix_diag_req(const int fd)</div><div class="gmail_extra">> > > > > > > +{</div><div class="gmail_extra">> > > > > > > ...</div><div class="gmail_extra">> > > > > > > + /* short read of unix_diag_req */</div><div class="gmail_extra">> > > > > > > + nlh = nlh0 - (sizeof(*req) - 1);</div><div class="gmail_extra">> > > > > > > + memmove(nlh, nlh0 - sizeof(*req), NLMSG_HDRLEN + sizeof(*req) - 1);</div><div class="gmail_extra">> > > > > > > +</div><div class="gmail_extra">> > > > > > > + rc = sendto(fd, nlh, NLMSG_HDRLEN + sizeof(*req), MSG_DONTWAIT,</div><div class="gmail_extra">> > > > > > > +    NULL, 0);</div><div class="gmail_extra">> > > > > > > +</div><div class="gmail_extra">> > > > > > > + printf("sendto(%d, {{len=%u, type=SOCK_DIAG_BY_FAMILY"</div><div class="gmail_extra">> > > > > > > +       ", flags=NLM_F_REQUEST, seq=0, pid=0}, {family=AF_UNIX, %p}}"</div><div class="gmail_extra">> > > > > > > +       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",</div><div class="gmail_extra">> > > > > > > +       fd, NLMSG_HDRLEN + (unsigned int) sizeof(*req),</div><div class="gmail_extra">> > > > > > > +       NLMSG_DATA(nlh) + 1,</div><div class="gmail_extra">> > > > > > > +       NLMSG_HDRLEN + (unsigned int) sizeof(*req),</div><div class="gmail_extra">> > > > > > > +       sprintrc(rc));</div><div class="gmail_extra">> > > > > > > +}</div><div class="gmail_extra">> > > > > > ></div><div class="gmail_extra">> > > > > > > When (sizeof(*req) - 1 - sizeof(*family) > DEFAULT_STRLEN), the test</div><div class="gmail_extra">> > > > > will</div><div class="gmail_extra">> > > > > > > fail.</div><div class="gmail_extra">> > > > > ></div><div class="gmail_extra">> > > > > > Why?  In this part of the test strace is expected to print a pointer,</div><div class="gmail_extra">> > > > > > not a string, so it shouldn't be affected by DEFAULT_STRLEN.</div><div class="gmail_extra">> > > > > This fault appear when call test_inet_diag_req.</div><div class="gmail_extra">> > > > > </div><div class="gmail_extra">> > > > > Call stack is decode_inet_diag_req -->> decode_family -->> printstrn</div><div class="gmail_extra">> > > > > len = sizeof(*req) - 1 - sizeof(*family),</div><div class="gmail_extra">> > > > > When sizeof(*req) - 1 - sizeof(*family) > DEFAULT_STRLEN, umoven will</div><div class="gmail_extra">> > > > > return true, because: (util.c: 770)</div><div class="gmail_extra">> > > > > size = max_strlen + 1;</div><div class="gmail_extra">> > > > > if (size > len)</div><div class="gmail_extra">> > > > > size = len;</div><div class="gmail_extra">> > > > </div><div class="gmail_extra">> > > > I see.  Would it be better to print the address instead of the string</div><div class="gmail_extra">> > > > in case of umove failure, e.g.</div><div class="gmail_extra">> > > > </div><div class="gmail_extra">> > > > <span class="gmail-Apple-tab-span" style="white-space:pre">      </span>if (len < sizeof(msg))</div><div class="gmail_extra">> > > > <span class="gmail-Apple-tab-span" style="white-space:pre">            </span>return false;</div><div class="gmail_extra">> > > > </div><div class="gmail_extra">> > > > <span class="gmail-Apple-tab-span" style="white-space:pre">      </span>if (umove_or_printaddr(tcp, addr, &msg))</div><div class="gmail_extra">> > > > <span class="gmail-Apple-tab-span" style="white-space:pre">         </span>return true;</div><div class="gmail_extra">> > > </div><div class="gmail_extra">> > > OK, I've changed this parser a bit and pushed it again to ldv/netlink</div><div class="gmail_extra">> > > branch, please have a look.</div><div class="gmail_extra">> > Ok, thank you.</div><div class="gmail_extra">> </div><div class="gmail_extra">> ... and again, amending the last commit to simplify subsequent</div><div class="gmail_extra">> netlink_sock_diag test changes.</div><div class="gmail_extra"><br></div><div class="gmail_extra">I have some questions, why do not use:</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>if (len < sizeof(msg))</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>return false;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>if (umove_or_printaddr(tcp, addr, &msg))</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>return true;</div><div class="gmail_extra"><br></div><div class="gmail_extra">Can we remove offset?</div><div class="gmail_extra"><br></div><div class="gmail_extra">decode_unix_diag_msg(struct tcb *const tcp,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>     const struct nlmsghdr *const nlmsghdr,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>     const uint8_t family,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>     const kernel_ulong_t addr,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>     const kernel_ulong_t len)</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>struct unix_diag_msg msg;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>tprints("{udiag_family=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>printxval(addrfams, family, "AF_???");</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>tprints(", ");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>if (len >= sizeof(msg)) {</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>if (umove(tcp, addr, &msg) < 0)</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>printaddr(addr + sizeof(msg.udiag_family));</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>else {</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>tprints("udiag_type=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                        </span>printxval(socktypes, msg.udiag_type, "SOCK_???");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                      </span>tprintf(", udiag_state=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                     </span>printxval(tcp_states, msg.udiag_state, "TCP_???");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                     </span>tprintf(", udiag_ino=%" PRIu32</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                         </span>", udiag_cookie=[%" PRIu32 ", %" PRIu32 "]",</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                               </span>msg.udiag_ino,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                           </span>msg.udiag_cookie[0], msg.udiag_cookie[1]);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">               </span>}</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>} else</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>tprints("...");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>tprints("}");</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">Can we print address when len < sizeof(msg)?</div><div class="gmail_extra">Why print ... when len < sizeof(msg)?</div><div class="gmail_extra"><br></div><div class="gmail_extra">decode_unix_diag_msg(struct tcb *const tcp,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>     const struct nlmsghdr *const nlmsghdr,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">            </span>     const uint8_t family,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>     const kernel_ulong_t addr,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>     const kernel_ulong_t len)</div><div class="gmail_extra">{</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>struct unix_diag_msg msg;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>tprints("{udiag_family=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>printxval(addrfams, family, "AF_???");</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>tprints(", ");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>if (!umove(tcp, addr, &msg)) {</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">               </span>tprints("udiag_type=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>printxval(socktypes, msg.udiag_type, "SOCK_???");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">              </span>tprintf(", udiag_state=");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>printxval(tcp_states, msg.udiag_state, "TCP_???");</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>tprintf(", udiag_ino=%" PRIu32</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>", udiag_cookie=[%" PRIu32 ", %" PRIu32 "]",</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                       </span>msg.udiag_ino,</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>msg.udiag_cookie[0], msg.udiag_cookie[1]);</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>} else</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>printaddr(addr + sizeof(msg.udiag_family));</div><div class="gmail_extra"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>tprints("}");</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">--</div><div class="gmail_extra">JingPiao Chen</div></div></div>