re: [CIFS] SMB2 FSCTL and IOCTL worker function

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

 



Hello Steve French,

This is a semi-automatic email about new static checker warnings.

The patch 73ff09308dc7: "[CIFS] SMB2 FSCTL and IOCTL worker function" 
from Jun 25, 2013, leads to the following Smatch complaint:

fs/cifs/smb2pdu.c:1078 SMB2_ioctl()
	 warn: variable dereferenced before check 'tcon' (see line 1015)

fs/cifs/smb2pdu.c
  1014		struct TCP_Server_Info *server;
  1015		struct cifs_ses *ses = tcon->ses;
                                       ^^^^^^^^^
New dereference.

  1016		struct kvec iov[2];
  1017		int resp_buftype;
  1018		int num_iovecs;
  1019		int rc = 0;
  1020	
  1021		cifs_dbg(FYI, "SMB2 IOCTL\n");
  1022	
  1023		/* zero out returned data len, in case of error */
  1024		if (plen)
  1025			*plen = 0;
  1026	
  1027		if (ses && (ses->server))
  1028			server = ses->server;
  1029		else
  1030			return -EIO;
  1031	
  1032		rc = small_smb2_init(SMB2_IOCTL, tcon, (void **) &req);
  1033		if (rc)
  1034			return rc;
  1035	
  1036		req->CtlCode = cpu_to_le32(opcode);
  1037		req->PersistentFileId = persistent_fid;
  1038		req->VolatileFileId = volatile_fid;
  1039	
  1040		if (indatalen) {
  1041			req->InputCount = cpu_to_le32(indatalen);
  1042			/* do not set InputOffset if no input data */
  1043			req->InputOffset =
  1044			       cpu_to_le32(offsetof(struct smb2_ioctl_req, Buffer) - 4);
  1045			iov[1].iov_base = in_data;
  1046			iov[1].iov_len = indatalen;
  1047			num_iovecs = 2;
  1048		} else
  1049			num_iovecs = 1;
  1050	
  1051		req->OutputOffset = 0;
  1052		req->OutputCount = 0; /* MBZ */
  1053	
  1054		/* 
  1055		 * Could increase MaxOutputResponse, but that would require more
  1056		 * than one credit. Windows typically sets this smaller, but for some
  1057		 * ioctls it may be useful to allow server to send more. No point
  1058		 * limiting what the server can send as long as fits in one credit
  1059		 */
  1060		req->MaxOutputResponse = cpu_to_le32(0xFF00); /* < 64K uses 1 credit */
  1061	
  1062		if (is_fsctl)
  1063			req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL);
  1064		else
  1065			req->Flags = 0;
  1066	
  1067		iov[0].iov_base = (char *)req;
  1068		/* 4 for rfc1002 length field */
  1069		iov[0].iov_len = get_rfc1002_length(req) + 4;
  1070	
  1071		if (indatalen)
  1072			inc_rfc1001_len(req, indatalen);
  1073	
  1074		rc = SendReceive2(xid, ses, iov, num_iovecs, &resp_buftype, 0);
  1075		rsp = (struct smb2_ioctl_rsp *)iov[0].iov_base;
  1076	
  1077		if (rc != 0) {
  1078			if (tcon)
                            ^^^^
New check.

  1079				cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE);
  1080			goto ioctl_exit;

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




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

  Powered by Linux