]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: avoid duplicate negotiate ctx offset increments
authorDavid Disseldorp <ddiss@suse.de>
Mon, 18 Dec 2023 15:33:44 +0000 (00:33 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Dec 2023 09:41:55 +0000 (10:41 +0100)
[ 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

index fa81816c3f923e85703dcce2826d78f70aa52934..967003000ba79a15df2ffb4041ffa7f30cc7a9bd 100644 (file)
@@ -839,7 +839,7 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn,
                                  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 ksmbd_conn *conn,
                           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_conn *conn,
                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;