mirror of
https://github.com/samba-team/samba.git
synced 2025-03-11 16:58:40 +03:00
smbd: Avoid passing a share mode entry to share_conflict()
Make the real data dependencies clearer, we don't need a full share_entry, only its access and sharemode masks Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
parent
e69c4faeb7
commit
dc7dfb1257
@ -1502,7 +1502,8 @@ static bool mask_conflict(
|
|||||||
Returns True if conflict, False if not.
|
Returns True if conflict, False if not.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static bool share_conflict(struct share_mode_entry *e,
|
static bool share_conflict(uint32_t e_access_mask,
|
||||||
|
uint32_t e_share_access,
|
||||||
uint32_t access_mask,
|
uint32_t access_mask,
|
||||||
uint32_t share_access)
|
uint32_t share_access)
|
||||||
{
|
{
|
||||||
@ -1514,25 +1515,19 @@ static bool share_conflict(struct share_mode_entry *e,
|
|||||||
DELETE_ACCESS;
|
DELETE_ACCESS;
|
||||||
bool conflict;
|
bool conflict;
|
||||||
|
|
||||||
DBG_DEBUG("e->access_mask = 0x%"PRIx32", "
|
DBG_DEBUG("existing access_mask = 0x%"PRIx32", "
|
||||||
"e->share_access = 0x%"PRIx32", "
|
"existing share access = 0x%"PRIx32", "
|
||||||
"e->private_options = 0x%"PRIx32", "
|
|
||||||
"access_mask = 0x%"PRIx32", "
|
"access_mask = 0x%"PRIx32", "
|
||||||
"share_access = 0x%"PRIx32"\n",
|
"share_access = 0x%"PRIx32"\n",
|
||||||
e->access_mask,
|
e_access_mask,
|
||||||
e->share_access,
|
e_share_access,
|
||||||
e->private_options,
|
|
||||||
access_mask,
|
access_mask,
|
||||||
share_access);
|
share_access);
|
||||||
|
|
||||||
if (server_id_is_disconnected(&e->pid)) {
|
if ((e_access_mask & conflicting_access) == 0) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((e->access_mask & conflicting_access) == 0) {
|
|
||||||
DBG_DEBUG("No conflict due to "
|
DBG_DEBUG("No conflict due to "
|
||||||
"e->access_mask = 0x%"PRIx32"\n",
|
"existing access_mask = 0x%"PRIx32"\n",
|
||||||
e->access_mask);
|
e_access_mask);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((access_mask & conflicting_access) == 0) {
|
if ((access_mask & conflicting_access) == 0) {
|
||||||
@ -1542,14 +1537,14 @@ static bool share_conflict(struct share_mode_entry *e,
|
|||||||
}
|
}
|
||||||
|
|
||||||
conflict = mask_conflict(
|
conflict = mask_conflict(
|
||||||
access_mask, e->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
|
access_mask, e_access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
|
||||||
share_access, e->share_access, FILE_SHARE_WRITE);
|
share_access, e_share_access, FILE_SHARE_WRITE);
|
||||||
conflict |= mask_conflict(
|
conflict |= mask_conflict(
|
||||||
access_mask, e->access_mask, FILE_READ_DATA | FILE_EXECUTE,
|
access_mask, e_access_mask, FILE_READ_DATA | FILE_EXECUTE,
|
||||||
share_access, e->share_access, FILE_SHARE_READ);
|
share_access, e_share_access, FILE_SHARE_READ);
|
||||||
conflict |= mask_conflict(
|
conflict |= mask_conflict(
|
||||||
access_mask, e->access_mask, DELETE_ACCESS,
|
access_mask, e_access_mask, DELETE_ACCESS,
|
||||||
share_access, e->share_access, FILE_SHARE_DELETE);
|
share_access, e_share_access, FILE_SHARE_DELETE);
|
||||||
|
|
||||||
DBG_DEBUG("conflict=%s\n", conflict ? "true" : "false");
|
DBG_DEBUG("conflict=%s\n", conflict ? "true" : "false");
|
||||||
return conflict;
|
return conflict;
|
||||||
@ -1673,15 +1668,24 @@ static NTSTATUS open_mode_check(connection_struct *conn,
|
|||||||
|
|
||||||
for(i = 0; i < d->num_share_modes; i++) {
|
for(i = 0; i < d->num_share_modes; i++) {
|
||||||
struct share_mode_entry *e = &d->share_modes[i];
|
struct share_mode_entry *e = &d->share_modes[i];
|
||||||
|
bool conflict;
|
||||||
|
|
||||||
if (!is_valid_share_mode_entry(e)) {
|
if (!is_valid_share_mode_entry(e)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (server_id_is_disconnected(&e->pid)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* someone else has a share lock on it, check to see if we can
|
/* someone else has a share lock on it, check to see if we can
|
||||||
* too */
|
|
||||||
if (share_conflict(e, access_mask, share_access)) {
|
|
||||||
|
|
||||||
|
* too */
|
||||||
|
conflict = share_conflict(
|
||||||
|
e->access_mask,
|
||||||
|
e->share_access,
|
||||||
|
access_mask,
|
||||||
|
share_access);
|
||||||
|
if (conflict) {
|
||||||
if (share_mode_stale_pid(d, i)) {
|
if (share_mode_stale_pid(d, i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user