Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

leak in fgets when assigning to buffer

I'm having problems understanding why following code leaks in one case, and not in the other case. The difference is

while(NULL!=fgets(buffer,length,file))//doesnt leak
while(NULL!=(buffer=fgets(buffer,length,file))//leaks

I thought it would be the same.

Full code below.

#include <stdio.h>
#include <stdlib.h>

#define LENS 10000

void no_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=fgets(buffer,LENS,fp)){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
void with_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=(buffer=fgets(buffer,LENS,fp))){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
like image 890
monkeyking Avatar asked Dec 23 '22 03:12

monkeyking


2 Answers

Because you are reassigning what buffer used to point to. By the time you get to the free(buffer); at the end of the code, buffer would be pointing to NULL (because that's what you tested for to get out the while loop) and hence when you call free, you're not calling it on the original pointer you malloc'd, you're calling it on nothing.

like image 169
Salgar Avatar answered Jan 06 '23 04:01

Salgar


If fgets() returns NULL, buffer loses it's original value so you no longer can free it.

like image 37
qrdl Avatar answered Jan 06 '23 03:01

qrdl