On Fri, Jan 29, 2016 at 11:37 AM, Cong Wang <xiyou.wangc...@gmail.com> wrote: > llcp_sock_getname() checks llcp_sock->dev to make sure > llcp_sock is already connected or bound, however, we could > be in the middle of llcp_sock_bind() where llcp_sock->dev > is bound and llcp_sock->service_name_len is set, > but llcp_sock->service_name is not, in this case we would > lead to copy some bytes from a NULL pointer. > > Just lock the sock since this is not a hot path anyway. > > Reported-by: Dmitry Vyukov <dvyu...@google.com> > Cc: Lauro Ramos Venancio <lauro.venan...@openbossa.org> > Cc: Aloisio Almeida Jr <aloisio.alme...@openbossa.org> > Cc: Samuel Ortiz <sa...@linux.intel.com> > Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com>
Samuel, please take a look at this one too. > --- > net/nfc/llcp_sock.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c > index ecf0a01..b9edf5f 100644 > --- a/net/nfc/llcp_sock.c > +++ b/net/nfc/llcp_sock.c > @@ -509,6 +509,11 @@ static int llcp_sock_getname(struct socket *sock, struct > sockaddr *uaddr, > memset(llcp_addr, 0, sizeof(*llcp_addr)); > *len = sizeof(struct sockaddr_nfc_llcp); > > + lock_sock(sk); > + if (!llcp_sock->dev) { > + release_sock(sk); > + return -EBADFD; > + } > llcp_addr->sa_family = AF_NFC; > llcp_addr->dev_idx = llcp_sock->dev->idx; > llcp_addr->target_idx = llcp_sock->target_idx; > @@ -518,6 +523,7 @@ static int llcp_sock_getname(struct socket *sock, struct > sockaddr *uaddr, > llcp_addr->service_name_len = llcp_sock->service_name_len; > memcpy(llcp_addr->service_name, llcp_sock->service_name, > llcp_addr->service_name_len); > + release_sock(sk); > > return 0; > } > -- > 1.8.3.1 >