summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Kohl <jtkohl@mit.edu>1991-06-14 15:21:49 +0000
committerJohn Kohl <jtkohl@mit.edu>1991-06-14 15:21:49 +0000
commit64e6971128064ee52aba26221da499facf591626 (patch)
treec045096ba32aab2fa38e2dd22f364698d8591286 /src
parent45b2aba3c10742d4540345376b29f84bfef5bdb0 (diff)
downloadkrb5-64e6971128064ee52aba26221da499facf591626.tar.gz
krb5-64e6971128064ee52aba26221da499facf591626.tar.xz
krb5-64e6971128064ee52aba26221da499facf591626.zip
with POSIX locks, we gotta have the file open for write if we want to flock
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@2180 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/lib/kdb/kdb_dbm.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/lib/kdb/kdb_dbm.c b/src/lib/kdb/kdb_dbm.c
index 8991d0a39..640b6016d 100644
--- a/src/lib/kdb/kdb_dbm.c
+++ b/src/lib/kdb/kdb_dbm.c
@@ -179,9 +179,21 @@ krb5_dbm_db_init()
char *filename = gen_dbsuffix (current_db_name, ".ok");
if (!filename)
return ENOMEM;
- if ((dblfd = open(filename, 0, 0)) < 0) {
+#ifdef POSIX_FILE_LOCKS
+ /* needs be open read/write so that write locking can work with
+ POSIX systems */
+ if ((dblfd = open(filename, O_RDWR, 0)) == -1) {
+ if (errno == EACCES) {
+ if ((dblfd = open(filename, O_RDONLY, 0)) == -1)
+ return errno;
+ } else
+ return errno;
+ }
+#else
+ if ((dblfd = open(filename, 0, 0)) == -1) {
return errno;
}
+#endif
free(filename);
inited++;
}
@@ -601,8 +613,14 @@ int mode;
fl.l_whence = 0;
fl.l_start = 0;
fl.l_len = 0;
- if (fcntl(dblfd, non_blocking ? F_SETLK : F_SETLKW, &fl) == -1)
+ if (fcntl(dblfd, non_blocking ? F_SETLK : F_SETLKW, &fl) == -1) {
+ if (errno == EBADF && mode == KRB5_DBM_EXCLUSIVE) {
+ /* tried to exclusive-lock something we don't have write access
+ to. */
+ return KRB5_KDB_CANTLOCK_DB;
+ }
return errno;
+ }
#else
switch (mode) {
case KRB5_DBM_EXCLUSIVE: