Fix a crash in the firewire / DCONS code that occurs when the crom data
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 21 Mar 2005 22:07:24 +0000 (22:07 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 21 Mar 2005 22:07:24 +0000 (22:07 +0000)
block is empty.  This case isn't supposed to happen but apparently
it can happen when two machines are connected together via a firewire
cable and one machine is rebooting.  Either the data block is cleared before
the reboot occurs, or the other machines manages to poll the first one
while it is booting and the data block is empty.

The actual problem causing the empty data block has not been tracked down.

sys/bus/firewire/fwcrom.c

index 25f71e5..d19b909 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/bus/firewire/fwcrom.c,v 1.5 2004/02/05 17:51:43 joerg Exp $
+ * $DragonFly: src/sys/bus/firewire/fwcrom.c,v 1.6 2005/03/21 22:07:24 dillon Exp $
  */
 
 #ifndef __DragonFly__
@@ -72,6 +72,18 @@ crom_init_context(struct crom_context *cc, u_int32_t *p)
        struct csrhdr *hdr;
 
        hdr = (struct csrhdr *)p;
+       if (hdr->info_len == 0) {
+               /* 
+                * This isn't supposed to happen but it does.   The problem
+                * is possibly related to fw_attach_dev()'s going from an
+                * FWDEVINIT to a FWDEVATTACHED state, or in a host<->host
+                * situation where one host gets the root directory for
+                * another before the other has actually initialized it.
+                */
+               printf("crom_init_context: WARNING, info_len is 0\n");
+               cc->depth = -1;
+               return;
+       }
        if (hdr->info_len == 1) {
                /* minimum ROM */
                cc->depth = -1;