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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user