[675] in Kerberos-V5-bugs

home help back first fref pref prev next nref lref last post

Re: mit-kerberos5/2344: krb5_cc_destroy memory leaks

daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Tue Aug 23 17:17:54 1994

Date: Tue, 23 Aug 1994 17:19:01 -0400
From: "Jonathan I. Kamens" <jik@cam.ov.com>
To: krb5-bugs@MIT.EDU
Cc: bugs@cam.ov.com

The ccache destroy handlers for the FILE and STDIO ccache types don't
free memory properly.  At least, they didn't in beta 2, and I think
they still don't in beta 4.

The patch below is against beta 2; if it doesn't apply cleanly to beat
4, it should be pretty obvious from it what you have to do to fix the
problem.

  jik

*** lib/ccache/file/fcc_destry.c	1994/01/07 18:51:20	1.2
--- lib/ccache/file/fcc_destry.c	1994/08/23 21:11:22
***************
*** 50,57 ****
       
       if (OPENCLOSE(id)) {
  	  ret = open(((krb5_fcc_data *) id->data)->filename, O_RDWR, 0);
! 	  if (ret < 0)
! 	       return krb5_fcc_interpret(errno);
  	  ((krb5_fcc_data *) id->data)->fd = ret;
       }
       else
--- 50,59 ----
       
       if (OPENCLOSE(id)) {
  	  ret = open(((krb5_fcc_data *) id->data)->filename, O_RDWR, 0);
! 	  if (ret < 0) {
! 	      ret = krb5_fcc_interpret(errno);
! 	      goto cleanup;
! 	  }
  	  ((krb5_fcc_data *) id->data)->fd = ret;
       }
       else
***************
*** 64,70 ****
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 return ret;
       }
       
       ret = fstat(((krb5_fcc_data *) id->data)->fd, &buf);
--- 66,72 ----
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 goto cleanup;
       }
       
       ret = fstat(((krb5_fcc_data *) id->data)->fd, &buf);
***************
*** 74,80 ****
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 return ret;
       }
  
       /* XXX This may not be legal XXX */
--- 76,82 ----
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 goto cleanup;
       }
  
       /* XXX This may not be legal XXX */
***************
*** 88,94 ****
  		  (void) close(((krb5_fcc_data *)id->data)->fd);
  		  ((krb5_fcc_data *) id->data)->fd = -1;
  	      }
! 	      return ret;
  	  }
  
       if (write(((krb5_fcc_data *) id->data)->fd, zeros, size % BUFSIZ) < 0) {
--- 90,96 ----
  		  (void) close(((krb5_fcc_data *)id->data)->fd);
  		  ((krb5_fcc_data *) id->data)->fd = -1;
  	      }
! 	      goto cleanup;
  	  }
  
       if (write(((krb5_fcc_data *) id->data)->fd, zeros, size % BUFSIZ) < 0) {
***************
*** 97,103 ****
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 return ret;
       }
  
       ret = close(((krb5_fcc_data *) id->data)->fd);
--- 99,105 ----
  	     (void) close(((krb5_fcc_data *)id->data)->fd);
  	     ((krb5_fcc_data *) id->data)->fd = -1;
  	 }
! 	 goto cleanup;
       }
  
       ret = close(((krb5_fcc_data *) id->data)->fd);
***************
*** 105,110 ****
--- 107,117 ----
  
       if (ret)
  	 ret = krb5_fcc_interpret(errno);
+ 
+   cleanup:
+      xfree(((krb5_fcc_data *) id->data)->filename);
+      xfree(id->data);
+      xfree(id);
  
       return ret;
  }
*** lib/ccache/stdio/scc_destry.c	1993/09/20 20:20:48	1.1
--- lib/ccache/stdio/scc_destry.c	1994/08/23 21:11:03
***************
*** 66,72 ****
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 return ret;
       }
  
  #if 0
--- 66,72 ----
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 goto cleanup;
       }
  
  #if 0
***************
*** 82,88 ****
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 return ret;
       }
  
       /* XXX This may not be legal XXX */
--- 82,88 ----
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 goto cleanup;
       }
  
       /* XXX This may not be legal XXX */
***************
*** 96,102 ****
  		  (void) fclose(data->file);
  		  data->file = 0;
  	      }
! 	      return ret;
  	  }
  
       if (fwrite(data->file, zeros, size % BUFSIZ) < 0) {
--- 96,102 ----
  		  (void) fclose(data->file);
  		  data->file = 0;
  	      }
! 	      goto cleanup;
  	  }
  
       if (fwrite(data->file, zeros, size % BUFSIZ) < 0) {
***************
*** 105,111 ****
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 return ret;
       }
       
       ret = fclose(data->file);
--- 105,111 ----
  	     (void) fclose(data->file);
  	     data->file = 0;
  	 }
! 	 goto cleanup;
       }
       
       ret = fclose(data->file);
***************
*** 114,119 ****
--- 114,124 ----
  
       if (ret)
  	 ret = krb5_scc_interpret(errno);
+ 
+   cleanup:
+      xfree(data->filename);
+      xfree(data);
+      xfree(id);
  
       return ret;
  }

home help back first fref pref prev next nref lref last post