Better memory leak formatting
diff --git a/OpenSSL/test/util.py b/OpenSSL/test/util.py
index 11bdcb0..db33df2 100644
--- a/OpenSSL/test/util.py
+++ b/OpenSSL/test/util.py
@@ -123,19 +123,31 @@
                 c_stack = saved[::-1]
             stack.extend([frame + "\n" for frame in c_stack])
 
-            # XXX :(
-            # ptr = int(str(p).split()[-1][:-1], 16)
-            stack.insert(0, "Leaked %d bytes at:\n" % (size,))
+            stack.insert(0, "Leaked (%s) at:\n")
             return "".join(stack)
 
         if leaks:
-            total = 0
+            unique_leaks = {}
             for p in leaks:
-                total += memdbg.heap[p][-1][0]
+                size = memdbg.heap[p][-1][0]
+                new_leak = format_leak(p)
+                if new_leak not in unique_leaks:
+                    unique_leaks[new_leak] = [(size, p)]
+                else:
+                    unique_leaks[new_leak].append((size, p))
+                memdbg.free(p)
+
+            for (stack, allocs) in unique_leaks.iteritems():
+                allocs_accum = []
+                for (size, pointer) in allocs:
+
+                    addr = int(api.ffi.cast('uintptr_t', pointer))
+                    allocs_accum.append("%d@0x%x" % (size, addr))
+                allocs_report = ", ".join(sorted(allocs_accum))
+
                 result.addError(
                     self,
-                    (None, Exception(format_leak(p)), None))
-                memdbg.free(p)
+                    (None, Exception(stack % (allocs_report,)), None))
 
 
     def tearDown(self):