diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2012-06-22 09:44:41 +0930 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2012-06-22 07:35:17 +0200 |
commit | 01ec4a72de56ade54bbbc92e0a408771390c5c12 (patch) | |
tree | 1ee7082cac28cee704ebc0eb6e76d372baa31405 /lib/ntdb/ntdb.c | |
parent | bd5c061932d9aaf2e66cd56a39743c9ff34c3a88 (diff) | |
download | samba-01ec4a72de56ade54bbbc92e0a408771390c5c12.tar.gz samba-01ec4a72de56ade54bbbc92e0a408771390c5c12.tar.bz2 samba-01ec4a72de56ade54bbbc92e0a408771390c5c12.zip |
ntdb: make database read-only during ntdb_parse() callback.
Since we have a readlock, any write will grab a write lock: if it happens
to be on the same bucket, we'll fail.
For that reason, enforce read-only so every write operation fails
(even for NTDB_NOLOCK or NTDB_INTERNAL dbs), and document it!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'lib/ntdb/ntdb.c')
-rw-r--r-- | lib/ntdb/ntdb.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/ntdb/ntdb.c b/lib/ntdb/ntdb.c index 6c75915899..5d56b33b5a 100644 --- a/lib/ntdb/ntdb.c +++ b/lib/ntdb/ntdb.c @@ -500,10 +500,23 @@ _PUBLIC_ enum NTDB_ERROR ntdb_parse_record_(struct ntdb_context *ntdb, if (!off) { ecode = NTDB_ERR_NOEXIST; } else { + unsigned int old_flags; NTDB_DATA d = ntdb_mkdata(keyp + key.dsize, rec_data_length(&rec)); + /* + * Make sure they don't try to write db, since they + * have read lock! They can if they've done + * ntdb_lockall(): if it was ntdb_lockall_read, that'll + * stop them doing a write operation anyway. + */ + old_flags = ntdb->flags; + if (!ntdb->file->allrecord_lock.count && + !(ntdb->flags & NTDB_NOLOCK)) { + ntdb->flags |= NTDB_RDONLY; + } ecode = parse(key, d, data); + ntdb->flags = old_flags; ntdb_access_release(ntdb, keyp); } |