aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jan Tattermusch <jtattermusch@google.com>2015-07-21 18:28:16 -0700
committerGravatar Jan Tattermusch <jtattermusch@google.com>2015-07-21 18:28:16 -0700
commit7717202c2b2f451bfc92cd475b85b106cc07374a (patch)
treebe04d88b04acb0e708d3a1ceb99e3dc469966b96
parente7e1c82d5e5f9bcad91390bd9b7c73c51c45f8cb (diff)
fix crash caused by wrong size of MetadataEntryStruct
-rw-r--r--src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs29
-rw-r--r--src/csharp/ext/grpc_csharp_ext.c18
2 files changed, 27 insertions, 20 deletions
diff --git a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
index ede85fb7f2..5dcc9f06fa 100644
--- a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
+++ b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
@@ -49,7 +49,13 @@ namespace Grpc.Core.Internal
static extern UIntPtr grpcsharp_metadata_array_count(IntPtr metadataArray);
[DllImport("grpc_csharp_ext.dll")]
- static extern MetadataEntryStruct grpcsharp_metadata_array_get(IntPtr metadataArray, UIntPtr index);
+ static extern IntPtr grpcsharp_metadata_array_get_key(IntPtr metadataArray, UIntPtr index);
+
+ [DllImport("grpc_csharp_ext.dll")]
+ static extern IntPtr grpcsharp_metadata_array_get_value(IntPtr metadataArray, UIntPtr index);
+
+ [DllImport("grpc_csharp_ext.dll")]
+ static extern UIntPtr grpcsharp_metadata_array_get_value_length(IntPtr metadataArray, UIntPtr index);
[DllImport("grpc_csharp_ext.dll")]
static extern void grpcsharp_metadata_array_destroy_full(IntPtr array);
@@ -82,12 +88,12 @@ namespace Grpc.Core.Internal
ulong count = grpcsharp_metadata_array_count(metadataArray).ToUInt64();
var metadata = new Metadata();
- for (ulong index = 0; index < count; index ++)
+ for (ulong i = 0; i < count; i ++)
{
- var rawEntry = grpcsharp_metadata_array_get(metadataArray, new UIntPtr(index));
- string key = Marshal.PtrToStringAnsi(rawEntry.key);
- var bytes = new byte[rawEntry.valueLength.ToUInt64()];
- Marshal.Copy(rawEntry.value, bytes, 0, bytes.Length);
+ var index = new UIntPtr(i);
+ string key = Marshal.PtrToStringAnsi(grpcsharp_metadata_array_get_key(metadataArray, index));
+ var bytes = new byte[grpcsharp_metadata_array_get_value_length(metadataArray, index).ToUInt64()];
+ Marshal.Copy(grpcsharp_metadata_array_get_value(metadataArray, index), bytes, 0, bytes.Length);
metadata.Add(new Metadata.Entry(key, bytes));
}
return metadata;
@@ -106,16 +112,5 @@ namespace Grpc.Core.Internal
grpcsharp_metadata_array_destroy_full(handle);
return true;
}
-
- /// <summary>
- /// gprc_metadata from grpc/grpc.h
- /// </summary>
- [StructLayout(LayoutKind.Sequential)]
- private struct MetadataEntryStruct
- {
- public IntPtr key; // const char*
- public IntPtr value; // const char*
- public UIntPtr valueLength;
- }
}
}
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c
index bd0a259593..682521446f 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -172,10 +172,22 @@ grpcsharp_metadata_array_count(grpc_metadata_array *array) {
return (gpr_intptr) array->count;
}
-GPR_EXPORT grpc_metadata GPR_CALLTYPE
-grpcsharp_metadata_array_get(grpc_metadata_array *array, size_t index) {
+GPR_EXPORT const char *GPR_CALLTYPE
+grpcsharp_metadata_array_get_key(grpc_metadata_array *array, size_t index) {
+ GPR_ASSERT(index < array->count);
+ return array->metadata[index].key;
+}
+
+GPR_EXPORT const char *GPR_CALLTYPE
+grpcsharp_metadata_array_get_value(grpc_metadata_array *array, size_t index) {
+ GPR_ASSERT(index < array->count);
+ return array->metadata[index].value;
+}
+
+GPR_EXPORT gpr_intptr GPR_CALLTYPE
+grpcsharp_metadata_array_get_value_length(grpc_metadata_array *array, size_t index) {
GPR_ASSERT(index < array->count);
- return array->metadata[index];
+ return (gpr_intptr) array->metadata[index].value_length;
}
/* Move contents of metadata array */