size_t offset = args[1]->Uint32Value();
- if (s->Length() > 0 && offset >= buffer->length_) {
+ int length = s->Length();
+
+ if (length == 0) {
+ constructor_template->GetFunction()->Set(chars_written_sym,
+ Integer::New(0));
+ return scope.Close(Integer::New(0));
+ }
+
+ if (length > 0 && offset >= buffer->length_) {
return ThrowException(Exception::TypeError(String::New(
"Offset is out of bounds")));
}
constructor_template->GetFunction()->Set(chars_written_sym,
Integer::New(char_written));
- if (written > 0 && p[written-1] == '\0') written--;
+ if (written > 0 && p[written-1] == '\0' && char_written == length) {
+ uint16_t last_char;
+ s->Write(&last_char, length - 1, 1, String::NO_HINTS);
+ if (last_char != 0 || written > s->Utf8Length()) {
+ written--;
+ }
+ }
return scope.Close(Integer::New(written));
}
assert.throws(function() {
new Buffer('"pong"', 0, 6, 8031, '127.0.0.1')
});
+
+// #1210 Test UTF-8 string includes null character
+var buf = new Buffer('\0');
+assert.equal(buf.length, 1);
+buf = new Buffer('\0\0');
+assert.equal(buf.length, 2);
+
+buf = new Buffer(2);
+var written = buf.write(''); // 0byte
+assert.equal(written, 0);
+written = buf.write('\0'); // 1byte (v8 adds null terminator)
+assert.equal(written, 1);
+written = buf.write('a\0'); // 1byte * 2
+assert.equal(written, 2);
+written = buf.write('あ'); // 3bytes
+assert.equal(written, 0);
+written = buf.write('\0あ'); // 1byte + 3bytes
+assert.equal(written, 1);
+written = buf.write('\0\0あ'); // 1byte * 2 + 3bytes
+assert.equal(written, 2);
+
+buf = new Buffer(10);
+written = buf.write('あいう'); // 3bytes * 3 (v8 adds null terminator)
+assert.equal(written, 9);
+written = buf.write('あいう\0'); // 3bytes * 3 + 1byte
+assert.equal(written, 10);
+