The "fc" (and "r", "history", etc.) commands allow a
pattern and replacement to be specified, e.g. "r
OLD=NEW". However, if the OLD string is empty, zsh
goes into an infinite loop.
This happens in all versions of zsh ever released, as
far as I can tell. For some versions, "kill -9" is
necessary to get rid of the looping shell; others
respond to "kill -1" (HUP).
The attached patch may be applied to 4.0.x, 3.1.x,
3.0.8, 3.0.7, 3.0.6, and possibly even 3.0.5 (with
small amounts of fuzz on the 3.x.y versions). Earlier
than that I'm not sure, and earlier than 3.0.0 the file
names will be different.