Fix segmentation fault in fill_closure
authorLukas Jiriste <ljiriste@student.42prague.com>
Mon, 8 Jul 2024 07:21:58 +0000 (09:21 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Sun, 21 Jul 2024 18:21:21 +0000 (20:21 +0200)
When the add_predictions inside fill_closure has to enlarge closure to
add a new item, the original item pointer points to freed memory.
This is solved by making a copy.

ft_parse/ft_parsing_table_generate.c

index 4784a7446da273910653450f74c5adbd8d9a6d49..654730fc1a071b1a36ec7e0eb1575ccdfbd05ff8 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:16:53 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/07/07 09:44:14 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/07/08 09:20:19 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -403,30 +403,45 @@ t_ft_stat collapse_closure(__attribute__((unused))t_vec *closure)
        return (success);
 }
 
-t_ft_stat      fill_closure(t_vec *closure, const t_vec *kernel, const t_vec *rules, __attribute__((unused))const t_vec *tokens)
+t_ft_stat      fill_closure2(t_vec *closure, const t_vec *rules, const t_vec *tokens)
 {
-       size_t                          i;
-       const t_lr1_item        *item;
-       t_ft_stat                       res;
+       size_t          i;
+       t_lr1_item      *item;
+       t_ft_stat       res;
 
        i = 0;
-       while (i < kernel->size)
+       while (i < closure->size)
        {
-               item = ft_vec_caccess(kernel, i);
+               item = duplicate_item(ft_vec_caccess(closure, i));
+               if (!item)
+                       return (alloc_fail);
                res = add_predictions(closure, item, rules, tokens);
+               free_item(item);
                if (res != success)
                        return (res);
                ++i;
        }
+       return (success);
+}
+
+t_ft_stat      fill_closure(t_vec *closure, const t_vec *kernel, const t_vec *rules, __attribute__((unused))const t_vec *tokens)
+{
+       size_t                          i;
+       const t_lr1_item        *item;
+       t_ft_stat                       res;
+
        i = 0;
-       while (i < closure->size)
+       while (i < kernel->size)
        {
-               item = ft_vec_caccess(closure, i);
+               item = ft_vec_caccess(kernel, i);
                res = add_predictions(closure, item, rules, tokens);
                if (res != success)
                        return (res);
                ++i;
        }
+       res = fill_closure2(closure, rules, tokens);
+       if (res != success)
+               return (res);
        res = collapse_closure(closure);
        return (success);
 }