Re: [bug report] Handle mismatched open calls

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



git.samba.org is down at the moment - will repush when it comes back up

On Fri, Apr 7, 2017 at 8:05 AM, Steve French <smfrench@xxxxxxxxx> wrote:
> merged into cifs-2.6.git for-next
>
> On Fri, Apr 7, 2017 at 7:18 AM, Sachin Prabhu <sprabhu@xxxxxxxxxx> wrote:
>> On Fri, 2017-04-07 at 11:20 +0300, Dan Carpenter wrote:
>>> Sure, that takes care of the static checker warning.  But then I had
>>> all sorts of style nits to whinge-bucket about which you didn't ask
>>> for...
>>>
>>
>> Thanks Dan,
>>
>> I have incorporated all the requested changes into version 7 of the
>> patch.
>>
>> Is smatch the only tool you use for static analysis? I am considering
>> adding it to my own dev process.
>>
>> Steve, Can you please use this version instead.
>>
>> Regards,
>> Sachin Prabhu
>>
>>
>>> On Thu, Apr 06, 2017 at 07:24:07PM +0100, Sachin Prabhu wrote:
>>> > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
>>> > index 9ae695a..131663b 100644
>>> > --- a/fs/cifs/connect.c
>>> > +++ b/fs/cifs/connect.c
>>> > @@ -904,10 +904,19 @@ cifs_demultiplex_thread(void *p)
>>> >
>>> >             server->lstrp = jiffies;
>>> >             if (mid_entry != NULL) {
>>> > +                   if ((mid_entry->mid_flags &
>>> > MID_WAIT_CANCELLED) &&
>>> > +                        mid_entry->mid_state ==
>>> > MID_RESPONSE_RECEIVED &&
>>> > +                                   (server->ops-
>>> > >handle_cancelled_mid))
>>>
>>> Extra parens are not required.  Please align it like this:
>>>
>>>                       if ((mid_entry->mid_flags & MID_WAIT_CANCELLED)
>>> &&
>>>                            mid_entry->mid_state ==
>>> MID_RESPONSE_RECEIVED &&
>>>                            server->ops->handle_cancelled_mid)
>>>
>>>
>>>
>>> > +                           server->ops->handle_cancelled_mid(
>>> > +                                                   mid_entry-
>>> > >resp_buf,
>>> > +                                                   server);
>>> > +
>>> >                     if (!mid_entry->multiRsp || mid_entry-
>>> > >multiEnd)
>>> >                             mid_entry->callback(mid_entry);
>>> > -           } else if (!server->ops->is_oplock_break ||
>>> > -                      !server->ops->is_oplock_break(buf,
>>> > server)) {
>>> > +           } else if (server->ops->is_oplock_break &&
>>> > +                      server->ops->is_oplock_break(buf,
>>> > server)) {
>>> > +                   cifs_dbg(FYI, "Received oplock break\n");
>>> > +           } else {
>>> >                     cifs_dbg(VFS, "No task to wake, unknown
>>> > frame received! NumMids %d\n",
>>> >                              atomic_read(&midCount));
>>> >                     cifs_dump_mem("Received Data is: ", buf,
>>> > diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c
>>> > index fd516ea..f50e3ef 100644
>>> > --- a/fs/cifs/smb2misc.c
>>> > +++ b/fs/cifs/smb2misc.c
>>> > @@ -659,3 +659,51 @@ smb2_is_valid_oplock_break(char *buffer,
>>> > struct TCP_Server_Info *server)
>>> >     cifs_dbg(FYI, "Can not process oplock break for non-
>>> > existent connection\n");
>>> >     return false;
>>> >  }
>>> > +
>>> > +void
>>> > +smb2_cancelled_close_fid(struct work_struct *work)
>>> > +{
>>> > +   struct close_cancelled_open *cancelled =
>>> > container_of(work,
>>> > +                                   struct
>>> > close_cancelled_open, work);
>>> > +
>>> > +   cifs_dbg(VFS, "Close unmatched open\n");
>>> > +
>>> > +   SMB2_close(0, cancelled->tcon, cancelled-
>>> > >fid.persistent_fid,
>>> > +                                      cancelled-
>>> > >fid.volatile_fid);
>>>
>>> Don't right align it.  Do it like this:
>>>
>>>       SMB2_close(0, cancelled->tcon, cancelled->fid.persistent_fid,
>>>                  cancelled->fid.volatile_fid);
>>>
>>>
>>>
>>> > +   cifs_put_tcon(cancelled->tcon);
>>> > +   kfree(cancelled);
>>> > +}
>>> > +
>>> > +int
>>> > +smb2_handle_cancelled_mid(char *buffer, struct TCP_Server_Info
>>> > *server)
>>> > +{
>>> > +   struct smb2_sync_hdr *sync_hdr = get_sync_hdr(buffer);
>>> > +   struct smb2_create_rsp *rsp = (struct smb2_create_rsp
>>> > *)buffer;
>>> > +   struct cifs_tcon *tcon;
>>> > +   struct close_cancelled_open *cancelled;
>>> > +
>>> > +   if ((sync_hdr->Command != SMB2_CREATE) ||
>>> > +           (sync_hdr->Status != STATUS_SUCCESS))
>>>
>>> No need for extra parens.  Align it like this:
>>>
>>>       if (sync_hdr->Command != SMB2_CREATE ||
>>>           sync_hdr->Status != STATUS_SUCCESS)
>>>               return 0;
>>>
>>>
>>>
>>> > +           return 0;
>>> > +
>>> > +   cancelled = (struct close_cancelled_open *)
>>> > +                   kzalloc(sizeof(struct
>>> > close_cancelled_open),
>>> > +                           GFP_KERNEL);
>>>
>>> No need to cast kzalloc.  Use sizeof(*cancelled).
>>>
>>>       cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL);
>>>
>>>
>>> > +   if (!cancelled)
>>> > +           return -ENOMEM;
>>> > +
>>> > +   tcon = smb2_find_smb_tcon(server, sync_hdr->SessionId,
>>> > +                             sync_hdr->TreeId);
>>> > +   if (!tcon) {
>>> > +           kfree(cancelled);
>>> > +           return -ENOENT;
>>> > +   }
>>> > +
>>> > +   cancelled->fid.persistent_fid = rsp->PersistentFileId;
>>> > +   cancelled->fid.volatile_fid = rsp->VolatileFileId;
>>> > +   cancelled->tcon = tcon;
>>> > +   INIT_WORK(&cancelled->work, smb2_cancelled_close_fid);
>>> > +   queue_work(cifsiod_wq, &cancelled->work);
>>> > +
>>> > +   return 0;
>>> > +}
>>>
>>> [ snip ]
>>>
>>> > diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c
>>> > index 7c3bb1b..e3c8a9c 100644
>>> > --- a/fs/cifs/smb2transport.c
>>> > +++ b/fs/cifs/smb2transport.c
>>> > @@ -115,23 +115,72 @@ smb3_crypto_shash_allocate(struct
>>> > TCP_Server_Info *server)
>>> >     return 0;
>>> >  }
>>> >
>>> > -struct cifs_ses *
>>> > -smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
>>> > +static struct cifs_ses *
>>> > +_smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
>>>
>>> Could you name this "locked" or something and get rid of the _
>>> underscore prefix?
>>>
>>> >  {
>>> >     struct cifs_ses *ses;
>>> >
>>> > -   spin_lock(&cifs_tcp_ses_lock);
>>> >     list_for_each_entry(ses, &server->smb_ses_list,
>>> > smb_ses_list) {
>>> >             if (ses->Suid != ses_id)
>>> >                     continue;
>>> > -           spin_unlock(&cifs_tcp_ses_lock);
>>> >             return ses;
>>> >     }
>>> > +
>>> > +   return NULL;
>>> > +}
>>> > +
>>> > +struct cifs_ses *
>>> > +smb2_find_smb_ses(struct TCP_Server_Info *server, __u64 ses_id)
>>> > +{
>>> > +   struct cifs_ses *ses;
>>> > +
>>> > +   spin_lock(&cifs_tcp_ses_lock);
>>> > +   ses = _smb2_find_smb_ses(server, ses_id);
>>> >     spin_unlock(&cifs_tcp_ses_lock);
>>> >
>>> > +   return ses;
>>> > +}
>>> > +
>>> > +static struct cifs_tcon *
>>> > +_smb2_find_smb_sess_tcon(struct cifs_ses *ses, __u32  tid)
>>>
>>> Just leave out the _ underscore prefix.  This is a static function so
>>> there aren't that many users and they presumably know the locking
>>> rules.
>>> For smb2_find_smb_ses we have a locked and unlocked version of the
>>> function so it makes sense to put that in the name but here there is
>>> no need I think.
>>>
>>> > +{
>>> > +   struct list_head *tmp;
>>> > +   struct cifs_tcon *tcon;
>>> > +
>>> > +   list_for_each(tmp, &ses->tcon_list) {
>>> > +           tcon = list_entry(tmp, struct cifs_tcon,
>>> > tcon_list);
>>>
>>> list_for_each_entry()?
>>>
>>> > +           if (tcon->tid != tid)
>>> > +                   continue;
>>> > +           ++tcon->tc_count;
>>> > +           return tcon;
>>> > +   }
>>> > +
>>> >     return NULL;
>>> >  }
>>> >
>>> > +/*
>>> > + * Obtain tcon corresponding to the tid in the given
>>> > + * cifs_ses
>>> > + */
>>> > +
>>> > +struct cifs_tcon *
>>> > +smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id,
>>> > __u32  tid)
>>> > +{
>>> > +   struct cifs_ses *ses;
>>> > +   struct cifs_tcon *tcon;
>>> > +
>>> > +   spin_lock(&cifs_tcp_ses_lock);
>>> > +   ses = _smb2_find_smb_ses(server, ses_id);
>>> > +   if (!ses) {
>>> > +           spin_unlock(&cifs_tcp_ses_lock);
>>> > +           return NULL;
>>> > +   }
>>> > +   tcon = _smb2_find_smb_sess_tcon(ses, tid);
>>> > +   spin_unlock(&cifs_tcp_ses_lock);
>>> > +
>>> > +   return tcon;
>>> > +}
>>> > +
>>> >  int
>>> >  smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info
>>> > *server)
>>> >  {
>>> > @@ -511,6 +560,7 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr
>>> > *shdr,
>>> >
>>> >     atomic_inc(&midCount);
>>> >     temp->mid_state = MID_REQUEST_ALLOCATED;
>>> > +   temp->mid_flags = 0;
>>>
>>> No need.  We already memset() this to zero.
>>>
>>> >     return temp;
>>> >  }
>>> >
>>> > diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
>>> > index 526f053..d82a4ae 100644
>>> > --- a/fs/cifs/transport.c
>>> > +++ b/fs/cifs/transport.c
>>> > @@ -752,9 +752,12 @@ cifs_send_recv(const unsigned int xid, struct
>>> > cifs_ses *ses,
>>> >
>>> >     rc = wait_for_response(ses->server, midQ);
>>> >     if (rc != 0) {
>>> > +           cifs_dbg(FYI, "Cancelling wait for mid %lu\n",
>>> > +                           (unsigned long)midQ->mid);
>>>
>>> ->mid is u64.  Just do this:
>>>
>>>               cifs_dbg(FYI, "Cancelling wait for mid %llu\n", midQ-
>>> >mid);
>>>
>>>
>>> >             send_cancel(ses->server, rqst, midQ);
>>> >             spin_lock(&GlobalMid_Lock);
>>> >             if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
>>> > +                   midQ->mid_flags |= MID_WAIT_CANCELLED;
>>> >                     midQ->callback = DeleteMidQEntry;
>>> >                     spin_unlock(&GlobalMid_Lock);
>>> >                     add_credits(ses->server, 1, optype);
>>>
>>> regards,
>>> dan carpenter
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-cifs"
>>> in
>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>
>
> --
> Thanks,
>
> Steve



-- 
Thanks,

Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux