Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 584d88b2 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-next' of git://git.samba.org/sfrench/cifs-2.6

Pull CIFS fixes from Steve French:
 "A set of small cifs fixes, including 3 relating to symlink handling"

* 'for-next' of git://git.samba.org/sfrench/cifs-2.6:
  cifs: don't instantiate new dentries in readdir for inodes that need to be revalidated immediately
  cifs: set sb->s_d_op before calling d_make_root()
  cifs: fix bad error handling in crypto code
  cifs: file: initialize oparms.reconnect before using it
  Do not attempt to do cifs operations reading symlinks with SMB2
  cifs: extend the buffer length enought for sprintf() using
parents fd4f35d0 757c4f62
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -43,17 +43,18 @@ cifs_crypto_shash_md5_allocate(struct TCP_Server_Info *server)
	server->secmech.md5 = crypto_alloc_shash("md5", 0, 0);
	server->secmech.md5 = crypto_alloc_shash("md5", 0, 0);
	if (IS_ERR(server->secmech.md5)) {
	if (IS_ERR(server->secmech.md5)) {
		cifs_dbg(VFS, "could not allocate crypto md5\n");
		cifs_dbg(VFS, "could not allocate crypto md5\n");
		return PTR_ERR(server->secmech.md5);
		rc = PTR_ERR(server->secmech.md5);
		server->secmech.md5 = NULL;
		return rc;
	}
	}


	size = sizeof(struct shash_desc) +
	size = sizeof(struct shash_desc) +
			crypto_shash_descsize(server->secmech.md5);
			crypto_shash_descsize(server->secmech.md5);
	server->secmech.sdescmd5 = kmalloc(size, GFP_KERNEL);
	server->secmech.sdescmd5 = kmalloc(size, GFP_KERNEL);
	if (!server->secmech.sdescmd5) {
	if (!server->secmech.sdescmd5) {
		rc = -ENOMEM;
		crypto_free_shash(server->secmech.md5);
		crypto_free_shash(server->secmech.md5);
		server->secmech.md5 = NULL;
		server->secmech.md5 = NULL;
		return rc;
		return -ENOMEM;
	}
	}
	server->secmech.sdescmd5->shash.tfm = server->secmech.md5;
	server->secmech.sdescmd5->shash.tfm = server->secmech.md5;
	server->secmech.sdescmd5->shash.flags = 0x0;
	server->secmech.sdescmd5->shash.flags = 0x0;
@@ -421,7 +422,7 @@ find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp)
		if (blobptr + attrsize > blobend)
		if (blobptr + attrsize > blobend)
			break;
			break;
		if (type == NTLMSSP_AV_NB_DOMAIN_NAME) {
		if (type == NTLMSSP_AV_NB_DOMAIN_NAME) {
			if (!attrsize)
			if (!attrsize || attrsize >= CIFS_MAX_DOMAINNAME_LEN)
				break;
				break;
			if (!ses->domainName) {
			if (!ses->domainName) {
				ses->domainName =
				ses->domainName =
@@ -591,6 +592,7 @@ CalcNTLMv2_response(const struct cifs_ses *ses, char *ntlmv2_hash)


static int crypto_hmacmd5_alloc(struct TCP_Server_Info *server)
static int crypto_hmacmd5_alloc(struct TCP_Server_Info *server)
{
{
	int rc;
	unsigned int size;
	unsigned int size;


	/* check if already allocated */
	/* check if already allocated */
@@ -600,7 +602,9 @@ static int crypto_hmacmd5_alloc(struct TCP_Server_Info *server)
	server->secmech.hmacmd5 = crypto_alloc_shash("hmac(md5)", 0, 0);
	server->secmech.hmacmd5 = crypto_alloc_shash("hmac(md5)", 0, 0);
	if (IS_ERR(server->secmech.hmacmd5)) {
	if (IS_ERR(server->secmech.hmacmd5)) {
		cifs_dbg(VFS, "could not allocate crypto hmacmd5\n");
		cifs_dbg(VFS, "could not allocate crypto hmacmd5\n");
		return PTR_ERR(server->secmech.hmacmd5);
		rc = PTR_ERR(server->secmech.hmacmd5);
		server->secmech.hmacmd5 = NULL;
		return rc;
	}
	}


	size = sizeof(struct shash_desc) +
	size = sizeof(struct shash_desc) +
+5 −6
Original line number Original line Diff line number Diff line
@@ -147,18 +147,17 @@ cifs_read_super(struct super_block *sb)
		goto out_no_root;
		goto out_no_root;
	}
	}


	if (cifs_sb_master_tcon(cifs_sb)->nocase)
		sb->s_d_op = &cifs_ci_dentry_ops;
	else
		sb->s_d_op = &cifs_dentry_ops;

	sb->s_root = d_make_root(inode);
	sb->s_root = d_make_root(inode);
	if (!sb->s_root) {
	if (!sb->s_root) {
		rc = -ENOMEM;
		rc = -ENOMEM;
		goto out_no_root;
		goto out_no_root;
	}
	}


	/* do that *after* d_make_root() - we want NULL ->d_op for root here */
	if (cifs_sb_master_tcon(cifs_sb)->nocase)
		sb->s_d_op = &cifs_ci_dentry_ops;
	else
		sb->s_d_op = &cifs_dentry_ops;

#ifdef CONFIG_CIFS_NFSD_EXPORT
#ifdef CONFIG_CIFS_NFSD_EXPORT
	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
		cifs_dbg(FYI, "export ops supported\n");
		cifs_dbg(FYI, "export ops supported\n");
+4 −0
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@
#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
#define MAX_SERVER_SIZE 15
#define MAX_SERVER_SIZE 15
#define MAX_SHARE_SIZE 80
#define MAX_SHARE_SIZE 80
#define CIFS_MAX_DOMAINNAME_LEN 256 /* max domain name length */
#define MAX_USERNAME_SIZE 256	/* reasonable maximum for current servers */
#define MAX_USERNAME_SIZE 256	/* reasonable maximum for current servers */
#define MAX_PASSWORD_SIZE 512	/* max for windows seems to be 256 wide chars */
#define MAX_PASSWORD_SIZE 512	/* max for windows seems to be 256 wide chars */


@@ -369,6 +370,9 @@ struct smb_version_operations {
	void (*generate_signingkey)(struct TCP_Server_Info *server);
	void (*generate_signingkey)(struct TCP_Server_Info *server);
	int (*calc_signature)(struct smb_rqst *rqst,
	int (*calc_signature)(struct smb_rqst *rqst,
				   struct TCP_Server_Info *server);
				   struct TCP_Server_Info *server);
	int (*query_mf_symlink)(const unsigned char *path, char *pbuf,
			unsigned int *pbytes_read, struct cifs_sb_info *cifs_sb,
			unsigned int xid);
};
};


struct smb_version_values {
struct smb_version_values {
+3 −1
Original line number Original line Diff line number Diff line
@@ -497,5 +497,7 @@ void cifs_writev_complete(struct work_struct *work);
struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages,
struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages,
						work_func_t complete);
						work_func_t complete);
void cifs_writedata_release(struct kref *refcount);
void cifs_writedata_release(struct kref *refcount);

int open_query_close_cifs_symlink(const unsigned char *path, char *pbuf,
			unsigned int *pbytes_read, struct cifs_sb_info *cifs_sb,
			unsigned int xid);
#endif			/* _CIFSPROTO_H */
#endif			/* _CIFSPROTO_H */
+4 −3
Original line number Original line Diff line number Diff line
@@ -1675,7 +1675,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
			if (string == NULL)
				goto out_nomem;
				goto out_nomem;


			if (strnlen(string, 256) == 256) {
			if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
					== CIFS_MAX_DOMAINNAME_LEN) {
				printk(KERN_WARNING "CIFS: domain name too"
				printk(KERN_WARNING "CIFS: domain name too"
						    " long\n");
						    " long\n");
				goto cifs_parse_mount_err;
				goto cifs_parse_mount_err;
@@ -2276,8 +2277,8 @@ cifs_put_smb_ses(struct cifs_ses *ses)


#ifdef CONFIG_KEYS
#ifdef CONFIG_KEYS


/* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
#define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)


/* Populate username and pw fields from keyring if possible */
/* Populate username and pw fields from keyring if possible */
static int
static int
Loading