Merge "hidl_string: empty string opt always applies"
diff --git a/base/HidlSupport.cpp b/base/HidlSupport.cpp
index af805b9..78faa2f 100644
--- a/base/HidlSupport.cpp
+++ b/base/HidlSupport.cpp
@@ -217,6 +217,14 @@
     if (size >= UINT32_MAX) {
         LOG(FATAL) << "string size can't exceed 2^32 bytes: " << size;
     }
+
+    if (size == 0) {
+        mBuffer = kEmptyString;
+        mSize = 0;
+        mOwnsBuffer = false;
+        return;
+    }
+
     char *buf = (char *)malloc(size + 1);
     memcpy(buf, data, size);
     buf[size] = '\0';
diff --git a/test_main.cpp b/test_main.cpp
index ea4dfd1..5c6c78e 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -175,6 +175,20 @@
     EXPECT_FALSE(hs2 <= hs1);
 }
 
+// empty string optimization should apply for any constructor
+TEST_F(LibHidlTest, HidlStringEmptyLiteralAllocation) {
+    using android::hardware::hidl_string;
+
+    hidl_string empty1;
+    hidl_string empty2("");
+    hidl_string empty3("foo", 0);
+    hidl_string empty4((std::string()));
+
+    EXPECT_EQ(empty1.c_str(), empty2.c_str());
+    EXPECT_EQ(empty1.c_str(), empty3.c_str());
+    EXPECT_EQ(empty1.c_str(), empty4.c_str());
+}
+
 TEST_F(LibHidlTest, MemoryTest) {
     using android::hardware::hidl_memory;