1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +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:
Volker Lendecke 2019-09-06 11:15:27 +02:00 committed by Jeremy Allison
parent e69c4faeb7
commit dc7dfb1257

View File

@ -1502,7 +1502,8 @@ static bool mask_conflict(
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 share_access)
{
@ -1514,25 +1515,19 @@ static bool share_conflict(struct share_mode_entry *e,
DELETE_ACCESS;
bool conflict;
DBG_DEBUG("e->access_mask = 0x%"PRIx32", "
"e->share_access = 0x%"PRIx32", "
"e->private_options = 0x%"PRIx32", "
DBG_DEBUG("existing access_mask = 0x%"PRIx32", "
"existing share access = 0x%"PRIx32", "
"access_mask = 0x%"PRIx32", "
"share_access = 0x%"PRIx32"\n",
e->access_mask,
e->share_access,
e->private_options,
e_access_mask,
e_share_access,
access_mask,
share_access);
if (server_id_is_disconnected(&e->pid)) {
return false;
}
if ((e->access_mask & conflicting_access) == 0) {
if ((e_access_mask & conflicting_access) == 0) {
DBG_DEBUG("No conflict due to "
"e->access_mask = 0x%"PRIx32"\n",
e->access_mask);
"existing access_mask = 0x%"PRIx32"\n",
e_access_mask);
return false;
}
if ((access_mask & conflicting_access) == 0) {
@ -1542,14 +1537,14 @@ static bool share_conflict(struct share_mode_entry *e,
}
conflict = mask_conflict(
access_mask, e->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
share_access, e->share_access, FILE_SHARE_WRITE);
access_mask, e_access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
share_access, e_share_access, FILE_SHARE_WRITE);
conflict |= mask_conflict(
access_mask, e->access_mask, FILE_READ_DATA | FILE_EXECUTE,
share_access, e->share_access, FILE_SHARE_READ);
access_mask, e_access_mask, FILE_READ_DATA | FILE_EXECUTE,
share_access, e_share_access, FILE_SHARE_READ);
conflict |= mask_conflict(
access_mask, e->access_mask, DELETE_ACCESS,
share_access, e->share_access, FILE_SHARE_DELETE);
access_mask, e_access_mask, DELETE_ACCESS,
share_access, e_share_access, FILE_SHARE_DELETE);
DBG_DEBUG("conflict=%s\n", conflict ? "true" : "false");
return conflict;
@ -1673,15 +1668,24 @@ static NTSTATUS open_mode_check(connection_struct *conn,
for(i = 0; i < d->num_share_modes; i++) {
struct share_mode_entry *e = &d->share_modes[i];
bool conflict;
if (!is_valid_share_mode_entry(e)) {
continue;
}
if (server_id_is_disconnected(&e->pid)) {
continue;
}
/* 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)) {
continue;
}