Salve, non riesco a capire da dove arrivi questo problema dato che e la prima volta che lo incontro, non mi sembra di andare a fare free 2 volte sulla stessa variabile.
l'input utilizzato e un file di testo con dentro questo: 01234567890123456789012345678901234567890 (no newline)
il main e un semplice ciclo che richiama a get next line.
Con GDB ho appurato che il programma va in segfault nella funzione buffer_handler, alla seconda chiamata (dopo essere arrivata a fine file) i byte letti sono 0;
dovrebbe restituire NULL ma si ferma quando cerco di fare il free di stock.
Grazie in anticipo a chiunque abbia la pazienza di aiutarmi :)
(Ps. fate sapere qualora dovesse servirvi anche il file con le funzioni di appoggio)
char **trim_buffer(char *str)
{
int i;
char **tmp;
i = 0;
while (str[i] != '\0')
{
if (str[i] == '\n')
{
tmp = ft_split(str, '\n');
return (tmp);
}
i++;
}
return (NULL);
}
static char **buffer_handler(char *buffer, int fd)
{
char *tmp;
char **trim_result;
char **stock;
int read_bytes;
int i;
i = 0;
stock = (char **)malloc(sizeof(char *) * 2);
tmp = (char *)malloc(sizeof(char) * BUFFER_SIZE);
if (!tmp || !stock)
return (NULL);
read_bytes = read(fd, tmp, BUFFER_SIZE);
if (read_bytes == 0)
{
free(tmp);
while (stock[i] != NULL)
free(stock[i++]);
free(stock);
return (NULL);
}
trim_result = trim_buffer(tmp);
if (trim_result)
{
tmp = trim_result[0];
tmp = ft_strjoin(tmp, "\n");
stock[1] = ft_strdup(trim_result[1]);
}
tmp = ft_strjoin(buffer, tmp);
stock[0] = ft_strdup(tmp);
free(tmp);
return (stock);
}
char *get_next_line(int fd)
{
char *stock_buffer;
static char *res;
char *next_line;
char **holder;
next_line = NULL;
stock_buffer = NULL;
// Last control to fix the segfault with invalid fd
if (fd < 0 || BUFFER_SIZE <= 0 || read(fd, next_line, 0) < 0)
return (NULL);
if (res)
stock_buffer = ft_strjoin(stock_buffer, res);
while (ft_strchr(stock_buffer, '\n') == 0)
{
holder = buffer_handler(stock_buffer, fd);
if (holder == NULL && stock_buffer == NULL)
{
return (NULL);
}
else if (holder == NULL && stock_buffer[0] == '\0')
return (NULL);
else if (holder == NULL)
{
next_line = stock_buffer;
return (next_line);
}
stock_buffer = ft_strdup(holder[0]);
res = ft_strdup(holder[1]);
}
next_line = stock_buffer;
return (next_line);
}