From: Lukas Jiriste Date: Mon, 8 Jul 2024 07:21:58 +0000 (+0200) Subject: Fix segmentation fault in fill_closure X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=74a588f4ebca44f5715b598d41ec297cc55480f1;p=Libft.git Fix segmentation fault in fill_closure 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. --- diff --git a/ft_parse/ft_parsing_table_generate.c b/ft_parse/ft_parsing_table_generate.c index 4784a74..654730f 100644 --- a/ft_parse/ft_parsing_table_generate.c +++ b/ft_parse/ft_parsing_table_generate.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); }