FAILED: patch "[PATCH] smb: client: reject a tree connect response whose byte count" failed to apply to 6.18-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 65deb18359341141d37dc86fc7853511be3c87a7
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090335-figure-bright-e488@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 65deb18359341141d37dc86fc7853511be3c87a7 Mon Sep 17 00:00:00 2001
From: Bryam Vargas <[email protected]>
Date: Fri, 21 Aug 2026 07:36:16 -0500
Subject: [PATCH] smb: client: reject a tree connect response whose byte count
is too small
CIFSTCon() bounds its strnlen() over the byte area with the server's ByteCount minus two, which for ByteCount 0 or 1 goes negative as an int and converts to a huge size_t. The later subtraction wraps the __u16 bytes_left, and that is what bounds cifs_strndup_from_utf16(): a bound of up to 65535 against a ~16 KB cifs_req_poolp object runs off the end of the slab object, and the bytes reach userspace through tcon->nativeFileSystem in /proc/fs/cifs/DebugData.
Reject a byte area too small for what the parser consumes. Two bytes is the least it can consume, and no conformant response carries fewer. The new trace point is the 129th smb_eio_trace entry, which __mode(byte) cannot represent, so the attribute goes with it.
fs/smb/client/cifssmb.c +6 -0
@@ -615,6 +615,11 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses, tcon->tid = smb_buffer_response->Tid; bcc_ptr =pByteArea (smb_buffer_response); bytes_left =get_bcc (smb_buffer_response); +if (bytes_left <2 ) { + rc =smb_EIO2 (smb_eio_trace_tcon_bcc_too_small, + bytes_left,2 ); + goto out; + } length =strnlen (bcc_ptr, bytes_left -2 );if (smb_buffer->Flags2 &SMBFLG2_UNICODE ) is_unicode = true;
@@ -670,6 +675,7 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,reset_cifs_unix_caps (xid, tcon,NULL ,NULL ); } } +out:cifs_buf_release (smb_buffer);return rc; }
fs/smb/client/trace.h +2 -1
@@ -133,6 +133,7 @@ EM(smb_eio_trace_sym_slash, "sym_slash") \ EM(smb_eio_trace_sym_target_len, "sym_target_len") \ EM(smb_eio_trace_symlink_file_size, "symlink_file_size") \ + EM(smb_eio_trace_tcon_bcc_too_small, "tcon_bcc_too_small") \ EM(smb_eio_trace_tdis_in_reconnect, "tdis_in_reconnect") \ EM(smb_eio_trace_tx_chained_async, "tx_chained_async") \EM (smb_eio_trace_tx_compress_failed,"tx_compress_failed" ) \
@@ -213,7 +214,7 @@#define EM (a, b) a,#define E_ (a, b) a -enum smb_eio_trace { smb_eio_traces }__mode (byte ); +enum smb_eio_trace { smb_eio_traces };enum smb3_rw_credits_trace { smb3_rw_credits_traces }__mode (byte );enum smb3_tcon_ref_trace { smb3_tcon_ref_traces }__mode (byte );
Sasha Levin
maintainerPATCH 1/4 cifs: Do some preparation prior to organising the function declarations
From: David Howells <[email protected]>
[ Upstream commit 32a60868093aed5ccaa5e57f3b57f791f22ac133 ]
Make some preparatory cleanups prior to running a script to organise the function declarations within the fs/smb/client/ headers. These include:
(1) Remove "inline" from the dummy cifs_proc_init/clean() functions as they are in a .c file.
(2) Move should_compress()'s kdoc comment to the .c file and remove kdoc markers from the comments.
(3) Rename CIFS_ALLOW_INSECURE_LEGACY in #endif comments to have CONFIG_ on the front to allow the script to recognise it.
(4) Don't let comments have bare words at the left margin as that confused the simplistic function detection code in the script.
(5) Adjust some argument lists so that when and if the cleanup script is run they don't end up over 100 chars.
(6) Fix a few comments to have missing '*' added or the "*/" moved to their own lines so that checkpatch doesn't moan over the cleanup script patch.
(7) Move struct cifs_calc_sig_ctx to cifsglob.h.
(8) Remove some __KERNEL__ conditionals.
Stable-dep-of: 65deb1835934 ("smb: client: reject a tree connect response whose byte count is too small")
--- fs/smb/client/cifs_debug.c | 4 +- fs/smb/client/cifs_spnego.h | 2 - fs/smb/client/cifs_unicode.h | 3 - fs/smb/client/cifsfs.c | 5 +- fs/smb/client/cifsglob.h | 8 +- fs/smb/client/cifsproto.h | 12 +-- fs/smb/client/cifssmb.c | 140 ++++++++++++++++++++++++++++++++ fs/smb/client/compress.c | 21 ++++- fs/smb/client/compress.h | 19 +---- fs/smb/client/connect.c | 142 --------------------------------- fs/smb/client/dir.c | 2 +- fs/smb/client/dns_resolve.h | 4 - fs/smb/client/fs_context.c | 2 +- fs/smb/client/misc.c | 1 + fs/smb/client/netmisc.c | 2 +- fs/smb/client/smb2file.c | 3 +- fs/smb/client/smb2inode.c | 1 - fs/smb/client/smb2maperror.c | 3 +- fs/smb/client/smb2ops.c | 4 +- fs/smb/client/smb2pdu.c | 5 +- fs/smb/client/smb2proto.h | 2 + fs/smb/client/trace.h | 150 +++++++++++++++++++++++++++++++++++ 22 files changed, 342 insertions(+), 193 deletions(-)
fs/smb/client/cifs_debug.c +2 -2
@@ -1307,11 +1307,11 @@ static const struct proc_ops cifs_mount_params_proc_ops = { };#else -inline void cifs_proc_init (void ) +void cifs_proc_init (void ) { } -inline void cifs_proc_clean (void ) +void cifs_proc_clean (void ) { }#endif /* PROC_FS */
fs/smb/client/cifs_spnego.h +0 -2
@@ -27,10 +27,8 @@ struct cifs_spnego_msg { uint8_t data[]; }; -#ifdef __KERNEL__extern struct key_type cifs_spnego_key_type;extern struct key *cifs_get_spnego_key (struct cifs_ses *sesInfo,struct TCP_Server_Info *server); -#endif /* KERNEL */ #endif /* _CIFS_SPNEGO_H */
fs/smb/client/cifs_unicode.h +0 -3
@@ -54,7 +54,6 @@#define SFM_MAP_UNI_RSVD 1#define SFU_MAP_UNI_RSVD 2 -#ifdef __KERNEL__int cifs_from_utf16 (char *to,const __le16 *from,int tolen,int fromlen,const struct nls_table *cp,int map_type); int cifs_utf16_bytes(const __le16 *from, int maxbytes,
@@ -69,8 +68,6 @@ extern int cifs_remap(struct cifs_sb_info *cifs_sb);extern __le16 *cifs_strndup_to_utf16 (const char *src,const int maxlen,int *utf16_len,const struct nls_table *cp,int remap); -#endif -wchar_t cifs_toupper (wchar_t in);#endif /* _CIFS_UNICODE_H */
fs/smb/client/cifsfs.c +3 -2
@@ -28,6 +28,8 @@#include <linux/splice.h> #include <linux/uuid.h> #include <linux/xattr.h> +#include <linux/mm.h> +#include <linux/key-type.h> #include <uapi/linux/magic.h> #include <net/ipv6.h> #include "cifsfs.h"
@@ -35,10 +37,9 @@#define DECLARE_GLOBALS_HERE #include "cifsglob.h" #include "cifsproto.h" +#include "smb2proto.h" #include "cifs_debug.h" #include "cifs_fs_sb.h" -#include <linux/mm.h> -#include <linux/key-type.h> #include "cifs_spnego.h" #include "fscache.h" #ifdef CONFIG_CIFS_DFS_UPCALL
fs/smb/client/cifsglob.h +7 -1
@@ -2114,7 +2114,7 @@ extern struct smb_version_operations smb1_operations;extern struct smb_version_values smb1_values;extern struct smb_version_operations smb20_operations;extern struct smb_version_values smb20_values; -#endif /* CIFS_ALLOW_INSECURE_LEGACY */ +#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ extern struct smb_version_operations smb21_operations;extern struct smb_version_values smb21_values;extern struct smb_version_values smbdefault_values;
@@ -2385,4 +2385,10 @@ static inline int cifs_open_create_options(unsigned int oflags, int opts)*/ #define CIFS_INO_BLOCKS (size) DIV_ROUND_UP_ULL((u64)(size), 512) +struct cifs_calc_sig_ctx { +struct md5_ctx *md5; +struct hmac_sha256_ctx *hmac; +struct shash_desc *shash; +}; +#endif /* _CIFS_GLOB_H */
fs/smb/client/cifsproto.h +6 -6
@@ -604,7 +604,7 @@ extern int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nls_codepage, int remap);extern int CIFSGetExtAttr (const unsigned int xid,struct cifs_tcon *tcon,const int netfid,__u64 *pExtAttrBits,__u64 *pMask); -#endif /* CIFS_ALLOW_INSECURE_LEGACY */ +#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ extern void cifs_autodisable_serverino (struct cifs_sb_info *cifs_sb);extern bool couldbe_mf_symlink (const struct cifs_fattr *fattr); extern int check_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
@@ -636,11 +636,6 @@ int cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, unsigned int *pbytes_written); -struct cifs_calc_sig_ctx { -struct md5_ctx *md5; -struct hmac_sha256_ctx *hmac; -struct shash_desc *shash; -};int __cifs_calc_signature (struct smb_rqst *rqst,struct TCP_Server_Info *server,char *signature,struct cifs_calc_sig_ctx *ctx); enum securityEnum cifs_select_sectype(struct TCP_Server_Info *,
@@ -790,4 +785,9 @@ static inline void cifs_free_open_info(struct cifs_open_info_data *data) memset(data, 0, sizeof(*data)); } +#define smb_EIO2 (trace, info, info2) ({ \ + trace_smb3_eio(trace, info, info2); \ + -EIO; \ +}) +#endif /* _CIFSPROTO_H */
fs/smb/client/cifssmb.c +140 -0
146 lines not on this page · raw message
fs/smb/client/compress.c +18 -3
@@ -44,7 +44,7 @@ struct bucket {unsigned int count; }; -/** +/* * has_low_entropy() - Compute Shannon entropy of the sampled data. * @bkt: Bytes counts of the sample. * @slen: Size of the sample.
@@ -82,7 +82,7 @@ static bool has_low_entropy(struct bucket *bkt, size_t slen)#define BYTE_DIST_BAD 0#define BYTE_DIST_GOOD 1#define BYTE_DIST_MAYBE 2 -/** +/* * calc_byte_distribution() - Compute byte distribution on the sampled data. * @bkt: Byte counts of the sample. * @slen: Size of the sample.
@@ -182,7 +182,7 @@ static int collect_sample(const struct iov_iter *source, ssize_t max, u8 *samplereturn s; } -/** +/* * is_compressible() - Determines if a chunk of data is compressible. * @data: Iterator containing uncompressed data. *
@@ -261,6 +261,21 @@ static bool is_compressible(const struct iov_iter *data)return ret; } +/* +* should_compress() - Determines if a request (write) or the response to a +* request (read) should be compressed. +* @tcon: tcon of the request is being sent to +* @rqst: request to evaluate +* +* Return: true iff: +* - compression was successfully negotiated with server +* - server has enabled compression for the share +* - it's a read or write request +* - (write only) request length is >= SMB_COMPRESS_MIN_LEN +* - (write only) is_compressible() returns 1 +* +* Return false otherwise. +*/ bool should_compress (const struct cifs_tcon *tcon,const struct smb_rqst *rq) {const struct smb2_hdr *shdr = rq->rq_iov->iov_base;
fs/smb/client/compress.h +2 -17
@@ -29,26 +29,11 @@#ifdef CONFIG_CIFS_COMPRESSION typedef int (*compress_send_fn )(struct TCP_Server_Info *,int ,struct smb_rqst *); -int smb_compress (struct TCP_Server_Info *server,struct smb_rqst *rq,compress_send_fn send_fn); -/** -* should_compress() - Determines if a request (write) or the response to a -* request (read) should be compressed. -* @tcon: tcon of the request is being sent to -* @rqst: request to evaluate -* -* Return: true iff: -* - compression was successfully negotiated with server -* - server has enabled compression for the share -* - it's a read or write request -* - (write only) request length is >= SMB_COMPRESS_MIN_LEN -* - (write only) is_compressible() returns 1 -* -* Return false otherwise. -*/ +int smb_compress (struct TCP_Server_Info *server,struct smb_rqst *rq,compress_send_fn send_fn);bool should_compress (const struct cifs_tcon *tcon,const struct smb_rqst *rq); -/** +/* * smb_compress_alg_valid() - Validate a compression algorithm. * @alg: Compression algorithm to check. * @valid_none: Conditional check whether NONE algorithm should be
fs/smb/client/connect.c +0 -142
148 lines not on this page · raw message
fs/smb/client/dir.c +1 -1
@@ -458,7 +458,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsignedint cifs_atomic_open (struct inode *inode,struct dentry *direntry, -struct file *file,unsigned oflags,umode_t mode) +struct file *file,unsigned int oflags,umode_t mode) {int rc;unsigned int xid;
fs/smb/client/dns_resolve.h +0 -4
@@ -15,8 +15,6 @@#include "cifsglob.h" #include "cifsproto.h" -#ifdef __KERNEL__ -int dns_resolve_name (const char *dom,const char *name,size_t namelen,struct sockaddr *ip_addr);
@@ -36,6 +34,4 @@ static inline int dns_resolve_unc(const char *dom, const char *unc, return dns_resolve_name(dom, name, namelen, ip_addr); } -#endif /* KERNEL */ -#endif /* _DNS_RESOLVE_H */
fs/smb/client/fs_context.c +1 -1
@@ -505,7 +505,7 @@ cifs_parse_smb_version(struct fs_context *fc, char *value, struct smb3_fs_contexcase Smb_20:cifs_errorf (fc,"vers=2.0 mount not permitted when legacy dialects disabled\n" );return 1 ; -#endif /* CIFS_ALLOW_INSECURE_LEGACY */ +#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ case Smb_21: ctx->ops = &smb21_operations; ctx->vals = &smb21_values;
fs/smb/client/misc.c +1 -0
@@ -18,6 +18,7 @@#include "nterr.h" #include "cifs_unicode.h" #include "smb2pdu.h" +#include "smb2proto.h" #include "cifsfs.h" #ifdef CONFIG_CIFS_DFS_UPCALL #include "dns_resolve.h"
fs/smb/client/netmisc.c +1 -1
@@ -200,7 +200,7 @@ cifs_set_port(struct sockaddr *addr, const unsigned short int port) }/***************************************************************************** -convert a NT status code to a dos class/code +*convert a NT status code to a dos class/code *****************************************************************************/ /* NT status -> dos error map */ static const struct {
fs/smb/client/smb2file.c +2 -1
@@ -160,7 +160,8 @@ int smb2_parse_symlink_response(struct cifs_sb_info *cifs_sb, const struct kvec cifs_sb); } -int smb2_open_file (const unsigned int xid,struct cifs_open_parms *oparms,__u32 *oplock,void *buf) +int smb2_open_file (const unsigned int xid,struct cifs_open_parms *oparms, +__u32 *oplock,void *buf) {int rc;__le16 *smb2_path;
fs/smb/client/smb2inode.c +0 -1
@@ -21,7 +21,6 @@#include "cifs_unicode.h" #include "fscache.h" #include "smb2glob.h" -#include "smb2pdu.h" #include "smb2proto.h" #include "cached_dir.h" #include "../common/smb2status.h"
fs/smb/client/smb2maperror.c +1 -2
@@ -10,10 +10,9 @@#include <linux/errno.h> #include "cifsglob.h" #include "cifs_debug.h" -#include "smb2pdu.h" #include "smb2proto.h" -#include "../common/smb2status.h" #include "smb2glob.h" +#include "../common/smb2status.h" #include "trace.h" struct status_to_posix_error {
fs/smb/client/smb2ops.c +2 -2
@@ -17,9 +17,9 @@#include <uapi/linux/magic.h> #include "cifsfs.h" #include "cifsglob.h" -#include "smb2pdu.h" -#include "smb2proto.h" #include "cifsproto.h" +#include "smb2proto.h" +#include "smb2pdu.h" #include "cifs_debug.h" #include "cifs_unicode.h" #include "../common/smb2status.h"
fs/smb/client/smb2pdu.c +3 -2
@@ -26,8 +26,8 @@#include <linux/netfs.h> #include <trace/events/netfs.h> #include "cifsglob.h" -#include "cifsacl.h" #include "cifsproto.h" +#include "cifsacl.h" #include "smb2proto.h" #include "cifs_unicode.h" #include "cifs_debug.h"
@@ -3921,7 +3921,8 @@ int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,/* currently unused, as now we are doing compounding instead (see smb311_posix_query_path_info) */ int SMB311_posix_query_info (const unsigned int xid,struct cifs_tcon *tcon, -u64 persistent_fid,u64 volatile_fid,struct smb311_posix_qinfo *data,u32 *plen) +u64 persistent_fid,u64 volatile_fid, +struct smb311_posix_qinfo *data,u32 *plen) {size_t output_len =sizeof (struct smb311_posix_qinfo ) + (sizeof (struct smb_sid ) *2 ) + (PATH_MAX *2 );
fs/smb/client/smb2proto.h +2 -0
@@ -9,8 +9,10 @@*/ #ifndef _SMB2PROTO_H#define _SMB2PROTO_H +#include <linux/nls.h> #include <linux/key-type.h> +#include "cached_dir.h" struct statfs ;struct smb_rqst ;
fs/smb/client/trace.h +150 -0
174 lines not on this page · raw message
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/4 cifs: Remove dead function prototypes
From: David Howells <[email protected]>
[ Upstream commit 9146c7e53fa8e5024e0f61d67129afd45a179a3b ]
Remove a bunch of dead function prototypes.
Stable-dep-of: 65deb1835934 ("smb: client: reject a tree connect response whose byte count is too small")
--- fs/smb/client/cifsproto.h | 6 ------ fs/smb/client/smb2proto.h | 12 ------------ 2 files changed, 18 deletions(-)
fs/smb/client/cifsproto.h +0 -6
@@ -82,7 +82,6 @@ extern char *cifs_build_path_to_root(struct smb3_fs_context *ctx,struct cifs_sb_info *cifs_sb, struct cifs_tcon *tcon, int add_treename); -extern char *build_wildcard_path_from_dentry (struct dentry *direntry);char *cifs_build_devname (char *nodename,const char *prepath);extern void delete_mid (struct mid_q_entry *mid);void __release_mid (struct kref *refcount);
@@ -166,8 +165,6 @@ extern bool is_valid_oplock_break(char *, struct TCP_Server_Info *);extern bool backup_cred (struct cifs_sb_info *);extern bool is_size_safe_to_change (struct cifsInodeInfo *cifsInode,__u64 eof,bool from_readdir); -extern void cifs_update_eof (struct cifsInodeInfo *cifsi,loff_t offset, -unsigned int bytes_written);void cifs_write_subrequest_terminated (struct cifs_io_subrequest *wdata,ssize_t result);extern struct cifsFileInfo *find_writable_file (struct cifsInodeInfo *,int ); extern int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode,
@@ -194,8 +191,6 @@ extern void header_assemble(struct smb_hdr *, char /* command */ ,extern int small_smb_init_no_tc (const int smb_cmd,const int wct,struct cifs_ses *ses,void **request_buf); -extern enum securityEnum select_sectype (struct TCP_Server_Info *server, -enum securityEnum requested);extern int CIFS_SessSetup (const unsigned int xid,struct cifs_ses *ses,struct TCP_Server_Info *server,const struct nls_table *nls_cp);
@@ -646,7 +641,6 @@ void cifs_free_hash(struct shash_desc **sdesc);int cifs_try_adding_channels (struct cifs_ses *ses);bool is_ses_using_iface (struct cifs_ses *ses,struct cifs_server_iface *iface); -void cifs_ses_mark_for_reconnect (struct cifs_ses *ses); int cifs_ses_get_chan_index(struct cifs_ses *ses,
fs/smb/client/smb2proto.h +0 -12
@@ -41,15 +41,11 @@ extern struct mid_q_entry *smb2_setup_async_request( struct TCP_Server_Info *server, struct smb_rqst *rqst);extern struct cifs_tcon *smb2_find_smb_tcon (struct TCP_Server_Info *server,__u64 ses_id,__u32 tid); -extern void smb2_echo_request (struct work_struct *work);extern __le32 smb2_get_lease_state (struct cifsInodeInfo *cinode);extern bool smb2_is_valid_oplock_break (char *buffer,struct TCP_Server_Info *srv);extern int smb3_handle_read_data (struct TCP_Server_Info *server,struct mid_q_entry *mid); -extern int smb2_query_reparse_tag (const unsigned int xid,struct cifs_tcon *tcon, -struct cifs_sb_info *cifs_sb,const char *path, -__u32 *reparse_tag); struct inode *smb2_create_reparse_inode(struct cifs_open_info_data *data, struct super_block *sb, const unsigned int xid,
@@ -302,17 +298,9 @@ extern int smb2_query_info_compound(const unsigned int xid, struct kvec *rsp, int *buftype, struct cifs_sb_info *cifs_sb);/* query path info from the server using SMB311 POSIX extensions*/ -int smb311_posix_query_path_info (const unsigned int xid, -struct cifs_tcon *tcon, -struct cifs_sb_info *cifs_sb, -const char *full_path, -struct cifs_open_info_data *data);int posix_info_parse (const void *beg,const void *end,struct smb2_posix_info_parsed *out);int posix_info_sid_size (const void *beg,const void *end); -int smb2_make_nfs_node (unsigned int xid,struct inode *inode, -struct dentry *dentry,struct cifs_tcon *tcon, -const char *full_path,umode_t mode,dev_t dev);int smb2_rename_pending_delete (const char *full_path,struct dentry *dentry,const unsigned int xid);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/4 cifs: Scripted clean up fs/smb/client/fscache.h
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit bc3de356aae666de5d8b5131545be87cf7754431 ]
Remove externs, correct argument names and reformat declarations.
Stable-dep-of: 65deb1835934 ("smb: client: reject a tree connect response whose byte count is too small")
--- fs/smb/client/fscache.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/smb/client/fscache.h +5 -5
@@ -38,12 +38,12 @@ struct cifs_fscache_inode_coherency_data {/* * fscache.c */ -extern int cifs_fscache_get_super_cookie (struct cifs_tcon *); -extern void cifs_fscache_release_super_cookie (struct cifs_tcon *); +int cifs_fscache_get_super_cookie (struct cifs_tcon *tcon); +void cifs_fscache_release_super_cookie (struct cifs_tcon *tcon); -extern void cifs_fscache_get_inode_cookie (struct inode *inode); -extern void cifs_fscache_release_inode_cookie (struct inode *); -extern void cifs_fscache_unuse_inode_cookie (struct inode *inode,bool update); +void cifs_fscache_get_inode_cookie (struct inode *inode); +void cifs_fscache_release_inode_cookie (struct inode *inode); +void cifs_fscache_unuse_inode_cookie (struct inode *inode,bool update); static inline void cifs_fscache_fill_coherency(struct inode *inode,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/4 smb: client: reject a tree connect response whose byte count is too small
In reply to Sasha LevinFrom: Bryam Vargas <[email protected]>
[ Upstream commit 65deb18359341141d37dc86fc7853511be3c87a7 ]
CIFSTCon() bounds its strnlen() over the byte area with the server's ByteCount minus two, which for ByteCount 0 or 1 goes negative as an int and converts to a huge size_t. The later subtraction wraps the __u16 bytes_left, and that is what bounds cifs_strndup_from_utf16(): a bound of up to 65535 against a ~16 KB cifs_req_poolp object runs off the end of the slab object, and the bytes reach userspace through tcon->nativeFileSystem in /proc/fs/cifs/DebugData.
Reject a byte area too small for what the parser consumes. Two bytes is the least it can consume, and no conformant response carries fewer. The new trace point is the 129th smb_eio_trace entry, which __mode(byte) cannot represent, so the attribute goes with it.
--- fs/smb/client/cifssmb.c | 6 ++++++ fs/smb/client/trace.h | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-)
fs/smb/client/cifssmb.c +6 -0
@@ -608,6 +608,11 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses, tcon->tid = smb_buffer_response->Tid; bcc_ptr =pByteArea (smb_buffer_response); bytes_left =get_bcc (smb_buffer_response); +if (bytes_left <2 ) { + rc =smb_EIO2 (smb_eio_trace_tcon_bcc_too_small, + bytes_left,2 ); + goto out; + } length =strnlen (bcc_ptr, bytes_left -2 );if (smb_buffer->Flags2 &SMBFLG2_UNICODE ) is_unicode = true;
@@ -663,6 +668,7 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,reset_cifs_unix_caps (xid, tcon,NULL ,NULL ); } } +out:cifs_buf_release (smb_buffer);return rc; }
fs/smb/client/trace.h +2 -1
@@ -133,6 +133,7 @@ EM(smb_eio_trace_sym_slash, "sym_slash") \ EM(smb_eio_trace_sym_target_len, "sym_target_len") \ EM(smb_eio_trace_symlink_file_size, "symlink_file_size") \ + EM(smb_eio_trace_tcon_bcc_too_small, "tcon_bcc_too_small") \ EM(smb_eio_trace_tdis_in_reconnect, "tdis_in_reconnect") \ EM(smb_eio_trace_tx_chained_async, "tx_chained_async") \EM (smb_eio_trace_tx_compress_failed,"tx_compress_failed" ) \
@@ -214,7 +215,7 @@#define EM (a, b) a,#define E_ (a, b) a -enum smb_eio_trace { smb_eio_traces }__mode (byte ); +enum smb_eio_trace { smb_eio_traces };enum smb3_rw_credits_trace { smb3_rw_credits_traces }__mode (byte );enum smb3_tcon_ref_trace { smb3_tcon_ref_traces }__mode (byte );
Signature · 1 line
2.53.0