Merge "iconv(3): ignore src_bytes_left if src_bytes is null."
diff --git a/libc/bionic/iconv.cpp b/libc/bionic/iconv.cpp
index 015d70f..79a429c 100644
--- a/libc/bionic/iconv.cpp
+++ b/libc/bionic/iconv.cpp
@@ -356,6 +356,10 @@
     errno = EBADF;
     return -1;
   }
+
+  // Since none of our encodings are stateful, state flushing is a no-op.
+  if (!__src_buf) return 0;
+
   return __converter->Convert(__src_buf, __src_bytes_left, __dst_buf, __dst_bytes_left);
 }
 
diff --git a/tests/iconv_test.cpp b/tests/iconv_test.cpp
index 768b4fd..bd99000 100644
--- a/tests/iconv_test.cpp
+++ b/tests/iconv_test.cpp
@@ -451,5 +451,13 @@
   EXPECT_EQ(0, errno);
   EXPECT_EQ(sizeof(out_buf), out_bytes);
 
+  // Is a null pointer and so is in_bytes. This isn't specified by POSIX, but
+  // glibc and macOS both allow that, where Android historically didn't.
+  // https://issuetracker.google.com/180598400
+  errno = 0;
+  ASSERT_EQ(static_cast<size_t>(0), iconv(c, nullptr, nullptr, &out, &out_bytes));
+  EXPECT_EQ(0, errno);
+  EXPECT_EQ(sizeof(out_buf), out_bytes);
+
   EXPECT_EQ(0, iconv_close(c));
 }