From 7717202c2b2f451bfc92cd475b85b106cc07374a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 21 Jul 2015 18:28:16 -0700 Subject: [PATCH] fix crash caused by wrong size of MetadataEntryStruct --- .../Internal/MetadataArraySafeHandle.cs | 29 ++++++++----------- src/csharp/ext/grpc_csharp_ext.c | 18 ++++++++++-- 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 ede85fb7f23..5dcc9f06fac 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; } - - /// - /// gprc_metadata from grpc/grpc.h - /// - [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 bd0a259593b..682521446f4 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 */