mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
(fix) Prevented a potential SEGFAULT in expand_star
This commit is contained in:
parent
f8f3d8ccca
commit
3ae29cbdf7
3 changed files with 32 additions and 9 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/22 13:14:27 by kcolin #+# #+# */
|
/* Created: 2025/04/22 13:14:27 by kcolin #+# #+# */
|
||||||
/* Updated: 2025/04/25 18:02:13 by jguelen ### ########.fr */
|
/* Updated: 2025/04/30 14:25:22 by jguelen ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -45,5 +45,8 @@ void build_pattern_checks(char *str, t_worddesc *pattern,
|
||||||
void clean_pattern(t_worddesc *file_pattern);
|
void clean_pattern(t_worddesc *file_pattern);
|
||||||
int ispattern(t_worddesc *desc);
|
int ispattern(t_worddesc *desc);
|
||||||
t_worddesc *deal_with_potential_pattern_marker(t_worddesc *file_pattern);
|
t_worddesc *deal_with_potential_pattern_marker(t_worddesc *file_pattern);
|
||||||
|
t_wordlist *add_file_to_list(t_wordlist **list, char *filename);
|
||||||
|
t_wordlist *deal_with_pattern_matching(t_wordlist **file_wordlist,
|
||||||
|
struct dirent *new, DIR *current_dir, t_worddesc *file_pattern);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,12 @@
|
||||||
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/20 15:01:38 by jguelen #+# #+# */
|
/* Created: 2025/03/20 15:01:38 by jguelen #+# #+# */
|
||||||
/* Updated: 2025/04/26 15:18:35 by jguelen ### ########.fr */
|
/* Updated: 2025/04/30 14:07:14 by jguelen ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "libft.h"
|
#include "libft.h"
|
||||||
|
#include "../ft_errno.h"
|
||||||
#include "subst.h"
|
#include "subst.h"
|
||||||
#include "replace_substr.h"
|
#include "replace_substr.h"
|
||||||
|
|
||||||
|
|
@ -57,7 +58,7 @@ static DIR *open_current_dir(void)
|
||||||
** NOTE: In case of error, this function destroys *list in a similar fashion
|
** NOTE: In case of error, this function destroys *list in a similar fashion
|
||||||
** as worddesc_create destroys its first parameter in case of failure.
|
** as worddesc_create destroys its first parameter in case of failure.
|
||||||
*/
|
*/
|
||||||
static t_wordlist *add_file_to_list(t_wordlist **list, char *filename)
|
t_wordlist *add_file_to_list(t_wordlist **list, char *filename)
|
||||||
{
|
{
|
||||||
t_worddesc *file_desc;
|
t_worddesc *file_desc;
|
||||||
char *copy;
|
char *copy;
|
||||||
|
|
@ -107,11 +108,10 @@ static t_wordlist *expand_star_core(t_worddesc *file_pattern)
|
||||||
new = readdir(current_dir);
|
new = readdir(current_dir);
|
||||||
while (new)
|
while (new)
|
||||||
{
|
{
|
||||||
if (fits_pattern(new->d_name, file_pattern))
|
file_wordlist = deal_with_pattern_matching(&file_wordlist, new,
|
||||||
{
|
current_dir, file_pattern);
|
||||||
if (add_file_to_list(&file_wordlist, new->d_name) == NULL)
|
if (file_wordlist == NULL && ft_errno_get() != FT_ESUCCESS)
|
||||||
return (closedir(current_dir), NULL);
|
return (NULL);
|
||||||
}
|
|
||||||
new = readdir(current_dir);
|
new = readdir(current_dir);
|
||||||
}
|
}
|
||||||
closedir(current_dir);
|
closedir(current_dir);
|
||||||
|
|
@ -171,8 +171,11 @@ t_wordlist *expand_star(t_worddesc *file_pattern)
|
||||||
if (!ispattern(pattern_copy))
|
if (!ispattern(pattern_copy))
|
||||||
return (worddesc_destroy(pattern_copy), NULL);
|
return (worddesc_destroy(pattern_copy), NULL);
|
||||||
clean_pattern(pattern_copy);
|
clean_pattern(pattern_copy);
|
||||||
|
ft_errno(FT_ESUCCESS);
|
||||||
expanded = expand_star_core(pattern_copy);
|
expanded = expand_star_core(pattern_copy);
|
||||||
worddesc_destroy(pattern_copy);
|
worddesc_destroy(pattern_copy);
|
||||||
|
if (!expanded)
|
||||||
|
return (NULL);
|
||||||
if (ft_strcmp(expanded->word->word, file_pattern->word))
|
if (ft_strcmp(expanded->word->word, file_pattern->word))
|
||||||
return (expanded);
|
return (expanded);
|
||||||
wordlist_destroy(expanded);
|
wordlist_destroy(expanded);
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,11 @@
|
||||||
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/15 15:09:56 by jguelen #+# #+# */
|
/* Created: 2025/03/15 15:09:56 by jguelen #+# #+# */
|
||||||
/* Updated: 2025/04/26 15:06:41 by jguelen ### ########.fr */
|
/* Updated: 2025/04/30 14:04:57 by jguelen ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "../ft_errno.h"
|
||||||
#include "subst.h"
|
#include "subst.h"
|
||||||
#include "replace_substr.h"
|
#include "replace_substr.h"
|
||||||
|
|
||||||
|
|
@ -101,3 +102,19 @@ t_worddesc *deal_with_potential_pattern_marker(t_worddesc *file_pattern)
|
||||||
}
|
}
|
||||||
return (pattern_copy);
|
return (pattern_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_wordlist *deal_with_pattern_matching(t_wordlist **file_wordlist,
|
||||||
|
struct dirent *new, DIR *current_dir, t_worddesc *file_pattern)
|
||||||
|
{
|
||||||
|
char fit;
|
||||||
|
|
||||||
|
fit = fits_pattern(new->d_name, file_pattern);
|
||||||
|
if (fit == 1)
|
||||||
|
{
|
||||||
|
if (add_file_to_list(file_wordlist, new->d_name) == NULL)
|
||||||
|
return (closedir(current_dir), ft_errno(FT_ENOMEM), NULL);
|
||||||
|
}
|
||||||
|
else if (fit == -1)
|
||||||
|
return (closedir(current_dir), ft_errno(FT_ENOMEM), NULL);
|
||||||
|
return (*file_wordlist);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue