fix crash caused by wrong size of MetadataEntryStruct

pull/2597/head
Jan Tattermusch 10 years ago
parent e7e1c82d5e
commit 7717202c2b
  1. 29
      src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs
  2. 18
      src/csharp/ext/grpc_csharp_ext.c

@ -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;
}
}
}

@ -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 */

Loading…
Cancel
Save