fecdec: Add another sanity check to find_group().
[paraslash.git] / fecdec_filter.c
index a7d1875..5f37f1a 100644 (file)
@@ -117,10 +117,15 @@ static int find_group(struct fec_header *h,
        FOR_EACH_FECDEC_GROUP(fg, pfd) {
                if (fg->h.group_num != h->group_num)
                        continue;
        FOR_EACH_FECDEC_GROUP(fg, pfd) {
                if (fg->h.group_num != h->group_num)
                        continue;
+               if (fg->num_received_slices == 0)
+                       goto success;
                if (fg->h.slices_per_group != h->slices_per_group)
                if (fg->h.slices_per_group != h->slices_per_group)
-                       continue;
+                       return -E_BAD_FEC_HEADER;
                if (fg->h.data_slices_per_group != h->data_slices_per_group)
                if (fg->h.data_slices_per_group != h->data_slices_per_group)
-                       continue;
+                       return -E_BAD_FEC_HEADER;
+               if (fg->h.group_bytes != h->group_bytes)
+                       return -E_BAD_FEC_HEADER;
+success:
                *result = fg;
                return 1;
        }
                *result = fg;
                return 1;
        }
@@ -161,8 +166,8 @@ static struct fecdec_group *free_oldest_group(struct private_fecdec_data *pfd)
        }
        if (!group_complete(oldest) && !group_empty(oldest))
                PARA_WARNING_LOG("Clearing incomplete group %d "
        }
        if (!group_complete(oldest) && !group_empty(oldest))
                PARA_WARNING_LOG("Clearing incomplete group %d "
-                       "(contains %d slices)\n", fg->h.group_num,
-                       fg->num_received_slices);
+                       "(contains %d slices)\n", oldest->h.group_num,
+                       oldest->num_received_slices);
        clear_group(oldest);
        return oldest;
 }
        clear_group(oldest);
        return oldest;
 }
@@ -379,6 +384,7 @@ static void fecdec_close(struct filter_node *fn)
                clear_group(fg);
        free(fn->buf);
        fn->buf = NULL;
                clear_group(fg);
        free(fn->buf);
        fn->buf = NULL;
+       fec_free(pfd->fec);
        free(fn->private_data);
        fn->private_data = NULL;
 }
        free(fn->private_data);
        fn->private_data = NULL;
 }