Make erase_file() to locking too.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@22789 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2008-03-25 20:56:02 +00:00
parent f4557ede8b
commit 56663c51c4

View File

@@ -203,7 +203,7 @@ scrub_file (int fd)
*/
static krb5_error_code
erase_file(const char *filename)
erase_file(krb5_context context, const char *filename)
{
int fd;
struct stat sb1, sb2;
@@ -220,12 +220,19 @@ erase_file(const char *filename)
else
return errno;
}
ret = _krb5_xlock(context, fd, 1, filename);
if (ret) {
close(fd);
return ret;
}
if (unlink(filename) < 0) {
_krb5_xunlock(context, fd);
close (fd);
return errno;
}
ret = fstat (fd, &sb2);
if (ret < 0) {
_krb5_xunlock(context, fd);
close (fd);
return errno;
}
@@ -233,6 +240,7 @@ erase_file(const char *filename)
/* check if someone was playing with symlinks */
if (sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
_krb5_xunlock(context, fd);
close (fd);
return EPERM;
}
@@ -240,11 +248,18 @@ erase_file(const char *filename)
/* there are still hard links to this file */
if (sb2.st_nlink != 0) {
_krb5_xunlock(context, fd);
close (fd);
return 0;
}
ret = scrub_file (fd);
if (ret) {
_krb5_xunlock(context, fd);
close(fd);
return ret;
}
ret = _krb5_xunlock(context, fd);
close (fd);
return ret;
}
@@ -401,7 +416,7 @@ static krb5_error_code
fcc_destroy(krb5_context context,
krb5_ccache id)
{
erase_file(FILENAME(id));
erase_file(context, FILENAME(id));
return 0;
}
@@ -814,8 +829,6 @@ fcc_move(krb5_context context, krb5_ccache from, krb5_ccache to)
"credential cache to the other");
goto out2;
}
erase_file(FILENAME(from));
out2:
fcc_unlock(context, fd2);
close(fd2);
@@ -824,8 +837,10 @@ fcc_move(krb5_context context, krb5_ccache from, krb5_ccache to)
fcc_unlock(context, fd1);
close(fd1);
erase_file(context, FILENAME(from));
if (ret) {
erase_file(FILENAME(to));
erase_file(context, FILENAME(to));
return ret;
}
}