| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 0606f92 commit 3abb607
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -704,20 +704,21 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate, | |||
| 704 | 704 | } | |
| 705 | 705 | ||
| 706 | 706 | case UCS2: { | |
| 707 | + size_t str_len = buflen / 2; | ||
| 707 | 708 | if (IsBigEndian()) { | |
| 708 | - uint16_t* dst = node::UncheckedMalloc<uint16_t>(buflen / 2); | ||
| 709 | - if (dst == nullptr) { | ||
| 709 | + uint16_t* dst = node::UncheckedMalloc<uint16_t>(str_len); | ||
| 710 | + if (str_len != 0 && dst == nullptr) { | ||
| 710 | 711 | *error = node::ERR_MEMORY_ALLOCATION_FAILED(isolate); | |
| 711 | 712 | return MaybeLocal<Value>(); | |
| 712 | 713 | } | |
| 713 | - for (size_t i = 0, k = 0; k < buflen / 2; i += 2, k += 1) { | ||
| 714 | + for (size_t i = 0, k = 0; k < str_len; i += 2, k += 1) { | ||
| 714 | 715 | // The input is in *little endian*, because that's what Node.js | |
| 715 | 716 | // expects, so the high byte comes after the low byte. | |
| 716 | 717 | const uint8_t hi = static_cast<uint8_t>(buf[i + 1]); | |
| 717 | 718 | const uint8_t lo = static_cast<uint8_t>(buf[i + 0]); | |
| 718 | 719 | dst[k] = static_cast<uint16_t>(hi) << 8 | lo; | |
| 719 | 720 | } | |
| 720 | - return ExternTwoByteString::New(isolate, dst, buflen / 2, error); | ||
| 721 | + return ExternTwoByteString::New(isolate, dst, str_len, error); | ||
| 721 | 722 | } | |
| 722 | 723 | if (reinterpret_cast<uintptr_t>(buf) % 2 != 0) { | |
| 723 | 724 | // Unaligned data still means we can't directly pass it to V8. | |
@@ -728,10 +729,10 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate, | |||
| 728 | 729 | } | |
| 729 | 730 | memcpy(dst, buf, buflen); | |
| 730 | 731 | return ExternTwoByteString::New( | |
| 731 | - isolate, reinterpret_cast<uint16_t*>(dst), buflen / 2, error); | ||
| 732 | + isolate, reinterpret_cast<uint16_t*>(dst), str_len, error); | ||
| 732 | 733 | } | |
| 733 | 734 | return ExternTwoByteString::NewFromCopy( | |
| 734 | - isolate, reinterpret_cast<const uint16_t*>(buf), buflen / 2, error); | ||
| 735 | + isolate, reinterpret_cast<const uint16_t*>(buf), str_len, error); | ||
| 735 | 736 | } | |
| 736 | 737 | ||
| 737 | 738 | default: | |
@@ -747,6 +748,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate, | |||
| 747 | 748 | const uint16_t* buf, | |
| 748 | 749 | size_t buflen, | |
| 749 | 750 | Local<Value>* error) { | |
| 751 | + if (buflen == 0) return String::Empty(isolate); | ||
| 750 | 752 | CHECK_BUFLEN_IN_RANGE(buflen); | |
| 751 | 753 | ||
| 752 | 754 | // Node's "ucs2" encoding expects LE character data inside a | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -361,14 +361,12 @@ T* UncheckedRealloc(T* pointer, size_t n) { | |||
| 361 | 361 | // As per spec realloc behaves like malloc if passed nullptr. | |
| 362 | 362 | template <typename T> | |
| 363 | 363 | inline T* UncheckedMalloc(size_t n) { | |
| 364 | - if (n == 0) n = 1; | ||
| 365 | 364 | return UncheckedRealloc<T>(nullptr, n); | |
| 366 | 365 | } | |
| 367 | 366 | ||
| 368 | 367 | template <typename T> | |
| 369 | 368 | inline T* UncheckedCalloc(size_t n) { | |
| 370 | - if (n == 0) n = 1; | ||
| 371 | - MultiplyWithOverflowCheck(sizeof(T), n); | ||
| 369 | + if (MultiplyWithOverflowCheck(sizeof(T), n) == 0) return nullptr; | ||
| 372 | 370 | return static_cast<T*>(calloc(n, sizeof(T))); | |
| 373 | 371 | } | |
| 374 | 372 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -97,39 +97,39 @@ TEST(UtilTest, ToLower) { | |||
| 97 | 97 | EXPECT_EQ('a', ToLower('A')); | |
| 98 | 98 | } | |
| 99 | 99 | ||
| 100 | - #define TEST_AND_FREE(expression) \ | ||
| 101 | - do { \ | ||
| 102 | - auto pointer = expression; \ | ||
| 103 | - EXPECT_NE(nullptr, pointer); \ | ||
| 104 | - free(pointer); \ | ||
| 100 | + #define TEST_AND_FREE(expression, size) \ | ||
| 101 | + do { \ | ||
| 102 | + auto pointer = expression(size); \ | ||
| 103 | + EXPECT_EQ(pointer == nullptr, size == 0); \ | ||
| 104 | + free(pointer); \ | ||
| 105 | 105 | } while (0) | |
| 106 | 106 | ||
| 107 | 107 | TEST(UtilTest, Malloc) { | |
| 108 | - TEST_AND_FREE(Malloc<char>(0)); | ||
| 109 | - TEST_AND_FREE(Malloc<char>(1)); | ||
| 110 | - TEST_AND_FREE(Malloc(0)); | ||
| 111 | - TEST_AND_FREE(Malloc(1)); | ||
| 108 | + TEST_AND_FREE(Malloc<char>, 0); | ||
| 109 | + TEST_AND_FREE(Malloc<char>, 1); | ||
| 110 | + TEST_AND_FREE(Malloc, 0); | ||
| 111 | + TEST_AND_FREE(Malloc, 1); | ||
| 112 | 112 | } | |
| 113 | 113 | ||
| 114 | 114 | TEST(UtilTest, Calloc) { | |
| 115 | - TEST_AND_FREE(Calloc<char>(0)); | ||
| 116 | - TEST_AND_FREE(Calloc<char>(1)); | ||
| 117 | - TEST_AND_FREE(Calloc(0)); | ||
| 118 | - TEST_AND_FREE(Calloc(1)); | ||
| 115 | + TEST_AND_FREE(Calloc<char>, 0); | ||
| 116 | + TEST_AND_FREE(Calloc<char>, 1); | ||
| 117 | + TEST_AND_FREE(Calloc, 0); | ||
| 118 | + TEST_AND_FREE(Calloc, 1); | ||
| 119 | 119 | } | |
| 120 | 120 | ||
| 121 | 121 | TEST(UtilTest, UncheckedMalloc) { | |
| 122 | - TEST_AND_FREE(UncheckedMalloc<char>(0)); | ||
| 123 | - TEST_AND_FREE(UncheckedMalloc<char>(1)); | ||
| 124 | - TEST_AND_FREE(UncheckedMalloc(0)); | ||
| 125 | - TEST_AND_FREE(UncheckedMalloc(1)); | ||
| 122 | + TEST_AND_FREE(UncheckedMalloc<char>, 0); | ||
| 123 | + TEST_AND_FREE(UncheckedMalloc<char>, 1); | ||
| 124 | + TEST_AND_FREE(UncheckedMalloc, 0); | ||
| 125 | + TEST_AND_FREE(UncheckedMalloc, 1); | ||
| 126 | 126 | } | |
| 127 | 127 | ||
| 128 | 128 | TEST(UtilTest, UncheckedCalloc) { | |
| 129 | - TEST_AND_FREE(UncheckedCalloc<char>(0)); | ||
| 130 | - TEST_AND_FREE(UncheckedCalloc<char>(1)); | ||
| 131 | - TEST_AND_FREE(UncheckedCalloc(0)); | ||
| 132 | - TEST_AND_FREE(UncheckedCalloc(1)); | ||
| 129 | + TEST_AND_FREE(UncheckedCalloc<char>, 0); | ||
| 130 | + TEST_AND_FREE(UncheckedCalloc<char>, 1); | ||
| 131 | + TEST_AND_FREE(UncheckedCalloc, 0); | ||
| 132 | + TEST_AND_FREE(UncheckedCalloc, 1); | ||
| 133 | 133 | } | |
| 134 | 134 | ||
| 135 | 135 | template <typename T> | |
| Back | FazBrowse Home | New Git URL |
0 commit comments