Contributors: 17
Author Tokens Token Proportion Commits Commit Proportion
David Howells 1042 43.36% 22 20.75%
Steve French 432 17.98% 28 26.42%
Pavel Shilovsky 393 16.35% 11 10.38%
Eugene Korenevsky 195 8.11% 1 0.94%
Jeff Layton 151 6.28% 17 16.04%
Suresh Jayaraman 47 1.96% 2 1.89%
Christian Brauner 46 1.91% 2 1.89%
Paulo Alcantara 29 1.21% 8 7.55%
Aurelien Aptel 20 0.83% 1 0.94%
Sachin S. Prabhu 17 0.71% 3 2.83%
Ronnie Sahlberg 9 0.37% 5 4.72%
Roberto Bergantinos Corpas 7 0.29% 1 0.94%
Shyam Prasad N 4 0.17% 1 0.94%
Kees Cook 4 0.17% 1 0.94%
Tim Gardner 3 0.12% 1 0.94%
Al Viro 2 0.08% 1 0.94%
Eric W. Biedermann 2 0.08% 1 0.94%
Total 2403 106


/* SPDX-License-Identifier: LGPL-2.1 */
/*
 *
 *   Copyright (c) International Business Machines  Corp., 2002,2008
 *   Author(s): Steve French (sfrench@us.ibm.com)
 *
 */
#ifndef _SMB1PROTO_H
#define _SMB1PROTO_H

#include <linux/uidgid_types.h>
#include <linux/unaligned.h>
#include "../common/smb2pdu.h"
#include "cifsglob.h"

struct cifs_unix_set_info_args {
	__u64	ctime;
	__u64	atime;
	__u64	mtime;
	__u64	mode;
	kuid_t	uid;
	kgid_t	gid;
	dev_t	device;
};

#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY

/*
 * cifssmb.c
 */
int small_smb_init_no_tc(const int smb_command, const int wct,
			 struct cifs_ses *ses, void **request_buf);
int CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses,
		     struct TCP_Server_Info *server);
int CIFSTCon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
	     struct cifs_tcon *tcon, const struct nls_table *nls_codepage);
int CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon);
int CIFSSMBEcho(struct TCP_Server_Info *server);
int CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses);
int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon,
		     const char *fileName, __u16 type,
		     const struct nls_table *nls_codepage, int remap);
int CIFSSMBDelFile(const unsigned int xid, struct cifs_tcon *tcon,
		   const char *name, struct cifs_sb_info *cifs_sb,
		   struct dentry *dentry);
int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon,
		 const char *name, struct cifs_sb_info *cifs_sb);
int CIFSSMBMkDir(const unsigned int xid, struct inode *inode, umode_t mode,
		 struct cifs_tcon *tcon, const char *name,
		 struct cifs_sb_info *cifs_sb);
int CIFSPOSIXCreate(const unsigned int xid, struct cifs_tcon *tcon,
		    __u32 posix_flags, __u64 mode, __u16 *netfid,
		    FILE_UNIX_BASIC_INFO *pRetData, __u32 *pOplock,
		    const char *name, const struct nls_table *nls_codepage,
		    int remap);
int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon,
		  const char *fileName, const int openDisposition,
		  const int access_flags, const int create_options,
		  __u16 *netfid, int *pOplock, FILE_ALL_INFO *pfile_info,
		  const struct nls_table *nls_codepage, int remap);
int CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms,
	      int *oplock, FILE_ALL_INFO *buf);
int cifs_async_readv(struct cifs_io_subrequest *rdata);
int CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms,
		unsigned int *nbytes, char **buf, int *pbuf_type);
int CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms,
		 unsigned int *nbytes, const char *buf);
void cifs_async_writev(struct cifs_io_subrequest *wdata);
int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
		  unsigned int *nbytes, struct kvec *iov, int n_vec);
int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon,
	       const __u16 netfid, const __u8 lock_type,
	       const __u32 num_unlock, const __u32 num_lock,
	       LOCKING_ANDX_RANGE *buf);
int CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon,
		const __u16 smb_file_id, const __u32 netpid, const __u64 len,
		const __u64 offset, const __u32 numUnlock, const __u32 numLock,
		const __u8 lockType, const bool waitFlag,
		const __u8 oplock_level);
int CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon,
		     const __u16 smb_file_id, const __u32 netpid,
		     const loff_t start_offset, const __u64 len,
		     struct file_lock *pLockData, const __u16 lock_type,
		     const bool waitFlag);
int CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon,
		 int smb_file_id);
int CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon,
		 int smb_file_id);
int CIFSSMBRename(const unsigned int xid, struct cifs_tcon *tcon,
		  struct dentry *source_dentry, const char *from_name,
		  const char *to_name, struct cifs_sb_info *cifs_sb);
int CIFSSMBRenameOpenFile(const unsigned int xid, struct cifs_tcon *pTcon,
			  int netfid, const char *target_name,
			  const struct nls_table *nls_codepage, int remap);
int CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon,
			  const char *fromName, const char *toName,
			  const struct nls_table *nls_codepage, int remap);
int CIFSUnixCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon,
			   const char *fromName, const char *toName,
			   const struct nls_table *nls_codepage, int remap);
int CIFSCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon,
		       struct dentry *source_dentry, const char *from_name,
		       const char *to_name, struct cifs_sb_info *cifs_sb);
int CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon,
			    const unsigned char *searchName,
			    char **symlinkinfo,
			    const struct nls_table *nls_codepage, int remap);
int cifs_query_reparse_point(const unsigned int xid, struct cifs_tcon *tcon,
			     struct cifs_sb_info *cifs_sb,
			     const char *full_path, u32 *tag, struct kvec *rsp,
			     int *rsp_buftype);
struct inode *cifs_create_reparse_inode(struct cifs_open_info_data *data,
					struct super_block *sb,
					const unsigned int xid,
					struct cifs_tcon *tcon,
					const char *full_path, bool directory,
					struct kvec *reparse_iov,
					struct kvec *xattr_iov);
int CIFSSMB_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
			    __u16 fid);
int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon,
		    const unsigned char *searchName, struct posix_acl **acl,
		    const int acl_type, const struct nls_table *nls_codepage,
		    int remap);
int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon,
		    const unsigned char *fileName, const struct posix_acl *acl,
		    const int acl_type, const struct nls_table *nls_codepage,
		    int remap);
int CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon,
		   const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
int CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon,
		      __u16 fid, struct smb_ntsd **acl_inf, __u32 *pbuflen,
		      __u32 info);
int CIFSSMBSetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon,
		      __u16 fid, struct smb_ntsd *pntsd, __u32 acllen,
		      int aclflag);
int SMBQueryInformation(const unsigned int xid, struct cifs_tcon *tcon,
			const char *search_name, FILE_ALL_INFO *data,
			const struct nls_table *nls_codepage, int remap);
int CIFSSMBQFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
		     u16 netfid, FILE_ALL_INFO *pFindData);
int CIFSSMBQPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
		     const char *search_name, FILE_ALL_INFO *data,
		     int legacy /* old style infolevel */,
		     const struct nls_table *nls_codepage, int remap);
int CIFSSMBUnixQFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
			 u16 netfid, FILE_UNIX_BASIC_INFO *pFindData);
int CIFSSMBUnixQPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
			 const unsigned char *searchName,
			 FILE_UNIX_BASIC_INFO *pFindData,
			 const struct nls_table *nls_codepage, int remap);
int CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon,
		  const char *searchName, struct cifs_sb_info *cifs_sb,
		  __u16 *pnetfid, __u16 search_flags,
		  struct cifs_search_info *psrch_inf, bool msearch);
int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon,
		 __u16 searchHandle, __u16 search_flags,
		 struct cifs_search_info *psrch_inf);
int CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon,
		  const __u16 searchHandle);
int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon,
			  const char *search_name, __u64 *inode_number,
			  const struct nls_table *nls_codepage, int remap);
int CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses,
		    const char *search_name,
		    struct dfs_info3_param **target_nodes,
		    unsigned int *num_of_nodes,
		    const struct nls_table *nls_codepage, int remap);
int SMBOldQFSInfo(const unsigned int xid, struct cifs_tcon *tcon,
		  struct kstatfs *FSData);
int CIFSSMBQFSInfo(const unsigned int xid, struct cifs_tcon *tcon,
		   struct kstatfs *FSData);
int CIFSSMBQFSAttributeInfo(const unsigned int xid, struct cifs_tcon *tcon);
int CIFSSMBQFSDeviceInfo(const unsigned int xid, struct cifs_tcon *tcon);
int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon);
int CIFSSMBSetFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon,
			 __u64 cap);
int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon,
			struct kstatfs *FSData);
int CIFSSMBSetEOF(const unsigned int xid, struct cifs_tcon *tcon,
		  const char *file_name, __u64 size,
		  struct cifs_sb_info *cifs_sb, bool set_allocation,
		  struct dentry *dentry);
int CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon,
		       struct cifsFileInfo *cfile, __u64 size,
		       bool set_allocation);
int SMBSetInformation(const unsigned int xid, struct cifs_tcon *tcon,
		      const char *fileName, __le32 attributes,
		      __le64 write_time, const struct nls_table *nls_codepage,
		      struct cifs_sb_info *cifs_sb);
int CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
		       const FILE_BASIC_INFO *data, __u16 fid,
		       __u32 pid_of_opener);
int CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon,
			      bool delete_file, __u16 fid,
			      __u32 pid_of_opener);
int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
		       const char *fileName, const FILE_BASIC_INFO *data,
		       const struct nls_table *nls_codepage,
		       struct cifs_sb_info *cifs_sb);
int CIFSSMBUnixSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon,
			   const struct cifs_unix_set_info_args *args, u16 fid,
			   u32 pid_of_opener);
int CIFSSMBUnixSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
			   const char *file_name,
			   const struct cifs_unix_set_info_args *args,
			   const struct nls_table *nls_codepage, int remap);
ssize_t CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon,
		       const unsigned char *searchName,
		       const unsigned char *ea_name, char *EAData,
		       size_t buf_size, struct cifs_sb_info *cifs_sb);
int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon,
		 const char *fileName, const char *ea_name,
		 const void *ea_value, const __u16 ea_value_len,
		 const struct nls_table *nls_codepage,
		 struct cifs_sb_info *cifs_sb);

/*
 * smb1debug.c
 */
void cifs_dump_detail(void *buf, size_t buf_len,
		      struct TCP_Server_Info *server);

/*
 * smb1encrypt.c
 */
int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server,
		   __u32 *pexpected_response_sequence_number);
int cifs_verify_signature(struct smb_rqst *rqst,
			  struct TCP_Server_Info *server,
			  __u32 expected_sequence_number);

/*
 * smb1maperror.c
 */
int map_smb_to_linux_error(char *buf, bool logErr);
int map_and_check_smb_error(struct TCP_Server_Info *server,
			    struct mid_q_entry *mid, bool logErr);

/*
 * smb1misc.c
 */
unsigned int header_assemble(struct smb_hdr *buffer, char smb_command,
			     const struct cifs_tcon *treeCon, int word_count);
bool is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv);
unsigned int smbCalcSize(void *buf);

/*
 * smb1ops.c
 */
extern struct smb_version_operations smb1_operations;
extern struct smb_version_values smb1_values;

void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
			  struct cifs_sb_info *cifs_sb,
			  struct smb3_fs_context *ctx);

/*
 * smb1session.c
 */
int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
		   struct TCP_Server_Info *server,
		   const struct nls_table *nls_cp);

/*
 * smb1transport.c
 */
struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *server,
					     struct smb_rqst *rqst);
int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
		     char *in_buf, unsigned int in_len, int flags);
int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
		       bool log_error);
struct mid_q_entry *cifs_setup_request(struct cifs_ses *ses,
				       struct TCP_Server_Info *server,
				       struct smb_rqst *rqst);
int SendReceive2(const unsigned int xid, struct cifs_ses *ses,
		 struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
		 const int flags, struct kvec *resp_iov);
int SendReceive(const unsigned int xid, struct cifs_ses *ses,
		struct smb_hdr *in_buf, unsigned int in_len,
		struct smb_hdr *out_buf, int *pbytes_returned,
		const int flags);
bool cifs_check_trans2(struct mid_q_entry *mid, struct TCP_Server_Info *server,
		       char *buf, int malformed);
int checkSMB(char *buf, unsigned int pdu_len, unsigned int total_read,
	     struct TCP_Server_Info *server);


static inline __u16
get_mid(const struct smb_hdr *smb)
{
	return le16_to_cpu(smb->Mid);
}

static inline bool
compare_mid(__u16 mid, const struct smb_hdr *smb)
{
	return mid == le16_to_cpu(smb->Mid);
}

#define GETU16(var)  (*((__u16 *)var))	/* BB check for endian issues */
#define GETU32(var)  (*((__u32 *)var))	/* BB check for endian issues */

/* given a pointer to an smb_hdr, retrieve a void pointer to the ByteCount */
static inline void *
BCC(struct smb_hdr *smb)
{
	return (void *)smb + sizeof(*smb) + 2 * smb->WordCount;
}

/* given a pointer to an smb_hdr retrieve the pointer to the byte area */
#define pByteArea(smb_var) (BCC(smb_var) + 2)

/* get the unconverted ByteCount for a SMB packet and return it */
static inline __u16
get_bcc(struct smb_hdr *hdr)
{
	__le16 *bc_ptr = (__le16 *)BCC(hdr);

	return get_unaligned_le16(bc_ptr);
}

/* set the ByteCount for a SMB packet in little-endian */
static inline void
put_bcc(__u16 count, struct smb_hdr *hdr)
{
	__le16 *bc_ptr = (__le16 *)BCC(hdr);

	put_unaligned_le16(count, bc_ptr);
}

#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */

#endif /* _SMB1PROTO_H */