Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 12093) +++ trunk/src/layer.c (revision 12094) @@ -207,8 +207,14 @@ /* bound layer: if it is already bound to a real layer, use that, whatever it is (manual binding may override our local type match pattern) */ if (layer->meta.bound.real != NULL) { - layer = layer->meta.bound.real; - assert(!layer->is_bound); + int rec = 0; + while(layer->is_bound) { + layer = layer->meta.bound.real; + rec++; + if ((rec > PCB_MAX_BOUND_LAYER_RECURSION) || (layer == 0)) + return 0; + } + return pcb_layer_flags_(layer); /* tail recursion */ } Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 12093) +++ trunk/src/layer.h (revision 12094) @@ -28,6 +28,9 @@ #ifndef PCB_LAYER_H #define PCB_LAYER_H +/* How deep subcs can be nested */ +#define PCB_MAX_BOUND_LAYER_RECURSION 128 + typedef long int pcb_layer_id_t; typedef long int pcb_layergrp_id_t;