diff --git a/configure b/configure
index a2ca9f68f5db853b7cb146230c33b49bf938911e..817c9cfac77d0d7ca13c11ad28ec11450ae36a35 100755
--- a/configure
+++ b/configure
@@ -1243,6 +1243,12 @@ ARCH_EXT_LIST="
     mipsdspr2
 "
 
+HAVE_LIST_CMDLINE='
+    inline_asm
+    symver
+    yasm
+'
+
 HAVE_LIST_PUB='
     bigendian
     fast_unaligned
@@ -1253,6 +1259,7 @@ HAVE_LIST="
     $ARCH_EXT_LIST
     $(add_suffix _external $ARCH_EXT_LIST)
     $(add_suffix _inline   $ARCH_EXT_LIST)
+    $HAVE_LIST_CMDLINE
     $HAVE_LIST_PUB
     $THREADS_LIST
     aligned_malloc
@@ -1305,7 +1312,6 @@ HAVE_LIST="
     gnu_as
     ibm_asm
     inet_aton
-    inline_asm
     io_h
     isatty
     isinf
@@ -1369,7 +1375,6 @@ HAVE_LIST="
     struct_sockaddr_sa_len
     struct_sockaddr_storage
     struct_v4l2_frmivalenum_discrete
-    symver
     symver_asm_label
     symver_gnu_asm
     sysconf
@@ -1395,7 +1400,6 @@ HAVE_LIST="
     xform_asm
     xgetbv
     xmm_clobbers
-    yasm
 "
 
 # options emitted with CONFIG_ prefix but not available on command line
@@ -1427,18 +1431,16 @@ CONFIG_EXTRA="
 CMDLINE_SELECT="
     $ARCH_EXT_LIST
     $CONFIG_LIST
+    $HAVE_LIST_CMDLINE
     $THREADS_LIST
     asm
     coverage
     cross_compile
     debug
     extra_warnings
-    inline_asm
     logging
     optimizations
     stripping
-    symver
-    yasm
 "
 
 PATHS_LIST='
diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c
index 60859b7e4bf7211c9657d70c871754ebce2675b3..490e6925f5f065c7de239015774dd4af1a4707c0 100644
--- a/libavcodec/libspeexdec.c
+++ b/libavcodec/libspeexdec.c
@@ -39,35 +39,42 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx)
 {
     LibSpeexContext *s = avctx->priv_data;
     const SpeexMode *mode;
-
-    // defaults in the case of a missing header
-    if (avctx->sample_rate <= 8000)
-        mode = &speex_nb_mode;
-    else if (avctx->sample_rate <= 16000)
-        mode = &speex_wb_mode;
-    else
-        mode = &speex_uwb_mode;
+    int spx_mode;
 
     if (avctx->extradata_size >= 80)
         s->header = speex_packet_to_header(avctx->extradata, avctx->extradata_size);
 
     avctx->sample_fmt = AV_SAMPLE_FMT_S16;
     if (s->header) {
-        avctx->sample_rate = s->header->rate;
         avctx->channels    = s->header->nb_channels;
         s->frame_size      = s->header->frame_size;
-
-        mode = speex_lib_get_mode(s->header->mode);
-        if (!mode) {
-            av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d\n", s->header->mode);
-            return AVERROR_INVALIDDATA;
+        spx_mode           = s->header->mode;
+    } else {
+        switch (avctx->sample_rate) {
+        case 8000:  spx_mode = 0; break;
+        case 16000: spx_mode = 1; break;
+        case 32000: spx_mode = 2; break;
+        default:
+            /* libspeex can handle any mode if initialized as ultra-wideband */
+            av_log(avctx, AV_LOG_WARNING, "Invalid sample rate: %d\n"
+                                          "Decoding as 32kHz ultra-wideband\n",
+                                          avctx->sample_rate);
+            spx_mode = 2;
         }
-    } else
-        av_log(avctx, AV_LOG_INFO, "Missing Speex header, assuming defaults.\n");
+    }
+
+    mode = speex_lib_get_mode(spx_mode);
+    if (!mode) {
+        av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", spx_mode);
+        return AVERROR_INVALIDDATA;
+    }
+    avctx->sample_rate = 8000 << spx_mode;
 
-    if (avctx->channels > 2) {
-        av_log(avctx, AV_LOG_ERROR, "Only stereo and mono are supported.\n");
-        return AVERROR(EINVAL);
+    if (avctx->channels < 1 || avctx->channels > 2) {
+        /* libspeex can handle mono or stereo if initialized as stereo */
+        av_log(avctx, AV_LOG_ERROR, "Invalid channel count: %d.\n"
+                                    "Decoding as stereo.\n", avctx->channels);
+        avctx->channels = 2;
     }
 
     speex_bits_init(&s->bits);
diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c
index 5fe95e8d8a08f881e52c13e9554390e1ab6e9fcb..cdc2952dea8e9e57bd686beb83ecec4e74d99e7e 100644
--- a/libavutil/blowfish.c
+++ b/libavutil/blowfish.c
@@ -380,15 +380,15 @@ void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
 
             av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt);
 
-            AV_WB32(dst, v0);
-            AV_WB32(dst + 4, v1);
-
             if (iv) {
-                for (i = 0; i < 8; i++)
-                    dst[i] = dst[i] ^ iv[i];
+                v0 ^= AV_RB32(iv);
+                v1 ^= AV_RB32(iv + 4);
                 memcpy(iv, src, 8);
             }
 
+            AV_WB32(dst, v0);
+            AV_WB32(dst + 4, v1);
+
             src   += 8;
             dst   += 8;
         }
@@ -509,32 +509,61 @@ static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = {
 /* plaintext bytes */
 static const uint8_t plaintext[8] = "BLOWFISH";
 
+static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH";
+
 /* ciphertext bytes */
 static const uint8_t ciphertext[8] = {
     0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03
 };
 
+static const uint8_t ciphertext2[16] = {
+    0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99,
+    0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1,
+};
+
+#define IV "blowfish"
+
+#undef exit
+static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
+                          const uint8_t *ref, int len, uint8_t *iv, int dir,
+                          const char *test)
+{
+    av_blowfish_crypt(ctx, dst, src, len, iv, dir);
+    if (memcmp(dst, ref, 8*len)) {
+        int i;
+        printf("%s failed\ngot      ", test);
+        for (i = 0; i < 8*len; i++)
+            printf("%02x ", dst[i]);
+        printf("\nexpected ");
+        for (i = 0; i < 8*len; i++)
+            printf("%02x ", ref[i]);
+        printf("\n");
+        exit(1);
+    }
+}
+
 int main(void)
 {
     AVBlowfish ctx;
     uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS];
     uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS];
-    uint8_t tmp[8];
+    uint8_t tmp[16], iv[8];
     int i;
 
     av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26);
 
-    av_blowfish_crypt(&ctx, tmp, plaintext, 1, NULL, 0);
-    if (memcmp(tmp, ciphertext, 8)) {
-        printf("Test encryption failed.\n");
-        return 1;
-    }
-
-    av_blowfish_crypt(&ctx, tmp, ciphertext, 1, NULL, 1);
-    if (memcmp(tmp, plaintext, 8)) {
-        printf("Test decryption failed.\n");
-        return 1;
-    }
+    test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption");
+    test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption");
+    test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption");
+    test_blowfish(&ctx, tmp, tmp, plaintext,  1, NULL, 1, "Inplace decryption");
+    memcpy(iv, IV, 8);
+    test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption");
+    memcpy(iv, IV, 8);
+    test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption");
+    memcpy(iv, IV, 8);
+    test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption");
+    memcpy(iv, IV, 8);
+    test_blowfish(&ctx, tmp, tmp, plaintext2,  2, iv, 1, "Inplace CBC decryption");
 
     memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS);
     memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS);
diff --git a/libavutil/internal.h b/libavutil/internal.h
index 2f92db6853113e44c6909b6209a1024a16b74b6d..f18e37a243739ba82c32b12ef516c4b94c5f83f6 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -71,8 +71,6 @@
 #define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
 #undef  strcat
 #define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
-#undef  strncpy
-#define strncpy strncpy_is_forbidden_due_to_security_issues_use_av_strlcpy
 #undef  exit
 #define exit exit_is_forbidden
 #undef  printf
diff --git a/libavutil/xtea.c b/libavutil/xtea.c
index 1c2bd046398c61728ee52a34f813124977ead04a..9c41f140faf4780ad98edd4e197956486290a82a 100644
--- a/libavutil/xtea.c
+++ b/libavutil/xtea.c
@@ -96,8 +96,8 @@ static void xtea_crypt_ecb(AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
         DSTEP(0x9E3779B9U, k3, k0);
 #endif
         if (iv) {
-            v0 ^= AV_RB32(iv  );
-            v1 ^= AV_RB32(iv+4);
+            v0 ^= AV_RB32(iv);
+            v1 ^= AV_RB32(iv + 4);
             memcpy(iv, src, 8);
         }
     } else {
@@ -220,27 +220,39 @@ static const uint8_t xtea_test_ct[XTEA_NUM_TESTS][8] = {
     { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }
 };
 
+#undef exit
+static void test_xtea(AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
+                      const uint8_t *ref, int len, uint8_t *iv, int dir,
+                      const char *test)
+{
+    av_xtea_crypt(ctx, dst, src, len, iv, dir);
+    if (memcmp(dst, ref, 8*len)) {
+        int i;
+        printf("%s failed\ngot      ", test);
+        for (i = 0; i < 8*len; i++)
+            printf("%02x ", dst[i]);
+        printf("\nexpected ");
+        for (i = 0; i < 8*len; i++)
+            printf("%02x ", ref[i]);
+        printf("\n");
+        exit(1);
+    }
+}
+
 int main(void)
 {
     AVXTEA ctx;
     uint8_t buf[8], iv[8];
     int i;
     const uint8_t src[32] = "HelloWorldHelloWorldHelloWorld";
-    uint8_t  ct[32];
-    uint8_t  pl[32];
-
-#define CHECK(dst, src, ref, len, iv, dir, error) \
-        av_xtea_crypt(&ctx, dst, src, len, iv, dir);\
-        if (memcmp(dst, ref, 8*len)) {\
-            printf(error);\
-            return 1;\
-        }
+    uint8_t ct[32];
+    uint8_t pl[32];
 
     for (i = 0; i < XTEA_NUM_TESTS; i++) {
         av_xtea_init(&ctx, xtea_test_key[i]);
 
-        CHECK(buf, xtea_test_pt[i], xtea_test_ct[i], 1, NULL, 0, "Test encryption failed.\n");
-        CHECK(buf, xtea_test_ct[i], xtea_test_pt[i], 1, NULL, 1, "Test decryption failed.\n");
+        test_xtea(&ctx, buf, xtea_test_pt[i], xtea_test_ct[i], 1, NULL, 0, "encryption");
+        test_xtea(&ctx, buf, xtea_test_ct[i], xtea_test_pt[i], 1, NULL, 1, "decryption");
 
         /* encrypt */
         memcpy(iv, "HALLO123", 8);
@@ -248,10 +260,10 @@ int main(void)
 
         /* decrypt into pl */
         memcpy(iv, "HALLO123", 8);
-        CHECK(pl, ct, src, 4, iv, 1, "Test IV decryption failed.\n");
+        test_xtea(&ctx, pl, ct, src, 4, iv, 1, "CBC decryption");
 
         memcpy(iv, "HALLO123", 8);
-        CHECK(ct, ct, src, 4, iv, 1, "Test IV inplace decryption failed.\n");
+        test_xtea(&ctx, ct, ct, src, 4, iv, 1, "CBC inplace decryption");
     }
 
     printf("Test encryption/decryption success.\n");