diff --git a/tsk/vs/dos.c b/tsk/vs/dos.c
index 06e95027b08fca922967b3f86e297d9c3282eca4..3bd128e7b693f7bbea283c8c52392b468940127b 100644
--- a/tsk/vs/dos.c
+++ b/tsk/vs/dos.c
@@ -751,6 +751,29 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur,
          * in extended partitions */
         if (dos_is_ext(part->ptype)) {
 
+            TSK_VS_PART_INFO *part_info;
+
+            /* Sanity check to prevent infinite recursion in dos_load_ext_table.
+             * If we already have a partition with this starting address then
+             * return an error. This will prevent any more partitions from being
+             * added but will leave any existing partitions alone. */
+            part_info = vs->part_list;
+            while (part_info != NULL) {
+                if (part_info->start == (TSK_DADDR_T)(sect_ext_base + part_start)) {
+                    if (tsk_verbose)
+                        tsk_fprintf(stderr,
+                            "Starting sector %" PRIuDADDR
+                            " of extended partition has already been used\n",
+                            (TSK_DADDR_T)(sect_ext_base + part_start));
+                    tsk_error_reset();
+                    tsk_error_set_errno(TSK_ERR_VS_BLK_NUM);
+                    tsk_error_set_errstr
+                        ("dos_load_ext_table: Loop in partition table detected");
+                    return 1;
+                }
+                part_info = part_info->next;
+            }
+
             /* part start is added to the start of the
              * first extended partition (the primary
              * extended partition) */