| From linkinjeon@gmail.com Mon Dec 18 16:39:51 2023 |
| From: Namjae Jeon <linkinjeon@kernel.org> |
| Date: Tue, 19 Dec 2023 00:33:44 +0900 |
| Subject: ksmbd: avoid duplicate negotiate ctx offset increments |
| To: gregkh@linuxfoundation.org, stable@vger.kernel.org |
| Cc: smfrench@gmail.com, David Disseldorp <ddiss@suse.de>, Namjae Jeon <linkinjeon@kernel.org>, Steve French <stfrench@microsoft.com> |
| Message-ID: <20231218153454.8090-85-linkinjeon@kernel.org> |
| |
| From: David Disseldorp <ddiss@suse.de> |
| |
| [ Upstream commit a12a07a85aff72e19520328f78b1c64d2281a1ec ] |
| |
| Both pneg_ctxt and ctxt_size change in unison, with each adding the |
| length of the previously added context, rounded up to an eight byte |
| boundary. |
| Drop pneg_ctxt increments and instead use the ctxt_size offset when |
| passing output pointers to per-context helper functions. This slightly |
| simplifies offset tracking and shaves off a few text bytes. |
| Before (x86-64 gcc 7.5): |
| text data bss dec hex filename |
| 213234 8677 672 222583 36577 ksmbd.ko |
| |
| After: |
| text data bss dec hex filename |
| 213218 8677 672 222567 36567 ksmbd.ko |
| |
| Signed-off-by: David Disseldorp <ddiss@suse.de> |
| Acked-by: Namjae Jeon <linkinjeon@kernel.org> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ksmbd/smb2pdu.c | 26 ++++++++++---------------- |
| 1 file changed, 10 insertions(+), 16 deletions(-) |
| |
| --- a/fs/ksmbd/smb2pdu.c |
| +++ b/fs/ksmbd/smb2pdu.c |
| @@ -839,7 +839,7 @@ static void assemble_neg_contexts(struct |
| struct smb2_negotiate_rsp *rsp, |
| void *smb2_buf_len) |
| { |
| - char *pneg_ctxt = (char *)rsp + |
| + char * const pneg_ctxt = (char *)rsp + |
| le32_to_cpu(rsp->NegotiateContextOffset); |
| int neg_ctxt_cnt = 1; |
| int ctxt_size; |
| @@ -850,21 +850,17 @@ static void assemble_neg_contexts(struct |
| conn->preauth_info->Preauth_HashId); |
| inc_rfc1001_len(smb2_buf_len, AUTH_GSS_PADDING); |
| ctxt_size = sizeof(struct smb2_preauth_neg_context); |
| - /* Round to 8 byte boundary */ |
| - pneg_ctxt += round_up(sizeof(struct smb2_preauth_neg_context), 8); |
| |
| if (conn->cipher_type) { |
| + /* Round to 8 byte boundary */ |
| ctxt_size = round_up(ctxt_size, 8); |
| ksmbd_debug(SMB, |
| "assemble SMB2_ENCRYPTION_CAPABILITIES context\n"); |
| - build_encrypt_ctxt((struct smb2_encryption_neg_context *)pneg_ctxt, |
| + build_encrypt_ctxt((struct smb2_encryption_neg_context *) |
| + (pneg_ctxt + ctxt_size), |
| conn->cipher_type); |
| neg_ctxt_cnt++; |
| ctxt_size += sizeof(struct smb2_encryption_neg_context) + 2; |
| - /* Round to 8 byte boundary */ |
| - pneg_ctxt += |
| - round_up(sizeof(struct smb2_encryption_neg_context) + 2, |
| - 8); |
| } |
| |
| if (conn->compress_algorithm) { |
| @@ -872,31 +868,29 @@ static void assemble_neg_contexts(struct |
| ksmbd_debug(SMB, |
| "assemble SMB2_COMPRESSION_CAPABILITIES context\n"); |
| /* Temporarily set to SMB3_COMPRESS_NONE */ |
| - build_compression_ctxt((struct smb2_compression_ctx *)pneg_ctxt, |
| + build_compression_ctxt((struct smb2_compression_ctx *) |
| + (pneg_ctxt + ctxt_size), |
| conn->compress_algorithm); |
| neg_ctxt_cnt++; |
| ctxt_size += sizeof(struct smb2_compression_ctx) + 2; |
| - /* Round to 8 byte boundary */ |
| - pneg_ctxt += round_up(sizeof(struct smb2_compression_ctx) + 2, |
| - 8); |
| } |
| |
| if (conn->posix_ext_supported) { |
| ctxt_size = round_up(ctxt_size, 8); |
| ksmbd_debug(SMB, |
| "assemble SMB2_POSIX_EXTENSIONS_AVAILABLE context\n"); |
| - build_posix_ctxt((struct smb2_posix_neg_context *)pneg_ctxt); |
| + build_posix_ctxt((struct smb2_posix_neg_context *) |
| + (pneg_ctxt + ctxt_size)); |
| neg_ctxt_cnt++; |
| ctxt_size += sizeof(struct smb2_posix_neg_context); |
| - /* Round to 8 byte boundary */ |
| - pneg_ctxt += round_up(sizeof(struct smb2_posix_neg_context), 8); |
| } |
| |
| if (conn->signing_negotiated) { |
| ctxt_size = round_up(ctxt_size, 8); |
| ksmbd_debug(SMB, |
| "assemble SMB2_SIGNING_CAPABILITIES context\n"); |
| - build_sign_cap_ctxt((struct smb2_signing_capabilities *)pneg_ctxt, |
| + build_sign_cap_ctxt((struct smb2_signing_capabilities *) |
| + (pneg_ctxt + ctxt_size), |
| conn->signing_algorithm); |
| neg_ctxt_cnt++; |
| ctxt_size += sizeof(struct smb2_signing_capabilities) + 2; |