From 7ba0f860a6e30aed5ef7ea0d069106144bbd8477 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 10 Jun 2016 11:36:42 +0200 Subject: [PATCH] src: fix erroneous fallthrough in ParseEncoding() A missing 'break' statement unintentionally allowed "linary" and "luffer" as alternatives for "binary" and "buffer". Regression introduced in commit 54cc7212 ("buffer: introduce latin1 encoding term".) PR-URL: https://github.com/nodejs/node/pull/7262 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Trevor Norris --- Makefile | 2 +- src/node.cc | 1 + test/addons/parse-encoding/binding.cc | 36 ++++++++++++++++++++++++++ test/addons/parse-encoding/binding.gyp | 9 +++++++ test/addons/parse-encoding/test.js | 19 ++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 test/addons/parse-encoding/binding.cc create mode 100644 test/addons/parse-encoding/binding.gyp create mode 100644 test/addons/parse-encoding/test.js diff --git a/Makefile b/Makefile index 1bf61ddded100d..d82926dab75200 100644 --- a/Makefile +++ b/Makefile @@ -145,7 +145,7 @@ ADDONS_BINDING_GYPS := \ ADDONS_BINDING_SOURCES := \ $(filter-out test/addons/??_*/*.cc, $(wildcard test/addons/*/*.cc)) \ - $(filter-out test/addons/??_*/*.h, $(wildcard test/addons/*/*.h)) \ + $(filter-out test/addons/??_*/*.h, $(wildcard test/addons/*/*.h)) # Implicitly depends on $(NODE_EXE), see the build-addons rule for rationale. # Depends on node-gyp package.json so that build-addons is (re)executed when diff --git a/src/node.cc b/src/node.cc index 23b482dbb89fed..f9bbc24eac9a0e 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1416,6 +1416,7 @@ enum encoding ParseEncoding(const char* encoding, if (strncmp(encoding + 2, "tin1", 4) == 0) return LATIN1; } + break; case 'b': // binary if (encoding[1] == 'i') { diff --git a/test/addons/parse-encoding/binding.cc b/test/addons/parse-encoding/binding.cc new file mode 100644 index 00000000000000..def91901f06d09 --- /dev/null +++ b/test/addons/parse-encoding/binding.cc @@ -0,0 +1,36 @@ +#include "node.h" +#include "v8.h" + +namespace { + +#define ENCODING_MAP(V) \ + V(ASCII) \ + V(BASE64) \ + V(BUFFER) \ + V(HEX) \ + V(LATIN1) \ + V(UCS2) \ + V(UTF8) \ + +void ParseEncoding(const v8::FunctionCallbackInfo& args) { + const node::encoding encoding = + node::ParseEncoding(args.GetIsolate(), args[0], + static_cast(-1)); + const char* encoding_name = "UNKNOWN"; +#define V(name) if (encoding == node::name) encoding_name = #name; + ENCODING_MAP(V) +#undef V + auto encoding_string = + v8::String::NewFromUtf8(args.GetIsolate(), encoding_name, + v8::NewStringType::kNormal) + .ToLocalChecked(); + args.GetReturnValue().Set(encoding_string); +} + +void Initialize(v8::Local target) { + NODE_SET_METHOD(target, "parseEncoding", ParseEncoding); +} + +} // anonymous namespace + +NODE_MODULE(binding, Initialize); diff --git a/test/addons/parse-encoding/binding.gyp b/test/addons/parse-encoding/binding.gyp new file mode 100644 index 00000000000000..7ede63d94a0d77 --- /dev/null +++ b/test/addons/parse-encoding/binding.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'defines': [ 'V8_DEPRECATION_WARNINGS=1' ], + 'sources': [ 'binding.cc' ] + } + ] +} diff --git a/test/addons/parse-encoding/test.js b/test/addons/parse-encoding/test.js new file mode 100644 index 00000000000000..6c32374ca63307 --- /dev/null +++ b/test/addons/parse-encoding/test.js @@ -0,0 +1,19 @@ +'use strict'; + +require('../../common'); +const assert = require('assert'); +const { parseEncoding } = require('./build/Release/binding'); + +assert.strictEqual(parseEncoding(''), 'UNKNOWN'); + +assert.strictEqual(parseEncoding('ascii'), 'ASCII'); +assert.strictEqual(parseEncoding('base64'), 'BASE64'); +assert.strictEqual(parseEncoding('binary'), 'LATIN1'); +assert.strictEqual(parseEncoding('buffer'), 'BUFFER'); +assert.strictEqual(parseEncoding('hex'), 'HEX'); +assert.strictEqual(parseEncoding('latin1'), 'LATIN1'); +assert.strictEqual(parseEncoding('ucs2'), 'UCS2'); +assert.strictEqual(parseEncoding('utf8'), 'UTF8'); + +assert.strictEqual(parseEncoding('linary'), 'UNKNOWN'); +assert.strictEqual(parseEncoding('luffer'), 'UNKNOWN');