access_table()... - got it

Matt Chapman matty at
Tue Jan 18 09:28:08 GMT 2000

[well, except for DENY_FCB which I maintain does not exist]

static BOOL is_compatible(int old_deny, int old_mode, int new_deny,
                        int new_mode, BOOL same_process, BOOL is_exe)
        switch (old_deny) {
                case DENY_ALL:
                        return 0;
                case DENY_NONE:
                        return 1;
                case DENY_READ:
                        return (new_mode == DOS_OPEN_WRONLY);
                case DENY_WRITE:
                        return (new_mode == DOS_OPEN_RDONLY);
                case DENY_DOS:
                        return is_exe || ((old_mode == DOS_OPEN_RDONLY)
                                        && (new_mode == DOS_OPEN_RDONLY))
                                || (same_process && (old_deny == DENY_DOS)
                                        && (new_deny == DENY_DOS));

static BOOL is_allowed(int new_deny, int new_mode, int old_deny,
                        int old_mode, BOOL same_process, BOOL is_exe)
        if ((old_deny == DENY_DOS) && (old_mode == DOS_OPEN_RDONLY)
                && (new_mode != DOS_OPEN_RDONLY) && same_process && !is_exe)
                return 0;

        return is_compatible(old_deny, old_mode, new_deny, new_mode,
                                                same_process, is_exe)
                && is_compatible(new_deny, new_mode, old_deny, old_mode,
                                                same_process, is_exe);

The special case in is_allowed is interesting...

Full test source (which generates smbtorture-like tables) is at


Matthew "Austin" Chapman
SysAdmin, Developer, Samba Team Member

More information about the samba-technical mailing list