diff --git a/.hgtags b/.hgtags
index b873ea89267ec581ddc19119472839b1b9093906..3c31872ae0952f459daa53ac6c3ad3ec3156c39f 100644
--- a/.hgtags
+++ b/.hgtags
@@ -5,3 +5,4 @@ a09347d7b470290076b983aef98707921445a038 0.9.8.1
 82084a7b654e2a133ab64ceb47e03d6e7a204990 0.9.9.2.beta
 a89b05b78236a27a654f3004bdffc7b8a56311a7 0.10
 ef9d2c680684d0df7d81f529cda29e9e1741f575 cython-0.10.1
+92baafe0edf3cea00deb7ce1e31e337bb485af1a 0.10.2
diff --git a/Cython/Compiler/Buffer.py b/Cython/Compiler/Buffer.py
index c53a5ca4dec169dc49414fc04d6cfd6354ec9d1b..ad1bce58ab869b0dd7a37a7de21bccdbc66dc414 100644
--- a/Cython/Compiler/Buffer.py
+++ b/Cython/Compiler/Buffer.py
@@ -710,7 +710,11 @@ def use_py2_buffer_functions(env):
 
     # Search all types for __getbuffer__ overloads
     types = []
+    visited_scopes = set()
     def find_buffer_types(scope):
+        if scope in visited_scopes:
+            return
+        visited_scopes.add(scope)
         for m in scope.cimported_modules:
             find_buffer_types(m)
         for e in scope.type_entries:
diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py
index c024e91f972aee0019afa03f71841637de150940..049d378e1d05f7dceacfe1500bea21fb84432fe9 100644
--- a/Cython/Compiler/Nodes.py
+++ b/Cython/Compiler/Nodes.py
@@ -794,11 +794,30 @@ class CStructOrUnionDefNode(StatNode):
         self.entry = env.declare_struct_or_union(
             self.name, self.kind, scope, self.typedef_flag, self.pos,
             self.cname, visibility = self.visibility)
+        need_typedef_indirection = False
         if self.attributes is not None:
             if self.in_pxd and not env.in_cinclude:
                 self.entry.defined_in_pxd = 1
             for attr in self.attributes:
                 attr.analyse_declarations(env, scope)
+            for attr in scope.var_entries:
+                type = attr.type
+                while type.is_array:
+                    type = type.base_type
+                if type == self.entry.type:
+                    error(attr.pos, "Struct cannot contain itself as a member.")
+                if self.typedef_flag:
+                    while type.is_ptr:
+                        type = type.base_type
+                    if type == self.entry.type:
+                        need_typedef_indirection = True
+        if need_typedef_indirection and self.visibility != 'extern':
+            # C can't handle typedef structs that refer to themselves. 
+            struct_entry = self.entry
+            cname = env.new_const_cname()
+            self.entry = env.declare_typedef(self.name, struct_entry.type, self.pos, cname = self.cname, visibility='ignore')
+            struct_entry.type.typedef_flag = False
+            struct_entry.cname = struct_entry.type.cname = env.new_const_cname()
     
     def analyse_expressions(self, env):
         pass
diff --git a/Cython/Compiler/Version.py b/Cython/Compiler/Version.py
index f0d1f6a84d4ede4974924ffe05d2cc8fa57bb692..06b7ea5f4548aae2cde36c9f4e8c7250e1e8dd59 100644
--- a/Cython/Compiler/Version.py
+++ b/Cython/Compiler/Version.py
@@ -1 +1 @@
-version = '0.10.1'
+version = '0.10.2'
diff --git a/tests/compile/ctypedefstruct.pyx b/tests/compile/ctypedefstruct.pyx
index b52c215ad7cdf73a9a41e747a84810b3b27161e8..825583ecd7339c93706a5c914cbab11dd029db5f 100644
--- a/tests/compile/ctypedefstruct.pyx
+++ b/tests/compile/ctypedefstruct.pyx
@@ -7,3 +7,6 @@ cdef order order1
 order1.spam = 7
 order1.eggs = 2
 
+ctypedef struct linked:
+    int a
+    linked *next