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