<div dir="ltr"><div>On Wed, Jul 19, 2017 at 06:30:41AM +0300, Dmitry V. Levin wrote:</div><div>> On Wed, Jul 19, 2017 at 11:07:19AM +0800, JingPiao Chen wrote:</div><div>> > Extended ACK reporting introduced by linux kernel commit</div><div>> > v4.11-rc5-1382-g2d4bc93.</div><div>> > </div><div>> > * netlink.h (NLM_F_CAPPED): New macro.</div><div>> > * netlink.c (decode_payload): Pass</div><div>> > nlmsghdr->nlmsg_flags & NLM_F_CAPPED to decode_nlmsgerr.</div><div>> > (decode_nlmsgerr): Adjust the length pass to</div><div>> > decode_nlmsghdr_with_payload.</div><div>> > ---</div><div>> >  netlink.c | 14 +++++++++++---</div><div>> >  netlink.h |  4 ++++</div><div>> >  2 files changed, 15 insertions(+), 3 deletions(-)</div><div>> > </div><div>> > diff --git a/netlink.c b/netlink.c</div><div>> > index d3ad8b0..122422b 100644</div><div>> > --- a/netlink.c</div><div>> > +++ b/netlink.c</div><div>> > @@ -297,7 +297,8 @@ decode_nlmsgerr(struct tcb *const tcp,</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">              </span>const int fd,</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">              </span>const int family,</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">          </span>kernel_ulong_t addr,</div><div>> > -<span class="gmail-Apple-tab-span" style="white-space:pre">                </span>kernel_ulong_t len)</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">         </span>kernel_ulong_t len,</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">         </span>const bool capped)</div><div>> >  {</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>struct nlmsgerr err;</div><div>> >  </div><div>> > @@ -320,10 +321,16 @@ decode_nlmsgerr(struct tcb *const tcp,</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">       </span>len -= offsetof(struct nlmsgerr, msg);</div><div>> >  </div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">  </span>if (len) {</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">          </span>unsigned int payload = len;</div><div>> > +</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">              </span>tprints(", msg=");</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">               </span>if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) {</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>payload = capped ? sizeof(err.msg) : err.msg.nlmsg_len;</div><div>> </div><div>> Subsequent decode_nlmsghdr_with_payload call already does all necessary</div><div>> checks, why do you bother with err.msg.nlmsg_len here?</div><div><br></div><div>I need to get the length of nlmsgerr attribute ([PATCH v2 3/4]).</div><div><br></div><div>net/netlink/af_netlink.c:</div><div>void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err,</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">               </span> const struct netlink_ext_ack *extack)</div><div>{</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>...</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>struct nlmsgerr *errmsg;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>size_t payload = sizeof(*errmsg);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>...</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>if (err) {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>if (!(nlk->flags & NETLINK_F_CAP_ACK))</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                  </span>payload += nlmsg_len(nlh);</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">             </span>else</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>flags |= NLM_F_CAPPED;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>...</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>} else {</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">               </span>flags |= NLM_F_CAPPED;</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">         </span>...</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>}</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>...</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>memcpy(&errmsg->msg, nlh, payload > sizeof(*errmsg) ? nlh->nlmsg_len : sizeof(*nlh));</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>...</div><div>}</div><div><br></div><div>the length of payload is sizeof(struct nlmsghdr) or err.msg.nlmsg_len.</div><div><br></div><div>> </div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">                     </span>if (payload > len)</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">                               </span>payload = len;</div><div>> </div><div>> Consider this instead:</div><div>> </div><div>> <span class="gmail-Apple-tab-span" style="white-space:pre">                </span>const unsigned int payload =</div><div>> <span class="gmail-Apple-tab-span" style="white-space:pre">                      </span>(capped && sizeof(err.msg) < len) ? sizeof(err.msg) : len;</div><div>> </div><div><br></div><div>You means:</div><div><br></div><div>diff --git a/netlink.c b/netlink.c</div><div>index d3ad8b0..cd6f40c 100644</div><div>--- a/netlink.c</div><div>+++ b/netlink.c</div><div>@@ -322,8 +323,11 @@ decode_nlmsgerr(struct tcb *const tcp,</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>if (len) {</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">           </span>tprints(", msg=");</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">         </span>if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) {</div><div>+<span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>const unsigned int payload =</div><div>+<span class="gmail-Apple-tab-span" style="white-space:pre">                          </span>(capped && sizeof(err.msg) < len) ? sizeof(err.msg) : len;</div><div>+</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">                        </span>decode_nlmsghdr_with_payload(tcp, fd, family,</div><div>-<span class="gmail-Apple-tab-span" style="white-space:pre">                                         </span>     &err.msg, addr, len);</div><div>+<span class="gmail-Apple-tab-span" style="white-space:pre">                                              </span>     &err.msg, addr, payload);</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">         </span>}</div><div> <span class="gmail-Apple-tab-span" style="white-space:pre">    </span>}</div><div><br></div><div>Can not get the attribute length.</div><div><br></div><div>> > +</div><div>> >  <span class="gmail-Apple-tab-span" style="white-space:pre">                      </span>decode_nlmsghdr_with_payload(tcp, fd, family,</div><div>> > -<span class="gmail-Apple-tab-span" style="white-space:pre">                                               </span>     &err.msg, addr, len);</div><div>> > +<span class="gmail-Apple-tab-span" style="white-space:pre">                                            </span>     &err.msg, addr, payload);</div><div>> </div><div><br></div><div>--</div><div>JingPiao Chen</div></div>