diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index dca75a817b7414..988e41dbc9aa22 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -849,7 +849,9 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) {
   Local<String> needle = args[1].As<String>();
   const char* haystack = ts_obj_data;
   const size_t haystack_length = ts_obj_length;
-  const size_t needle_length = needle->Utf8Length();
+  // Extended latin-1 characters are 2 bytes in Utf8.
+  const size_t needle_length =
+      enc == BINARY ? needle->Length() : needle->Utf8Length();
 
 
   if (needle_length == 0 || haystack_length == 0) {
diff --git a/test/parallel/test-buffer-indexof.js b/test/parallel/test-buffer-indexof.js
index 83776be80a37ee..b075c3a10d8f4c 100644
--- a/test/parallel/test-buffer-indexof.js
+++ b/test/parallel/test-buffer-indexof.js
@@ -109,6 +109,15 @@ assert.equal(
 assert.equal(
     Buffer(b.toString('binary'), 'binary')
     .indexOf(Buffer('d', 'binary'), 0, 'binary'), 3);
+assert.equal(
+    Buffer('aa\u00e8aa', 'binary')
+    .indexOf('\u00e8', 'binary'), 2);
+assert.equal(
+    Buffer('\u00e8', 'binary')
+    .indexOf('\u00e8', 'binary'), 0);
+assert.equal(
+    Buffer('\u00e8', 'binary')
+    .indexOf(Buffer('\u00e8', 'binary'), 'binary'), 0);
 
 
 // test optional offset with passed encoding