From 7e0c3ab641c75cf5078f03695e54f7c238aa057f Mon Sep 17 00:00:00 2001
From: Nikolai Vavilov <vvnicholas@gmail.com>
Date: Wed, 22 Mar 2017 23:31:12 +0200
Subject: [PATCH] src: fix base64 decoding

Make sure trailing garbage is not treated as a valid base64 character.

Fixes: https://github.com/nodejs/node/issues/11987
PR-URL: https://github.com/nodejs/node/pull/11995
Reviewed-By: Anna Henningsen <anna@addaleax.net>
---
 src/base64.h                       | 4 ++--
 test/parallel/test-buffer-alloc.js | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/base64.h b/src/base64.h
index 64c4e330c0db84..92dc565e65eb1c 100644
--- a/src/base64.h
+++ b/src/base64.h
@@ -60,13 +60,13 @@ size_t base64_decode_slow(char* dst, size_t dstlen,
   size_t k = 0;
   for (;;) {
 #define V(expr)                                                               \
-    while (i < srclen) {                                                      \
+    for (;;) {                                                                \
       const uint8_t c = src[i];                                               \
       lo = unbase64(c);                                                       \
       i += 1;                                                                 \
       if (lo < 64)                                                            \
         break;  /* Legal character. */                                        \
-      if (c == '=')                                                           \
+      if (c == '=' || i >= srclen)                                            \
         return k;                                                             \
     }                                                                         \
     expr;                                                                     \
diff --git a/test/parallel/test-buffer-alloc.js b/test/parallel/test-buffer-alloc.js
index 59eac8266ce408..02ed1bcf63669e 100644
--- a/test/parallel/test-buffer-alloc.js
+++ b/test/parallel/test-buffer-alloc.js
@@ -464,6 +464,10 @@ assert.strictEqual(
 // Regression test for https://github.com/nodejs/node/issues/3496.
 assert.strictEqual(Buffer.from('=bad'.repeat(1e4), 'base64').length, 0);
 
+// Regression test for https://github.com/nodejs/node/issues/11987.
+assert.deepStrictEqual(Buffer.from('w0  ', 'base64'),
+                       Buffer.from('w0', 'base64'));
+
 {
   // Creating buffers larger than pool size.
   const l = Buffer.poolSize + 5;