diff -pruN 2.1.0-1/.evergreen/scripts/kms-divergence-check.sh 2.1.1-1/.evergreen/scripts/kms-divergence-check.sh
--- 2.1.0-1/.evergreen/scripts/kms-divergence-check.sh	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/.evergreen/scripts/kms-divergence-check.sh	2025-09-30 21:24:40.000000000 +0000
@@ -13,7 +13,7 @@ LIBMONGOCRYPT_DIR="$MONGOC_DIR/libmongoc
 
 # LIBMONGOCRYPT_GITREF is expected to refer to the version of libmongocrypt
 # where kms-message was last copied.
-LIBMONGOCRYPT_GITREF="34a9572c416e0827a1fa988baf88411c4b5f2c7b"
+LIBMONGOCRYPT_GITREF="9fff64216c06099401e2b3b2d5becb77bc17803d"
 
 cleanup() {
     if [ -d "$LIBMONGOCRYPT_DIR" ]; then
diff -pruN 2.1.0-1/NEWS 2.1.1-1/NEWS
--- 2.1.0-1/NEWS	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/NEWS	2025-09-30 21:24:40.000000000 +0000
@@ -1,11 +1,34 @@
+libmongoc 2.1.1
+===============
+
+## Fixes
+
+* Do not propagate `-fPIC` in CMake targets.
+* Apply write command behavior to `mongoc_collection_create_indexes_with_opts`.
+* Omit `saslSupportedMechs` in single-threaded monitoring commands.
+
+Thanks to everyone who contributed to the development of this release.
+
+  * Julia Garland
+  * Roberto C. Sánchez
+
+
+
 libmongoc 2.1.0
 ===============
 
 ## Fixes
 
+* Windows Secure Channel is fixed to support newer signatures to verify client certifictes.
+* Replace use of `rand()` with thread-safe alternatives.
 * The uninstall script for Windows is fixed so it no longer "succeeds" with a non-zero `%ERRORLABEL%` value.
 * The uninstall script for non-Windows environments now calls `find "$dir" -maxdepth 1` instead of `ls --almost-all "$dir"` when detecting non-empty directories to fix macOS compatibility.
 
+## Improvements
+
+* Remove unhelpful long-lived buffers to reduce memory usage.
+* Improve error messages produced by Windows APIs.
+
 ## Notes
 
 * The minimum supported MongoDB Server version is raised from 4.0 to 4.2. This is in accordance with [MongoDB Software Lifecycle Schedules](https://www.mongodb.com/legal/support-policy/lifecycles).
diff -pruN 2.1.0-1/VERSION_CURRENT 2.1.1-1/VERSION_CURRENT
--- 2.1.0-1/VERSION_CURRENT	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/VERSION_CURRENT	2025-09-30 21:24:40.000000000 +0000
@@ -1 +1 @@
-2.1.0
+2.1.1
diff -pruN 2.1.0-1/debian/changelog 2.1.1-1/debian/changelog
--- 2.1.0-1/debian/changelog	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/changelog	2025-09-30 21:24:31.000000000 +0000
@@ -1,3 +1,10 @@
+mongo-c-driver (2.1.1-1) unstable; urgency=medium
+
+  * New upstream release
+  * Update to debhelper compatibility 13
+
+ -- Roberto C. Sanchez <roberto@connexer.com>  Tue, 30 Sep 2025 17:24:31 -0400
+
 mongo-c-driver (2.1.0-1) unstable; urgency=medium
 
   * New upstream release
diff -pruN 2.1.0-1/debian/compat 2.1.1-1/debian/compat
--- 2.1.0-1/debian/compat	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/compat	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-11
diff -pruN 2.1.0-1/debian/control 2.1.1-1/debian/control
--- 2.1.0-1/debian/control	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/control	2025-09-30 21:24:31.000000000 +0000
@@ -3,7 +3,8 @@ Priority: optional
 Maintainer: Mongo C Driver Team <mongo-c-driver-debian@googlegroups.com>
 Uploaders: Kevin Albertson <kevin.albertson@mongodb.com>,
            Roberto C. Sanchez <roberto@connexer.com>
-Build-Depends: dpkg-dev (>= 1.22.5), debhelper (>= 11),
+Build-Depends: dpkg-dev (>= 1.22.5),
+               debhelper-compat (= 13),
                cmake,
                libssl-dev,
                pkgconf,
diff -pruN 2.1.0-1/debian/libbson-doc.lintian-overrides 2.1.1-1/debian/libbson-doc.lintian-overrides
--- 2.1.0-1/debian/libbson-doc.lintian-overrides	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/libbson-doc.lintian-overrides	2025-09-30 21:24:31.000000000 +0000
@@ -1,6 +1,2 @@
 # Sphinx embeds jQuery
 libbson-doc: embedded-javascript-library
-
-# Sphinx generated man pages have tables which overflow 80 column lines because
-# the names of libbson functions are too long to fit in 80 columns.
-libbson-doc: groff-message
diff -pruN 2.1.0-1/debian/libbson-doc.manpages 2.1.1-1/debian/libbson-doc.manpages
--- 2.1.0-1/debian/libbson-doc.manpages	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/libbson-doc.manpages	2025-09-30 21:24:31.000000000 +0000
@@ -1 +1,2 @@
 debian/tmp/usr/share/man/man3/bson*.3
+debian/tmp/usr/share/man/man3/libbson*.3
diff -pruN 2.1.0-1/debian/not-installed 2.1.1-1/debian/not-installed
--- 2.1.0-1/debian/not-installed	1970-01-01 00:00:00.000000000 +0000
+++ 2.1.1-1/debian/not-installed	2025-09-30 21:24:31.000000000 +0000
@@ -0,0 +1,3 @@
+usr/bin/mongoc2-stat
+usr/share/mongo-c-driver/2.1.1/uninstall.sh
+usr/share/mongo-c-driver/2.1.1/COPYING
diff -pruN 2.1.0-1/debian/rules 2.1.1-1/debian/rules
--- 2.1.0-1/debian/rules	2025-08-14 18:53:54.000000000 +0000
+++ 2.1.1-1/debian/rules	2025-09-30 21:24:31.000000000 +0000
@@ -39,7 +39,6 @@ override_dh_auto_configure:
 	-DENABLE_MAN_PAGES=$(DOCS) \
 	-DENABLE_HTML_DOCS=$(DOCS) \
 	-DENABLE_MAINTAINER_FLAGS=ON \
-	-DENABLE_PIC=OFF \
 	-DENABLE_TESTS=OFF \
 	-DENABLE_ZLIB=SYSTEM \
 	-DUSE_BUNDLED_UTF8PROC=OFF
diff -pruN 2.1.0-1/etc/prior_version.txt 2.1.1-1/etc/prior_version.txt
--- 2.1.0-1/etc/prior_version.txt	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/etc/prior_version.txt	2025-09-30 21:24:40.000000000 +0000
@@ -1 +1 @@
-2.0.0
+2.1.0
\ No newline at end of file
diff -pruN 2.1.0-1/src/kms-message/CMakeLists.txt 2.1.1-1/src/kms-message/CMakeLists.txt
--- 2.1.0-1/src/kms-message/CMakeLists.txt	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/CMakeLists.txt	2025-09-30 21:24:40.000000000 +0000
@@ -1,14 +1,13 @@
-cmake_minimum_required (VERSION 3.5)
+cmake_minimum_required (VERSION 3.15...4.0)
 project (kms_message
    VERSION 0.0.1
    LANGUAGES C
 )
 
-set (CMAKE_C_STANDARD 90)
+set (CMAKE_C_STANDARD 99)
 
 include (CheckCCompilerFlag)
-# All targets obey visibility, not just library targets.
-cmake_policy (SET CMP0063 NEW)
+
 set (CMAKE_C_VISIBILITY_PRESET hidden)
 set (KMS_MESSAGE_SOURCES
    src/kms_b64.c
@@ -101,7 +100,7 @@ add_library (
 
 string(FIND "${CMAKE_C_FLAGS}" "-fPIC" FPIC_LOCATION)
 if (NOT WIN32 AND ENABLE_PIC AND "${FPIC_LOCATION}" EQUAL "-1")
-   target_compile_options (kms_message_static PUBLIC -fPIC)
+   set_property (TARGET kms_message_static PROPERTY POSITION_INDEPENDENT_CODE TRUE)
    message ("Adding -fPIC to compilation of kms_message_static components")
 endif ()
 
diff -pruN 2.1.0-1/src/kms-message/src/hexlify.c 2.1.1-1/src/kms-message/src/hexlify.c
--- 2.1.0-1/src/kms-message/src/hexlify.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/hexlify.c	2025-09-30 21:24:40.000000000 +0000
@@ -14,7 +14,12 @@
  * limitations under the License.
  */
 
+#include "hexlify.h"
+
+//
+
 #include "kms_message_private.h"
+
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
diff -pruN 2.1.0-1/src/kms-message/src/hexlify.h 2.1.1-1/src/kms-message/src/hexlify.h
--- 2.1.0-1/src/kms-message/src/hexlify.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/hexlify.h	2025-09-30 21:24:40.000000000 +0000
@@ -21,4 +21,4 @@ char *
 hexlify (const uint8_t *buf, size_t len);
 
 int
-unhexlify (const char *in, size_t len);
\ No newline at end of file
+unhexlify (const char *in, size_t len);
diff -pruN 2.1.0-1/src/kms-message/src/kms_azure_request.c 2.1.1-1/src/kms-message/src/kms_azure_request.c
--- 2.1.0-1/src/kms-message/src/kms_azure_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_azure_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -216,4 +216,4 @@ kms_azure_request_unwrapkey_new (const c
                                ciphertext,
                                ciphertext_len,
                                opt);
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/src/kms_b64.c 2.1.1-1/src/kms-message/src/kms_b64.c
--- 2.1.0-1/src/kms-message/src/kms_b64.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_b64.c	2025-09-30 21:24:40.000000000 +0000
@@ -583,6 +583,7 @@ kms_message_raw_to_b64 (const uint8_t *r
 
    b64_len = (raw_len / 3 + 1) * 4 + 1;
    b64 = malloc (b64_len);
+   KMS_ASSERT (b64);
    memset (b64, 0, b64_len);
    if (-1 == kms_message_b64_ntop (raw, raw_len, b64, b64_len)) {
       free (b64);
@@ -600,6 +601,7 @@ kms_message_b64_to_raw (const char *b64,
 
    b64len = strlen (b64);
    raw = (uint8_t *) malloc (b64len + 1);
+   KMS_ASSERT (raw);
    memset (raw, 0, b64len + 1);
    ret = kms_message_b64_pton (b64, raw, b64len);
    if (ret > 0) {
@@ -642,6 +644,7 @@ kms_message_b64url_to_raw (const char *b
    /* Add four for padding '=' characters. */
    capacity = b64urllen + 4;
    b64 = malloc (capacity);
+   KMS_ASSERT (b64);
    memset (b64, 0, capacity);
    if (-1 ==
        kms_message_b64url_to_b64 (b64url, b64urllen, b64, capacity)) {
diff -pruN 2.1.0-1/src/kms-message/src/kms_crypto_libcrypto.c 2.1.1-1/src/kms-message/src/kms_crypto_libcrypto.c
--- 2.1.0-1/src/kms-message/src/kms_crypto_libcrypto.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_crypto_libcrypto.c	2025-09-30 21:24:40.000000000 +0000
@@ -58,6 +58,7 @@ kms_sha256 (void *unused_ctx,
             unsigned char *hash_out)
 {
    EVP_MD_CTX *digest_ctxp = EVP_MD_CTX_new ();
+   KMS_ASSERT (digest_ctxp);
    bool rval = false;
 
    if (1 != EVP_DigestInit_ex (digest_ctxp, EVP_sha256 (), NULL)) {
@@ -108,6 +109,7 @@ kms_sign_rsaes_pkcs1_v1_5 (void *unused_
    size_t signature_out_len = 256;
 
    ctx = EVP_MD_CTX_new ();
+   KMS_ASSERT (ctx);
    KMS_ASSERT (private_key_len <= LONG_MAX);
    pkey = d2i_PrivateKey (EVP_PKEY_RSA,
                           NULL,
diff -pruN 2.1.0-1/src/kms-message/src/kms_crypto_windows.c 2.1.1-1/src/kms-message/src/kms_crypto_windows.c
--- 2.1.0-1/src/kms-message/src/kms_crypto_windows.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_crypto_windows.c	2025-09-30 21:24:40.000000000 +0000
@@ -18,6 +18,8 @@
 
 #ifdef KMS_MESSAGE_ENABLE_CRYPTO_CNG
 
+#include "kms_message_private.h"
+
 // tell windows.h not to include a bunch of headers we don't need:
 #define WIN32_LEAN_AND_MEAN
 
@@ -179,6 +181,7 @@ kms_sign_rsaes_pkcs1_v1_5 (void *unused_
    }
 
    blob_private = (LPBYTE) calloc (1, blob_private_len);
+   KMS_ASSERT (blob_private);
 
    success = CryptDecodeObjectEx (X509_ASN_ENCODING,
                                   PKCS_PRIVATE_KEY_INFO,
@@ -208,6 +211,7 @@ kms_sign_rsaes_pkcs1_v1_5 (void *unused_
    }
 
    raw_private = (LPBYTE) calloc (1, raw_private_len);
+   KMS_ASSERT (raw_private);
 
    success = CryptDecodeObjectEx (X509_ASN_ENCODING,
                                   PKCS_RSA_PRIVATE_KEY,
@@ -234,6 +238,7 @@ kms_sign_rsaes_pkcs1_v1_5 (void *unused_
    }
 
    hash_value = calloc (1, SHA_256_HASH_LEN);
+   KMS_ASSERT (hash_value);
 
    if(!kms_sha256 (NULL, input, input_len, hash_value)) {
       goto cleanup;
diff -pruN 2.1.0-1/src/kms-message/src/kms_gcp_request.c 2.1.1-1/src/kms-message/src/kms_gcp_request.c
--- 2.1.0-1/src/kms-message/src/kms_gcp_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_gcp_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -88,6 +88,7 @@ kms_gcp_request_oauth_new (const char *h
    }
 
    jwt_signature = calloc (1, SIGNATURE_LEN);
+   KMS_ASSERT (jwt_signature);
    if (!req->crypto.sign_rsaes_pkcs1_v1_5 (
           req->crypto.sign_ctx,
           private_key_data,
@@ -283,4 +284,4 @@ kms_gcp_request_decrypt_new (const char
                                    ciphertext,
                                    ciphertext_len,
                                    opt);
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/src/kms_kmip_reader_writer.c 2.1.1-1/src/kms-message/src/kms_kmip_reader_writer.c
--- 2.1.0-1/src/kms-message/src/kms_kmip_reader_writer.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_kmip_reader_writer.c	2025-09-30 21:24:40.000000000 +0000
@@ -43,6 +43,7 @@ kmip_writer_t *
 kmip_writer_new (void)
 {
    kmip_writer_t *writer = calloc (1, sizeof (kmip_writer_t));
+   KMS_ASSERT (writer);
    writer->buffer = kms_request_str_new ();
    return writer;
 }
@@ -205,7 +206,7 @@ kmip_writer_begin_struct (kmip_writer_t
    size_t pos = writer->buffer->len;
 
    kmip_writer_write_u32 (writer, 0);
-   KMS_ASSERT(writer->cur_pos < MAX_KMIP_WRITER_POSITIONS);
+   KMS_ASSERT(writer->cur_pos < MAX_KMIP_WRITER_POSITIONS - 1);
    writer->cur_pos++;
    writer->positions[writer->cur_pos] = pos;
 }
@@ -241,6 +242,7 @@ kmip_reader_t *
 kmip_reader_new (uint8_t *ptr, size_t len)
 {
    kmip_reader_t *reader = calloc (1, sizeof (kmip_reader_t));
+   KMS_ASSERT (reader);
    reader->ptr = ptr;
    reader->len = len;
    return reader;
@@ -279,7 +281,8 @@ kmip_reader_has_data (kmip_reader_t *rea
 #define CHECK_REMAINING_BUFFER_AND_RET(read_size)   \
    if ((reader->pos + (read_size)) > reader->len) { \
       return false;                                 \
-   }
+   } else                                           \
+      ((void)0)
 
 bool
 kmip_reader_read_u8 (kmip_reader_t *reader, uint8_t *value)
@@ -346,7 +349,8 @@ kmip_reader_read_bytes (kmip_reader_t *r
 #define CHECK_AND_RET(x) \
    if (!(x)) {           \
       return false;      \
-   }
+   } else                \
+      ((void)0)
 
 bool
 kmip_reader_read_tag (kmip_reader_t *reader, kmip_tag_type_t *tag)
diff -pruN 2.1.0-1/src/kms-message/src/kms_kmip_request.c 2.1.1-1/src/kms-message/src/kms_kmip_request.c
--- 2.1.0-1/src/kms-message/src/kms_kmip_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_kmip_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -31,6 +31,7 @@ copy_writer_buffer (kms_request_t *req,
 
    buf = kmip_writer_get_buffer (writer, &buflen);
    req->kmip.data = malloc (buflen);
+   KMS_ASSERT (req->kmip.data);
    memcpy (req->kmip.data, buf, buflen);
    req->kmip.len = (uint32_t) buflen;
 }
@@ -79,11 +80,12 @@ kms_kmip_request_register_secretdata_new
    kms_request_t *req;
 
    req = calloc (1, sizeof (kms_request_t));
+   KMS_ASSERT (req);
    req->provider = KMS_REQUEST_PROVIDER_KMIP;
 
    if (len != KMS_KMIP_REQUEST_SECRETDATA_LENGTH) {
       KMS_ERROR (req,
-                 "expected SecretData length of %d, got %" PRIu32,
+                 "expected SecretData length of %d, got %zu",
                  KMS_KMIP_REQUEST_SECRETDATA_LENGTH,
                  len);
       return req;
@@ -168,6 +170,7 @@ kms_kmip_request_activate_new (void *res
    kms_request_t *req;
 
    req = calloc (1, sizeof (kms_request_t));
+   KMS_ASSERT (req);
    req->provider = KMS_REQUEST_PROVIDER_KMIP;
 
    writer = kmip_writer_new ();
@@ -224,6 +227,7 @@ kms_kmip_request_get_new (void *reserved
    kms_request_t *req;
 
    req = calloc (1, sizeof (kms_request_t));
+   KMS_ASSERT (req);
    req->provider = KMS_REQUEST_PROVIDER_KMIP;
 
    writer = kmip_writer_new ();
@@ -294,6 +298,7 @@ kms_kmip_request_create_new (void *reser
    kms_request_t *req;
 
    req = calloc (1, sizeof (kms_request_t));
+   KMS_ASSERT (req);
    req->provider = KMS_REQUEST_PROVIDER_KMIP;
 
    writer = kmip_writer_new();
@@ -362,6 +367,7 @@ kmip_encrypt_decrypt (const char* unique
    kms_request_t *req;
 
    req = calloc (1, sizeof (kms_request_t));
+   KMS_ASSERT (req);
    req->provider = KMS_REQUEST_PROVIDER_KMIP;
 
    writer = kmip_writer_new();
@@ -463,4 +469,3 @@ kms_kmip_request_decrypt_new (void *rese
    */
    return kmip_encrypt_decrypt(unique_identifer, ciphertext, len, iv_data, iv_len, false);
 }
-
diff -pruN 2.1.0-1/src/kms-message/src/kms_kmip_response.c 2.1.1-1/src/kms-message/src/kms_kmip_response.c
--- 2.1.0-1/src/kms-message/src/kms_kmip_response.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_kmip_response.c	2025-09-30 21:24:40.000000000 +0000
@@ -284,6 +284,7 @@ kms_kmip_response_get_iv (kms_response_t
       goto fail;
    }
    data = malloc (len);
+   KMS_ASSERT (data);
    memcpy (data, tmp, len);
    *datalen = len;
 
@@ -364,6 +365,7 @@ kms_kmip_response_get_data (kms_response
       goto fail;
    }
    data = malloc (len);
+   KMS_ASSERT (data);
    memcpy (data, tmp, len);
    *datalen = len;
 
@@ -477,6 +479,7 @@ kms_kmip_response_get_secretdata (kms_re
       goto fail;
    }
    secretdata = malloc (len);
+   KMS_ASSERT (secretdata);
    memcpy (secretdata, tmp, len);
    *secretdatalen = len;
 
diff -pruN 2.1.0-1/src/kms-message/src/kms_kmip_response_parser.c 2.1.1-1/src/kms-message/src/kms_kmip_response_parser.c
--- 2.1.0-1/src/kms-message/src/kms_kmip_response_parser.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_kmip_response_parser.c	2025-09-30 21:24:40.000000000 +0000
@@ -55,6 +55,7 @@ kms_kmip_response_parser_new (void *rese
    kms_response_parser_t *parser = kms_response_parser_new ();
 
    parser->kmip = malloc (sizeof (kms_kmip_response_parser_t));
+   KMS_ASSERT (parser->kmip);
    _parser_init (parser->kmip);
 
    return parser;
@@ -119,6 +120,7 @@ kms_kmip_response_parser_get_response (k
    }
 
    res = calloc (1, sizeof (kms_response_t));
+   KMS_ASSERT (res);
    res->provider = KMS_REQUEST_PROVIDER_KMIP;
    res->kmip.len = (uint32_t) parser->buf->len;
    res->kmip.data = (uint8_t *) kms_request_str_detach (parser->buf);
diff -pruN 2.1.0-1/src/kms-message/src/kms_message_private.h 2.1.1-1/src/kms-message/src/kms_message_private.h
--- 2.1.0-1/src/kms-message/src/kms_message_private.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_message_private.h	2025-09-30 21:24:40.000000000 +0000
@@ -124,6 +124,11 @@ struct _kms_response_parser_t {
       }                      \
    } while (0)
 
+#if defined(__clang__)
+__attribute__((format(printf, 3, 4)))
+#elif defined(__GNUC__)
+__attribute__((format(gnu_printf, 3, 4)))
+#endif
 void
 kms_set_error (char *error, size_t size, const char *fmt, ...);
 
@@ -137,6 +142,7 @@ kms_set_error (char *error, size_t size,
    if (!(stmt)) {                             \
       fprintf (stderr, "%s failed\n", #stmt); \
       abort ();                               \
-   }
+   } else                                     \
+       ((void)0)
 
 #endif /* KMS_MESSAGE_PRIVATE_H */
diff -pruN 2.1.0-1/src/kms-message/src/kms_request.c 2.1.1-1/src/kms-message/src/kms_request.c
--- 2.1.0-1/src/kms-message/src/kms_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -744,7 +744,7 @@ done:
    return kms_request_str_detach (sig);
 }
 
-void
+static void
 kms_request_validate (kms_request_t *request)
 {
    if (!check_and_prohibit_kmip (request)) {
diff -pruN 2.1.0-1/src/kms-message/src/kms_request_opt.c 2.1.1-1/src/kms-message/src/kms_request_opt.c
--- 2.1.0-1/src/kms-message/src/kms_request_opt.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_request_opt.c	2025-09-30 21:24:40.000000000 +0000
@@ -85,4 +85,4 @@ kms_request_opt_set_crypto_hook_sign_rsa
 {
    opt->crypto.sign_rsaes_pkcs1_v1_5 = sign_rsaes_pkcs1_v1_5;
    opt->crypto.sign_ctx = sign_ctx;
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/src/kms_request_str.c 2.1.1-1/src/kms-message/src/kms_request_str.c
--- 2.1.0-1/src/kms-message/src/kms_request_str.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_request_str.c	2025-09-30 21:24:40.000000000 +0000
@@ -27,8 +27,8 @@
 #include <stdlib.h>
 #include <limits.h> /* CHAR_BIT */
 
-bool rfc_3986_tab[256] = {0};
-bool kms_initialized = false;
+static bool rfc_3986_tab[256] = {0};
+static bool kms_initialized = false;
 
 static void
 tables_init (void)
@@ -126,12 +126,6 @@ kms_request_str_detach (kms_request_str_
    return r;
 }
 
-const char *
-kms_request_str_get (kms_request_str_t *str)
-{
-   return str->str;
-}
-
 bool
 kms_request_str_reserve (kms_request_str_t *str, size_t size)
 {
diff -pruN 2.1.0-1/src/kms-message/src/kms_request_str.h 2.1.1-1/src/kms-message/src/kms_request_str.h
--- 2.1.0-1/src/kms-message/src/kms_request_str.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_request_str.h	2025-09-30 21:24:40.000000000 +0000
@@ -64,10 +64,23 @@ kms_request_str_append_newline (kms_requ
 KMS_MSG_EXPORT (void)
 kms_request_str_append_lowercase (kms_request_str_t *str,
                                   kms_request_str_t *appended);
+
+#if defined(__clang__)
+__attribute__((format(printf, 2, 3)))
+#elif defined(__GNUC__)
+__attribute__((format(gnu_printf, 2, 3)))
+#endif
 KMS_MSG_EXPORT (void)
 kms_request_str_appendf (kms_request_str_t *str, const char *format, ...);
+
+#if defined(__clang__)
+__attribute__((format(printf, 2, 3)))
+#elif defined(__GNUC__)
+__attribute__((format(gnu_printf, 2, 3)))
+#endif
 KMS_MSG_EXPORT (void)
 kms_request_strdupf (kms_request_str_t *str, const char *format, ...);
+
 KMS_MSG_EXPORT (void)
 kms_request_str_append_escaped (kms_request_str_t *str,
                                 kms_request_str_t *appended,
diff -pruN 2.1.0-1/src/kms-message/src/kms_response_parser.c 2.1.1-1/src/kms-message/src/kms_response_parser.c
--- 2.1.0-1/src/kms-message/src/kms_response_parser.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/kms_response_parser.c	2025-09-30 21:24:40.000000000 +0000
@@ -81,7 +81,6 @@ kms_response_parser_wants_bytes (kms_res
    default:
       KMS_ASSERT (false && "Invalid kms_response_parser HTTP state");
    }
-   return -1;
 }
 
 static bool
diff -pruN 2.1.0-1/src/kms-message/src/sort.c 2.1.1-1/src/kms-message/src/sort.c
--- 2.1.0-1/src/kms-message/src/sort.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/sort.c	2025-09-30 21:24:40.000000000 +0000
@@ -37,6 +37,10 @@
  * https://github.com/freebsd/freebsd/blob/e7c6cef9514d3bb1f14a30a5ee871231523e43db/lib/libc/stdlib/merge.c
  */
 
+#include "sort.h"
+
+//
+
 #include <stddef.h>
 
 /*
@@ -44,10 +48,9 @@
  * last 4 elements.
  */
 
-typedef int (*cmp_t) (const void *, const void *);
 #define CMP(x, y) cmp (x, y)
 #define swap(a, b)   \
-   {                 \
+   if (1) {          \
       s = b;         \
       i = size;      \
       do {           \
@@ -56,7 +59,8 @@ typedef int (*cmp_t) (const void *, cons
          *s++ = tmp; \
       } while (--i); \
       a -= size;     \
-   }
+   } else            \
+      ((void)0)
 
 void
 insertionsort (unsigned char *a, size_t n, size_t size, cmp_t cmp)
diff -pruN 2.1.0-1/src/kms-message/src/sort.h 2.1.1-1/src/kms-message/src/sort.h
--- 2.1.0-1/src/kms-message/src/sort.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/src/sort.h	2025-09-30 21:24:40.000000000 +0000
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#include <stddef.h>
+
 typedef int (*cmp_t) (const void *, const void *);
 
 void
diff -pruN 2.1.0-1/src/kms-message/test/test_kmip_reader_writer.c 2.1.1-1/src/kms-message/test/test_kmip_reader_writer.c
--- 2.1.0-1/src/kms-message/test/test_kmip_reader_writer.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kmip_reader_writer.c	2025-09-30 21:24:40.000000000 +0000
@@ -6,7 +6,7 @@
  * You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
- *
+
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -54,6 +54,7 @@ kms_kmip_writer_test_evaluate (kmip_writ
    free (expected_hex);
 }
 
+void kms_kmip_writer_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_writer_test (void)
 {
@@ -140,6 +141,7 @@ kms_kmip_writer_test (void)
    kmip_writer_destroy (writer);
 }
 
+void kms_kmip_reader_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_test (void)
 {
@@ -312,6 +314,7 @@ kms_kmip_reader_test (void)
    free (data);
 }
 
+void kms_kmip_reader_negative_int_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_negative_int_test (void)
 {
@@ -356,6 +359,7 @@ kms_kmip_reader_negative_int_test (void)
    free (data);
 }
 
+void kms_kmip_reader_find_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_find_test (void)
 {
@@ -404,6 +408,7 @@ kms_kmip_reader_find_test (void)
    free (data);
 }
 
+void kms_kmip_reader_find_and_recurse_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_find_and_recurse_test (void)
 {
@@ -438,6 +443,7 @@ kms_kmip_reader_find_and_recurse_test (v
    free (data);
 }
 
+void kms_kmip_reader_find_and_read_enum_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_find_and_read_enum_test (void)
 {
@@ -470,6 +476,7 @@ kms_kmip_reader_find_and_read_enum_test
    free (data);
 }
 
+void kms_kmip_reader_find_and_read_bytes_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_reader_find_and_read_bytes_test (void)
 {
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_assert.h 2.1.1-1/src/kms-message/test/test_kms_assert.h
--- 2.1.0-1/src/kms-message/test/test_kms_assert.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_assert.h	2025-09-30 21:24:40.000000000 +0000
@@ -44,7 +44,7 @@
 #define TEST_ERROR(...)                                                \
    do {                                                                \
       TEST_STDERR_PRINTF (                                             \
-         "test error %s:%d %s(): ", __FILE__, __LINE__, __FUNCTION__); \
+         "test error %s:%d %s(): ", __FILE__, __LINE__, __func__); \
       TEST_STDERR_PRINTF (__VA_ARGS__);                                \
       TEST_STDERR_PRINTF ("\n");                                       \
       abort ();                                                        \
@@ -53,7 +53,8 @@
 #define ASSERT(stmt)                             \
    if (!(stmt)) {                                \
       TEST_ERROR ("statement failed %s", #stmt); \
-   }
+   } else                                        \
+      ((void)0)
 
 #define ASSERT_CMPSTR_WITH_LEN(_expect, _expect_len, _actual, _actual_len)     \
    do {                                                                        \
@@ -98,7 +99,7 @@
          TEST_ERROR (                                                   \
             "comparison failed: %d %s %d", _a_int, #_operator, _b_int); \
       }                                                                 \
-   } while (0);
+   } while (0)
 
 #define ASSERT_CMPBYTES(                                                \
    expected_bytes, expected_len, actual_bytes, actual_len)              \
@@ -161,4 +162,4 @@
       ASSERT_CONTAINS (_error_str, expect_substring);              \
    } while (0)
 
-#endif /* TEST_KMS_ASSERT_H */
\ No newline at end of file
+#endif /* TEST_KMS_ASSERT_H */
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_azure_online.c 2.1.1-1/src/kms-message/test/test_kms_azure_online.c
--- 2.1.0-1/src/kms-message/test/test_kms_azure_online.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_azure_online.c	2025-09-30 21:24:40.000000000 +0000
@@ -122,6 +122,7 @@ azure_authenticate (void)
    test_env_init (&test_env);
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_connection_close (opt, true);
    kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE);
 
@@ -190,6 +191,7 @@ test_azure_wrapkey (void)
    bearer_token = azure_authenticate ();
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_connection_close (opt, true);
    kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE);
    req = kms_azure_request_wrapkey_new (test_env.key_host,
@@ -257,4 +259,4 @@ main (int argc, char **argv)
    kms_message_init ();
    test_azure_wrapkey ();
    return 0;
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_gcp_online.c 2.1.1-1/src/kms-message/test/test_kms_gcp_online.c
--- 2.1.0-1/src/kms-message/test/test_kms_gcp_online.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_gcp_online.c	2025-09-30 21:24:40.000000000 +0000
@@ -98,6 +98,7 @@ gcp_authenticate (void)
    test_env_init (&test_env);
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_connection_close (opt, true);
    kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP);
 
@@ -171,6 +172,7 @@ test_gcp (void)
    bearer_token = gcp_authenticate ();
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_connection_close (opt, true);
    kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP);
    req = kms_gcp_request_encrypt_new (test_env.kms_host,
@@ -247,4 +249,4 @@ main (int argc, char **argv)
    kms_message_init ();
    test_gcp ();
    return 0;
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_kmip_request.c 2.1.1-1/src/kms-message/test/test_kms_kmip_request.c
--- 2.1.0-1/src/kms-message/test/test_kms_kmip_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_kmip_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -76,6 +76,7 @@ value="ffa8cc79e8c3763b0121fcd06bb3488c8
       0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, \
       0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec
 
+void kms_kmip_request_register_secretdata_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_request_register_secretdata_test (void)
 {
@@ -98,6 +99,7 @@ kms_kmip_request_register_secretdata_tes
    kms_request_destroy (req);
 }
 
+void kms_kmip_request_register_secretdata_invalid_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_request_register_secretdata_invalid_test (void)
 {
@@ -144,6 +146,7 @@ value="7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"
       0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \
       0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49
 
+void kms_kmip_request_get_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_request_get_test (void)
 {
@@ -200,6 +203,7 @@ value="7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"
       0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \
       0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49
 
+void kms_kmip_request_activate_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_request_activate_test (void)
 {
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_kmip_response.c 2.1.1-1/src/kms-message/test/test_kms_kmip_response.c
--- 2.1.0-1/src/kms-message/test/test_kms_kmip_response.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_kmip_response.c	2025-09-30 21:24:40.000000000 +0000
@@ -56,6 +56,7 @@ static const uint8_t SUCCESS_REGISTER_RE
 
 static const char *const SUCCESS_REGISTER_RESPONSE_UNIQUE_IDENTIFIER = "39";
 
+void kms_kmip_response_get_unique_identifier_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_get_unique_identifier_test (void)
 {
@@ -141,6 +142,7 @@ static const uint8_t SUCCESS_GET_RESPONS
    0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a,
    0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec};
 
+void kms_kmip_response_get_secretdata_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_get_secretdata_test (void)
 {
@@ -197,6 +199,7 @@ static const uint8_t ERROR_GET_RESPOSE_N
    0x6c, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x4e,
    0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64};
 
+void kms_kmip_response_get_secretdata_notfound_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_get_secretdata_notfound_test (void)
 {
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_kmip_response_parser.c 2.1.1-1/src/kms-message/test/test_kms_kmip_response_parser.c
--- 2.1.0-1/src/kms-message/test/test_kms_kmip_response_parser.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_kmip_response_parser.c	2025-09-30 21:24:40.000000000 +0000
@@ -36,6 +36,7 @@ static const int SAMPLE_KMIP_FIRST_LENGT
 /* SAMPLE_KMIP_LARGE_LENGTH is a byte size larger than the message. */
 static const int SAMPLE_KMIP_LARGE_LENGTH = 1024;
 
+void kms_kmip_response_parser_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_parser_test (void)
 {
@@ -118,6 +119,7 @@ feed_full_response (kms_response_parser_
    }
 }
 
+void kms_kmip_response_parser_reuse_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_parser_reuse_test (void)
 {
@@ -150,6 +152,7 @@ kms_kmip_response_parser_reuse_test (voi
    free (data);
 }
 
+void kms_kmip_response_parser_excess_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_parser_excess_test (void)
 {
@@ -171,6 +174,7 @@ kms_kmip_response_parser_excess_test (vo
    free (data);
 }
 
+void kms_kmip_response_parser_notenough_test (void); // -Wmissing-prototypes: for testing only.
 void
 kms_kmip_response_parser_notenough_test (void)
 {
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_online_util.c 2.1.1-1/src/kms-message/test/test_kms_online_util.c
--- 2.1.0-1/src/kms-message/test/test_kms_online_util.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_online_util.c	2025-09-30 21:24:40.000000000 +0000
@@ -117,4 +117,4 @@ send_kms_request (kms_request_t *req, co
    kms_response_parser_destroy (response_parser);
    mongoc_stream_destroy (tls_stream);
    return response;
-}
\ No newline at end of file
+}
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_online_util.h 2.1.1-1/src/kms-message/test/test_kms_online_util.h
--- 2.1.0-1/src/kms-message/test/test_kms_online_util.h	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_online_util.h	2025-09-30 21:24:40.000000000 +0000
@@ -32,4 +32,4 @@ connect_with_tls (const char *host,
 kms_response_t *
 send_kms_request (kms_request_t *req, const char *host);
 
-#endif /* TEST_KMS_ONLINE_UTIL_H */
\ No newline at end of file
+#endif /* TEST_KMS_ONLINE_UTIL_H */
diff -pruN 2.1.0-1/src/kms-message/test/test_kms_request.c 2.1.1-1/src/kms-message/test/test_kms_request.c
--- 2.1.0-1/src/kms-message/test/test_kms_request.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/kms-message/test/test_kms_request.c	2025-09-30 21:24:40.000000000 +0000
@@ -15,7 +15,9 @@
  */
 
 /* Needed for strptime */
+#if !defined(_GNU_SOURCE)
 #define _GNU_SOURCE
+#endif
 
 #include "kms_message/kms_message.h"
 #include "kms_message_private.h"
@@ -41,15 +43,15 @@
 
 #include "test_kms_assert.h"
 
-const char *aws_test_suite_dir = "aws-sig-v4-test-suite";
+static const char *aws_test_suite_dir = "aws-sig-v4-test-suite";
 
-const char *skipped_aws_tests[] = {
+static const char *skipped_aws_tests[] = {
    /* we don't yet support temporary security credentials provided by the AWS
     * Security Token Service (AWS STS). see post-sts-token/readme.txt */
    "post-sts-token",
 };
 
-bool
+static bool
 skip_aws_test (const char *test_name)
 {
    size_t i;
@@ -63,7 +65,7 @@ skip_aws_test (const char *test_name)
    return false;
 }
 
-bool
+static bool
 ends_with (const char *str, const char *suffix)
 {
    size_t str_len = strlen (str);
@@ -77,7 +79,7 @@ ends_with (const char *str, const char *
 }
 
 
-char *
+static char *
 last_segment (const char *str)
 {
    const char *p = str + strlen (str);
@@ -91,7 +93,7 @@ last_segment (const char *str)
    return strdup (str);
 }
 
-char *
+static char *
 test_file_path (const char *path, const char *suffix)
 {
    char *r;
@@ -103,7 +105,7 @@ test_file_path (const char *path, const
    return r;
 }
 
-void
+static void
 realloc_buffer (char **buffer, size_t *n, size_t len)
 {
    if (*buffer == NULL) {
@@ -117,12 +119,12 @@ realloc_buffer (char **buffer, size_t *n
    *n = len;
 }
 
-ssize_t
+static ssize_t
 test_getline (char **lineptr, size_t *n, FILE *stream)
 {
    if (*lineptr == NULL && *n == 0) {
       realloc_buffer (lineptr, n, 128);
-   };
+   }
 
    // Sanity check
    if ((*lineptr == NULL && *n != 0) || (*lineptr != NULL && *n == 0)) {
@@ -162,7 +164,7 @@ test_getline (char **lineptr, size_t *n,
    }
 }
 
-char *
+static char *
 read_test (const char *path, const char *suffix)
 {
    char *file_path = test_file_path (path, suffix);
@@ -208,7 +210,7 @@ read_test (const char *path, const char
    return str;
 }
 
-void
+static void
 set_test_date (kms_request_t *request)
 {
    struct tm tm;
@@ -228,7 +230,7 @@ set_test_date (kms_request_t *request)
    KMS_ASSERT (kms_request_set_date (request, &tm));
 }
 
-kms_request_t *
+static kms_request_t *
 read_req (const char *path)
 {
    kms_request_t *request;
@@ -303,7 +305,7 @@ read_req (const char *path)
    return request;
 }
 
-void
+static void
 test_compare (kms_request_t *request,
               char *(*func) (kms_request_t *),
               const char *dir_path,
@@ -328,31 +330,31 @@ test_compare (kms_request_t *request,
    free (test_name);
 }
 
-void
+static void
 test_compare_creq (kms_request_t *request, const char *dir_path)
 {
    test_compare (request, kms_request_get_canonical, dir_path, "creq");
 }
 
-void
+static void
 test_compare_sts (kms_request_t *request, const char *dir_path)
 {
    test_compare (request, kms_request_get_string_to_sign, dir_path, "sts");
 }
 
-void
+static void
 test_compare_authz (kms_request_t *request, const char *dir_path)
 {
    test_compare (request, kms_request_get_signature, dir_path, "authz");
 }
 
-void
+static void
 test_compare_sreq (kms_request_t *request, const char *dir_path)
 {
    test_compare (request, kms_request_get_signed, dir_path, "sreq");
 }
 
-void
+static void
 aws_sig_v4_test (const char *dir_path)
 {
    kms_request_t *request;
@@ -365,7 +367,7 @@ aws_sig_v4_test (const char *dir_path)
    kms_request_destroy (request);
 }
 
-bool
+static bool
 all_aws_sig_v4_tests (const char *path, const char *selected)
 {
    /* Amazon supplies tests, one per directory, 5 files per test, see
@@ -420,7 +422,7 @@ done:
 }
 
 /* docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html */
-void
+static void
 example_signature_test (void)
 {
    const char *expect =
@@ -444,7 +446,7 @@ example_signature_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 path_normalization_test (void)
 {
    const char *tests[][2] = {
@@ -499,7 +501,7 @@ path_normalization_test (void)
    }
 }
 
-kms_request_t *
+static kms_request_t *
 make_test_request (void)
 {
    kms_request_t *request = kms_request_new ("POST", "/", NULL);
@@ -513,7 +515,7 @@ make_test_request (void)
    return request;
 }
 
-void
+static void
 host_test (void)
 {
    kms_request_t *request = make_test_request ();
@@ -521,7 +523,7 @@ host_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 content_length_test (void)
 {
    const char *payload = "foo-payload";
@@ -531,7 +533,7 @@ content_length_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 bad_query_test (void)
 {
    kms_request_t *request = kms_request_new ("GET", "/?asdf", NULL);
@@ -539,7 +541,7 @@ bad_query_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 append_header_field_value_test (void)
 {
    kms_request_t *request = kms_request_new ("GET", "/", NULL);
@@ -550,7 +552,7 @@ append_header_field_value_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 set_date_test (void)
 {
 // Windows CRT asserts on this negative test because it is a negative test
@@ -566,7 +568,7 @@ set_date_test (void)
 #endif
 }
 
-void
+static void
 multibyte_test (void)
 {
 /* euro currency symbol */
@@ -595,13 +597,14 @@ multibyte_test (void)
 #undef EU
 }
 
-void
+static void
 connection_close_test (void)
 {
    kms_request_opt_t *opt;
    kms_request_t *request;
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_connection_close (opt, true);
 
    request = kms_request_new ("POST", "/", opt);
@@ -617,7 +620,7 @@ connection_close_test (void)
 }
 
 /* the ciphertext blob from a response to an "Encrypt" API call */
-const char ciphertext_blob[] =
+static const char ciphertext_blob[] =
    "\x01\x02\x02\x00\x78\xf3\x8e\xd8\xd4\xc6\xba\xfb\xa1\xcf\xc1\x1e\x68\xf2"
    "\xa1\x91\x9e\x36\x4d\x74\xa2\xc4\x9e\x30\x67\x08\x53\x33\x0d\xcd\xe0\xc9"
    "\x1b\x01\x60\x30\xd4\x73\x9e\x90\x1f\xa7\x43\x55\x84\x26\xf9\xd5\xf0\xb1"
@@ -628,7 +631,7 @@ const char ciphertext_blob[] =
    "\x03\xcd\xcb\xe2\xac\x36\x4f\x73\xdb\x1b\x73\x2e\x33\xda\x45\x51\xf4\xcd"
    "\xc0\xff\xd2\xe1\xb9\xc4\xc2\x0e\xbf\x53\x90\x46\x18\x42";
 
-void
+static void
 decrypt_request_test (void)
 {
    kms_request_t *request = kms_decrypt_request_new (
@@ -647,7 +650,7 @@ decrypt_request_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 encrypt_request_test (void)
 {
    char *plaintext = "foobar";
@@ -667,7 +670,7 @@ encrypt_request_test (void)
    kms_request_destroy (request);
 }
 
-void
+static void
 kv_list_del_test (void)
 {
    kms_kv_list_t *lst = kms_kv_list_new ();
@@ -694,7 +697,7 @@ kv_list_del_test (void)
    kms_kv_list_destroy (lst);
 }
 
-void
+static void
 b64_test (void)
 {
    uint8_t *expected = (uint8_t *) "\x01\x02\x03\x04";
@@ -710,7 +713,7 @@ b64_test (void)
    KMS_ASSERT (0 == memcmp (expected, data, 4));
 }
 
-void
+static void
 b64_b64url_test (void)
 {
    char base64_data[64];
@@ -742,7 +745,7 @@ b64_b64url_test (void)
    ASSERT_CMPSTR (base64_data, "PDw_Pz8-Pg==");
 }
 
-void
+static void
 kms_response_parser_test (void)
 {
    kms_response_parser_t *parser = kms_response_parser_new ();
@@ -758,7 +761,7 @@ kms_response_parser_test (void)
       kms_response_parser_feed (parser, (uint8_t *) "This is a test.", 15));
    ASSERT (0 == kms_response_parser_wants_bytes (parser, 123));
    response = kms_response_parser_get_response (parser);
-   ASSERT (response->status == 200)
+   ASSERT (response->status == 200);
    ASSERT_CMPSTR (response->body->str, "This is a test.");
 
    kms_response_destroy (response);
@@ -956,7 +959,7 @@ kms_response_parser_files (void)
       _field = kms_request_str_new ();  \
    } while (0)
 
-void
+static void
 kms_request_validate_test (void)
 {
    kms_request_t *request = NULL;
@@ -1104,6 +1107,7 @@ kms_request_kmip_prohibited_test (void)
    kms_request_t *req;
 
    opt = kms_request_opt_new ();
+   ASSERT (opt);
    kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_KMIP);
    req = kms_request_new ("method", "path_and_query", opt);
    ASSERT_REQUEST_ERROR (req, "Function not applicable to KMIP");
@@ -1139,6 +1143,7 @@ test_request_newlines (void)
    // Test kms_request_to_string.
    {
       opt = kms_request_opt_new ();
+      ASSERT (opt);
       kms_request_opt_set_connection_close (opt, true);
       ASSERT (kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE));
       req = kms_azure_request_wrapkey_new ("example-host",
@@ -1165,6 +1170,7 @@ test_request_newlines (void)
    // Test kms_request_get_signed.
    {
       opt = kms_request_opt_new ();
+      ASSERT (opt);
       kms_request_opt_set_connection_close (opt, true);
       req = kms_caller_identity_request_new (opt);
       ASSERT_REQUEST_OK (req);
@@ -1240,7 +1246,7 @@ main (int argc, char *argv[])
 
    int ret = kms_message_init ();
    if (ret != 0) {
-      TEST_PRINTF ("kms_message_init failed: 0x%x\n", ret);
+      TEST_PRINTF ("kms_message_init failed: 0x%d\n", ret);
       abort ();
    }
 
diff -pruN 2.1.0-1/src/libbson/NEWS 2.1.1-1/src/libbson/NEWS
--- 2.1.0-1/src/libbson/NEWS	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/libbson/NEWS	2025-09-30 21:24:40.000000000 +0000
@@ -1,3 +1,8 @@
+libbson 2.1.1
+=============
+
+No changes since 2.1.0. Version incremented to match the libmongoc version.
+
 libbson 2.1.0
 =============
 
diff -pruN 2.1.0-1/src/libmongoc/CMakeLists.txt 2.1.1-1/src/libmongoc/CMakeLists.txt
--- 2.1.0-1/src/libmongoc/CMakeLists.txt	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/libmongoc/CMakeLists.txt	2025-09-30 21:24:40.000000000 +0000
@@ -837,7 +837,7 @@ if (TARGET bson::static)
    target_include_directories (mcd_rpc PUBLIC ${PROJECT_SOURCE_DIR}/src)
    target_link_libraries (mcd_rpc PUBLIC bson::static)
    if (NOT WIN32 AND ENABLE_PIC)
-      target_compile_options (mcd_rpc PUBLIC -fPIC)
+      set_property (TARGET mcd_rpc PROPERTY POSITION_INDEPENDENT_CODE TRUE)
    endif ()
    set_target_properties (mcd_rpc PROPERTIES OUTPUT_NAME "mcd-rpc")
 endif ()
@@ -922,7 +922,7 @@ if (MONGOC_ENABLE_STATIC_BUILD)
    set_property(TARGET mongoc_static PROPERTY EXPORT_NAME mongoc::static)
    target_link_libraries (mongoc_static PUBLIC ${STATIC_LIBRARIES} bson::static mongo::detail::c_dependencies)
    if (NOT WIN32 AND ENABLE_PIC)
-      target_compile_options (mongoc_static PUBLIC -fPIC)
+      set_property(TARGET mongoc_static PROPERTY POSITION_INDEPENDENT_CODE TRUE)
       message (STATUS "Adding -fPIC to compilation of mongoc_static components")
    endif ()
    if(ENABLE_SRV AND RESOLVE_LIB_NAME)
Binary files 2.1.0-1/src/libmongoc/doc/includes/libbson.inv and 2.1.1-1/src/libmongoc/doc/includes/libbson.inv differ
diff -pruN 2.1.0-1/src/libmongoc/src/mongoc/mongoc-collection.c 2.1.1-1/src/libmongoc/src/mongoc/mongoc-collection.c
--- 2.1.0-1/src/libmongoc/src/mongoc/mongoc-collection.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/libmongoc/src/mongoc/mongoc-collection.c	2025-09-30 21:24:40.000000000 +0000
@@ -2635,8 +2635,7 @@ mongoc_collection_create_indexes_with_op
    }
    BSON_ASSERT (bson_append_array_builder_end (&cmd, indexes));
 
-   ok = mongoc_client_command_with_opts (
-      collection->client, collection->db, &cmd, NULL /* read_prefs */, opts, reply_ptr, error);
+   ok = mongoc_collection_write_command_with_opts(collection, &cmd, opts, reply_ptr, error);
 
 fail:
    mongoc_server_stream_cleanup (server_stream);
diff -pruN 2.1.0-1/src/libmongoc/src/mongoc/mongoc-topology-scanner.c 2.1.1-1/src/libmongoc/src/mongoc/mongoc-topology-scanner.c
--- 2.1.0-1/src/libmongoc/src/mongoc/mongoc-topology-scanner.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/libmongoc/src/mongoc/mongoc-topology-scanner.c	2025-09-30 21:24:40.000000000 +0000
@@ -158,6 +158,13 @@ _reset_hello (mongoc_topology_scanner_t
    _add_hello (ts);
 }
 
+void
+_mongoc_topology_scanner_node_parse_sasl_supported_mechs (const bson_t *hello, mongoc_topology_scanner_node_t *node)
+{
+   _mongoc_handshake_parse_sasl_supported_mechs (hello, &node->sasl_supported_mechs);
+   node->negotiated_sasl_supported_mechs = true;
+}
+
 const char *
 _mongoc_topology_scanner_get_speculative_auth_mechanism (const mongoc_uri_t *uri)
 {
@@ -692,7 +699,7 @@ _async_success (mongoc_async_cmd_t *acmd
    }
 
    if (ts->negotiate_sasl_supported_mechs && !node->negotiated_sasl_supported_mechs) {
-      _mongoc_handshake_parse_sasl_supported_mechs (hello_response, &node->sasl_supported_mechs);
+      _mongoc_topology_scanner_node_parse_sasl_supported_mechs (hello_response, node);
    }
 
    if (ts->speculative_authentication) {
diff -pruN 2.1.0-1/src/libmongoc/tests/test-mongoc-collection.c 2.1.1-1/src/libmongoc/tests/test-mongoc-collection.c
--- 2.1.0-1/src/libmongoc/tests/test-mongoc-collection.c	2025-08-14 18:37:23.000000000 +0000
+++ 2.1.1-1/src/libmongoc/tests/test-mongoc-collection.c	2025-09-30 21:24:40.000000000 +0000
@@ -4882,17 +4882,87 @@ test_insert_one_reports_id (void)
       ok = mongoc_collection_insert_one (coll, doc, NULL /* opts */, &reply, &error);
       ASSERT_OR_PRINT (ok, error);
       // Check that `reply` contains the inserted ID.
-      ASSERT_MATCH (&reply, "{'insertedId': '%s'}", large_str);
-      bson_destroy (&reply);
-      bson_free (large_str);
+      ASSERT_MATCH(&reply, "{'insertedId': '%s'}", large_str);
+      bson_destroy(&reply);
+      bson_free(large_str);
    }
 
-   mongoc_collection_destroy (coll);
-   mongoc_client_destroy (client);
+   mongoc_collection_destroy(coll);
+   mongoc_client_destroy(client);
 }
 
 #undef ASSERT_INDEX_EXISTS
 
+static void
+test_create_indexes_acts_as_write_command(void *unused)
+{
+   BSON_UNUSED(unused);
+
+   mongoc_client_t *client = test_framework_new_default_client();
+   mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts");
+   bson_error_t error;
+   bson_t reply;
+
+   // Test write concern is inherited from collection:
+   {
+      // Set a non-default write concern on collection:
+      {
+         mongoc_write_concern_t *wc = mongoc_write_concern_new();
+         mongoc_write_concern_set_w(wc, -1); // Set a write concern that fails.
+         mongoc_collection_set_write_concern(coll, wc);
+         mongoc_write_concern_destroy(wc);
+      }
+
+      // Create index:
+      {
+         const bson_t *keys = tmp_bson("{'x': 1}");
+         mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL);
+         bool ok =
+            mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* options */, NULL /* reply */, &error);
+         ASSERT(!ok);
+         ASSERT_ERROR_CONTAINS(error, 5, 9, "w has to be a non-negative number and not greater than 50");
+         mongoc_index_model_destroy(im);
+      }
+   }
+
+   // Test a server reply with "writeConcernError" is considered an error:
+   {
+      // Set the default write concern on collection:
+      {
+         mongoc_write_concern_t *wc = mongoc_write_concern_new(); // Default write concern.
+         mongoc_collection_set_write_concern(coll, wc);
+         mongoc_write_concern_destroy(wc);
+      }
+
+      // Set a failpoint to fail with "writeConcernError":
+      {
+         const char *cmd_str = BSON_STR({
+            "configureFailPoint" : "failCommand",
+            "mode" : {"times" : 1},
+            "data" : {"failCommands" : ["createIndexes"], "writeConcernError" : {"code" : 123, "errmsg" : "foo"}}
+         });
+         bson_t *failpoint_cmd = bson_new_from_json((const uint8_t *)cmd_str, -1, &error);
+         ASSERT_OR_PRINT(failpoint_cmd, error);
+         bool ok = mongoc_client_command_simple(client, "admin", failpoint_cmd, NULL /* read_prefs */, &reply, &error);
+         ASSERT_OR_PRINT(ok, error);
+         bson_destroy(failpoint_cmd);
+         bson_destroy(&reply);
+      }
+
+      {
+         const bson_t *keys = tmp_bson("{'x': 1}");
+         mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL);
+         bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error);
+         ASSERT(!ok);
+         ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, 123, "foo");
+         mongoc_index_model_destroy(im);
+      }
+   }
+
+   mongoc_collection_destroy(coll);
+   mongoc_client_destroy(client);
+}
+
 
 void
 test_collection_install (TestSuite *suite)
@@ -4974,56 +5044,66 @@ test_collection_install (TestSuite *suit
    TestSuite_AddLive (suite, "/Collection/insert/duplicate_key", test_insert_duplicate_key);
    TestSuite_AddFull (
       suite, "/Collection/create_index/fail", test_create_index_fail, NULL, NULL, test_framework_skip_if_offline);
-   TestSuite_AddLive (suite, "/Collection/insert_one", test_insert_one);
-   TestSuite_AddLive (suite, "/Collection/update_and_replace", test_update_and_replace);
-   TestSuite_AddLive (suite, "/Collection/array_filters_validate", test_array_filters_validate);
-   TestSuite_AddLive (suite, "/Collection/replace_one_validate", test_replace_one_validate);
-   TestSuite_AddLive (suite, "/Collection/update_one_validate", test_update_one_validate);
-   TestSuite_AddLive (suite, "/Collection/update_many_validate", test_update_many_validate);
-   TestSuite_AddLive (suite, "/Collection/delete_one_or_many", test_delete_one_or_many);
-   TestSuite_AddMockServerTest (suite, "/Collection/delete/collation", test_delete_collation);
-   TestSuite_AddMockServerTest (suite, "/Collection/update/collation", test_update_collation);
-   TestSuite_AddMockServerTest (suite, "/Collection/update/hint", test_update_hint);
-   TestSuite_AddLive (suite, "/Collection/update/hint/validate", test_update_hint_validate);
-   TestSuite_AddMockServerTest (suite, "/Collection/count_documents", test_count_documents);
-   TestSuite_AddLive (suite, "/Collection/count_documents_live", test_count_documents_live);
-   TestSuite_AddMockServerTest (suite, "/Collection/estimated_document_count", test_estimated_document_count);
-   TestSuite_AddLive (suite, "/Collection/estimated_document_count_live", test_estimated_document_count_live);
-   TestSuite_AddMockServerTest (suite, "/Collection/aggregate_with_batch_size", test_aggregate_with_batch_size);
-   TestSuite_AddFull (suite,
-                      "/Collection/fam/no_error_on_retry",
-                      test_fam_no_error_on_retry,
-                      NULL,
-                      NULL,
-                      test_framework_skip_if_no_failpoint,
-                      test_framework_skip_if_max_wire_version_more_than_9);
-   TestSuite_AddLive (suite, "/Collection/hint_is_validated/aggregate", test_hint_is_validated_aggregate);
-   TestSuite_AddLive (suite, "/Collection/hint_is_validated/countDocuments", test_hint_is_validated_countDocuments);
-   TestSuite_AddLive (suite, "/Collection/create_indexes_with_opts", test_create_indexes_with_opts);
-   TestSuite_AddFull (suite,
-                      "/Collection/create_indexes_with_opts/commitQuorum/pre44",
-                      test_create_indexes_with_opts_commitQuorum_pre44,
-                      NULL /* _dtor */,
-                      NULL /* _ctx */,
-                      // commitQuorum option is not available on standalone servers.
-                      test_framework_skip_if_not_replset,
-                      // Server Version 4.4 has Wire Version 9.
-                      test_framework_skip_if_max_wire_version_more_than_8);
-   TestSuite_AddFull (suite,
-                      "/Collection/create_indexes_with_opts/commitQuorum/post44",
-                      test_create_indexes_with_opts_commitQuorum_post44,
-                      NULL /* _dtor */,
-                      NULL /* _ctx */,
-                      // commitQuorum option is not available on standalone servers.
-                      test_framework_skip_if_not_replset,
-                      // Server Version 4.4 has Wire Version 9.
-                      test_framework_skip_if_max_wire_version_less_than_9);
-   TestSuite_AddFull (suite,
-                      "/Collection/create_indexes_with_opts/no_retry",
-                      test_create_indexes_with_opts_no_retry,
-                      NULL /* _dtor */,
-                      NULL /* _ctx */,
-                      // requires failpoint
-                      test_framework_skip_if_no_failpoint);
-   TestSuite_AddLive (suite, "/Collection/insert_one_reports_id", test_insert_one_reports_id);
+   TestSuite_AddLive(suite, "/Collection/insert_one", test_insert_one);
+   TestSuite_AddLive(suite, "/Collection/update_and_replace", test_update_and_replace);
+   TestSuite_AddLive(suite, "/Collection/array_filters_validate", test_array_filters_validate);
+   TestSuite_AddLive(suite, "/Collection/replace_one_validate", test_replace_one_validate);
+   TestSuite_AddLive(suite, "/Collection/update_one_validate", test_update_one_validate);
+   TestSuite_AddLive(suite, "/Collection/update_many_validate", test_update_many_validate);
+   TestSuite_AddLive(suite, "/Collection/delete_one_or_many", test_delete_one_or_many);
+   TestSuite_AddMockServerTest(suite, "/Collection/delete/collation", test_delete_collation);
+   TestSuite_AddMockServerTest(suite, "/Collection/update/collation", test_update_collation);
+   TestSuite_AddMockServerTest(suite, "/Collection/update/hint", test_update_hint);
+   TestSuite_AddLive(suite, "/Collection/update/hint/validate", test_update_hint_validate);
+   TestSuite_AddMockServerTest(suite, "/Collection/count_documents", test_count_documents);
+   TestSuite_AddLive(suite, "/Collection/count_documents_live", test_count_documents_live);
+   TestSuite_AddMockServerTest(suite, "/Collection/estimated_document_count", test_estimated_document_count);
+   TestSuite_AddLive(suite, "/Collection/estimated_document_count_live", test_estimated_document_count_live);
+   TestSuite_AddMockServerTest(suite, "/Collection/aggregate_with_batch_size", test_aggregate_with_batch_size);
+   TestSuite_AddFull(suite,
+                     "/Collection/fam/no_error_on_retry",
+                     test_fam_no_error_on_retry,
+                     NULL,
+                     NULL,
+                     test_framework_skip_if_no_failpoint,
+                     test_framework_skip_if_max_wire_version_more_than_9);
+   TestSuite_AddLive(suite, "/Collection/hint_is_validated/aggregate", test_hint_is_validated_aggregate);
+   TestSuite_AddLive(suite, "/Collection/hint_is_validated/countDocuments", test_hint_is_validated_countDocuments);
+   TestSuite_AddLive(suite, "/Collection/create_indexes_with_opts", test_create_indexes_with_opts);
+   TestSuite_AddFull(suite,
+                     "/Collection/create_indexes_with_opts/commitQuorum/pre44",
+                     test_create_indexes_with_opts_commitQuorum_pre44,
+                     NULL /* _dtor */,
+                     NULL /* _ctx */,
+                     // commitQuorum option is not available on standalone servers.
+                     test_framework_skip_if_not_replset,
+                     // Server Version 4.4 has Wire Version 9.
+                     test_framework_skip_if_max_wire_version_more_than_8);
+   TestSuite_AddFull(suite,
+                     "/Collection/create_indexes_with_opts/commitQuorum/post44",
+                     test_create_indexes_with_opts_commitQuorum_post44,
+                     NULL /* _dtor */,
+                     NULL /* _ctx */,
+                     // commitQuorum option is not available on standalone servers.
+                     test_framework_skip_if_not_replset,
+                     // Server Version 4.4 has Wire Version 9.
+                     test_framework_skip_if_max_wire_version_less_than_9);
+   TestSuite_AddFull(suite,
+                     "/Collection/create_indexes_with_opts/no_retry",
+                     test_create_indexes_with_opts_no_retry,
+                     NULL /* _dtor */,
+                     NULL /* _ctx */,
+                     // requires failpoint
+                     test_framework_skip_if_no_failpoint);
+   TestSuite_AddLive(suite, "/Collection/insert_one_reports_id", test_insert_one_reports_id);
+
+   TestSuite_AddFull(suite,
+                     "/Collection/test_create_indexes_acts_as_write_command",
+                     test_create_indexes_acts_as_write_command,
+                     NULL /* _dtor */,
+                     NULL /* _ctx */,
+                     // requires failpoint
+                     test_framework_skip_if_no_failpoint,
+                     // Server Version 4.4 has Wire Version 9 - w < 0 does not error on earlier versions.
+                     test_framework_skip_if_max_wire_version_less_than_9);
 }
