Clean up JVMTI DDMS extension function.

We change it to not return failure (and print a warning) if the chunk
handler returns an empty chunk. This is a surprisingly common result
in real-world code and was causing significant log-spam.

Bug: 70559172
Test: ./test.py --host -j50
Change-Id: I1ba0f43cb2e834b09f51db75ec9100d97e916b62
diff --git a/openjdkjvmti/ti_ddms.cc b/openjdkjvmti/ti_ddms.cc
index 500a453..0b4906d 100644
--- a/openjdkjvmti/ti_ddms.cc
+++ b/openjdkjvmti/ti_ddms.cc
@@ -49,14 +49,16 @@
                                  /*out*/jint* type_out,
                                  /*out*/jint* data_length_out,
                                  /*out*/jbyte** data_out) {
-  constexpr uint32_t kDdmHeaderSize = sizeof(uint32_t) * 2;
-  if (env == nullptr || data_in == nullptr || data_out == nullptr || data_length_out == nullptr) {
+  if (env == nullptr || type_out == nullptr || data_out == nullptr || data_length_out == nullptr) {
     return ERR(NULL_POINTER);
-  } else if (length_in < static_cast<jint>(kDdmHeaderSize)) {
-    // need to get type and length at least.
+  } else if (data_in == nullptr && length_in != 0) {
+    // Data-in shouldn't be null if we have data.
     return ERR(ILLEGAL_ARGUMENT);
   }
 
+  *data_length_out = 0;
+  *data_out = nullptr;
+
   art::Thread* self = art::Thread::Current();
   art::ScopedThreadStateChange(self, art::ThreadState::kNative);
 
@@ -71,13 +73,15 @@
     return ERR(INTERNAL);
   } else {
     jvmtiError error = OK;
-    JvmtiUniquePtr<jbyte[]> ret = AllocJvmtiUniquePtr<jbyte[]>(env, out_data.size(), &error);
-    if (error != OK) {
-      return error;
+    if (!out_data.empty()) {
+      JvmtiUniquePtr<jbyte[]> ret = AllocJvmtiUniquePtr<jbyte[]>(env, out_data.size(), &error);
+      if (error != OK) {
+        return error;
+      }
+      memcpy(ret.get(), out_data.data(), out_data.size());
+      *data_out = ret.release();
+      *data_length_out = static_cast<jint>(out_data.size());
     }
-    memcpy(ret.get(), out_data.data(), out_data.size());
-    *data_out = ret.release();
-    *data_length_out = static_cast<jint>(out_data.size());
     return OK;
   }
 }