[681] in Kerberos-V5-bugs

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

Memory leaks in krb5_ktfileint_internal_read_entry

daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Thu Aug 25 16:21:16 1994

Date: Thu, 25 Aug 1994 16:22:21 -0400
From: "Jonathan I. Kamens" <jik@cam.ov.com>
To: krb5-bugs@MIT.EDU

This patch fixes a number of memory leaks when
krb5_ktfileint_internal_read_entry fails.

*** ktf_util.c	1993/09/20 20:21:52	1.1
--- ktf_util.c	1994/08/25 20:19:00
***************
*** 257,265 ****
      char	*tmpdata;
      krb5_data	*princ;
  
-     if (!(ret_entry = (krb5_keytab_entry *)calloc(1, sizeof(*ret_entry))))
- 	return ENOMEM;
- 
      /* fseek to synchronise buffered I/O on the key table. */
  
      if (fseek(KTFILEP(id), 0L, SEEK_CUR) < 0)
--- 257,262 ----
***************
*** 300,313 ****
      }
      if (!count || (count < 0))
  	return KRB5_KT_END;
!     ret_entry->principal = (krb5_principal)malloc(sizeof(krb5_principal_data));
!     if (!ret_entry->principal)
          return ENOMEM;
!     
      ret_entry->principal->length = count;
      ret_entry->principal->data = (krb5_data *)calloc(count, sizeof(krb5_data));
      if (!ret_entry->principal->data) {
! 	free(ret_entry->principal);    
  	return ENOMEM;
      }
  
--- 297,318 ----
      }
      if (!count || (count < 0))
  	return KRB5_KT_END;
! 
!     if (!(ret_entry = (krb5_keytab_entry *)calloc(1, sizeof(*ret_entry))))
! 	return ENOMEM;
! 
!     ret_entry->principal = (krb5_principal)calloc(1,
! 						  sizeof(krb5_principal_data));
!     if (!ret_entry->principal) {
! 	free(ret_entry);
          return ENOMEM;
!     }
! 
      ret_entry->principal->length = count;
      ret_entry->principal->data = (krb5_data *)calloc(count, sizeof(krb5_data));
      if (!ret_entry->principal->data) {
! 	free(ret_entry->principal);
! 	free(ret_entry);
  	return ENOMEM;
      }
  
***************
*** 429,435 ****
      fseek(KTFILEP(id), start_pos + size, SEEK_SET);
      return 0;
  fail:
!     
      for (i = 0; i < ret_entry->principal->length; i++) {
  	    princ = krb5_princ_component(ret_entry->principal, i);
  	    if (princ->data)
--- 434,444 ----
      fseek(KTFILEP(id), start_pos + size, SEEK_SET);
      return 0;
  fail:
! 
!     if (ret_entry->key.contents)
! 	free(ret_entry->key.contents);
!     if (ret_entry->principal->realm.data)
! 	free(ret_entry->principal->realm.data);
      for (i = 0; i < ret_entry->principal->length; i++) {
  	    princ = krb5_princ_component(ret_entry->principal, i);
  	    if (princ->data)
***************
*** 437,442 ****
--- 446,452 ----
      }
      free(ret_entry->principal->data);
      free(ret_entry->principal);
+     free(ret_entry);
      return error;
  }
  

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