[675] in Kerberos-V5-bugs
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;
}