diff options
author | Jeremy Allison <jra@samba.org> | 2001-04-13 21:12:01 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-04-13 21:12:01 +0000 |
commit | c018e5ed4d3a757efdad46e9f64ba5e482834a80 (patch) | |
tree | c8da4e4cc01d50552fc05604c9c9d35cd859bb42 /source | |
parent | 4282d7982b048ed2dc06a24133691133e61cca31 (diff) | |
download | samba-c018e5ed4d3a757efdad46e9f64ba5e482834a80.tar.gz samba-c018e5ed4d3a757efdad46e9f64ba5e482834a80.tar.xz samba-c018e5ed4d3a757efdad46e9f64ba5e482834a80.zip |
Michael Davidson <md@sco.COM> pointed out that acl_get_qualifier can potentially
return a malloced area so added sys_acl_free_qualifier() calls to all supported
ACL interfaces to code with this (only Linux needs actual free call).
Jeremy.
Diffstat (limited to 'source')
-rw-r--r-- | source/include/proto.h | 5 | ||||
-rw-r--r-- | source/lib/sysacls.c | 28 | ||||
-rw-r--r-- | source/smbd/posix_acls.c | 2 |
3 files changed, 35 insertions, 0 deletions
diff --git a/source/include/proto.h b/source/include/proto.h index 3fb430af16b..23a72018e32 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -230,6 +230,7 @@ int sys_acl_set_file( char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl); int sys_acl_set_fd( int fd, SMB_ACL_T theacl); int sys_acl_free_text(char *text); int sys_acl_free_acl(SMB_ACL_T the_acl) ; +int sys_acl_free_qualifier(void *qual) ; int sys_acl_get_entry(SMB_ACL_T acl_d, int entry_id, SMB_ACL_ENTRY_T *entry_p); int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *type_p); int sys_acl_get_permset(SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p); @@ -250,6 +251,7 @@ int sys_acl_set_file(char *name, SMB_ACL_TYPE_T type, SMB_ACL_T acl_d); int sys_acl_set_fd(int fd, SMB_ACL_T acl_d); int sys_acl_free_text(char *text); int sys_acl_free_acl(SMB_ACL_T acl_d) ; +int sys_acl_free_qualifier(void *qual) ; int sys_acl_get_entry(SMB_ACL_T acl_d, int entry_id, SMB_ACL_ENTRY_T *entry_p); int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *type_p); int sys_acl_get_permset(SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p); @@ -270,6 +272,7 @@ int sys_acl_set_file(char *name, SMB_ACL_TYPE_T type, SMB_ACL_T acl_d); int sys_acl_set_fd(int fd, SMB_ACL_T acl_d); int sys_acl_free_text(char *text); int sys_acl_free_acl(SMB_ACL_T acl_d) ; +int sys_acl_free_qualifier(void *qual) ; int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p); SMB_ACL_T sys_acl_get_file( const char *path_p, SMB_ACL_TYPE_T type); SMB_ACL_T sys_acl_get_fd(int fd); @@ -290,6 +293,7 @@ int sys_acl_set_qualifier( SMB_ACL_ENTRY_T entry_d, void *qual_p); int sys_acl_set_permset( SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T permset_d); int sys_acl_free_text(char *text); int sys_acl_free_acl(SMB_ACL_T the_acl) ; +int sys_acl_free_qualifier(void *qual) ; int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p); int sys_acl_get_tag_type( SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p); int sys_acl_get_permset( SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p); @@ -310,6 +314,7 @@ int sys_acl_valid( SMB_ACL_T theacl ); int sys_acl_set_file( char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl); int sys_acl_set_fd( int fd, SMB_ACL_T theacl); int sys_acl_free_acl(SMB_ACL_T the_acl) ; +int sys_acl_free_qualifier(void *qual) ; /*The following definitions come from lib/system.c */ diff --git a/source/lib/sysacls.c b/source/lib/sysacls.c index 29630495725..02018a52b37 100644 --- a/source/lib/sysacls.c +++ b/source/lib/sysacls.c @@ -63,6 +63,7 @@ extern int DEBUGLEVEL; int sys_acl_free_text(char *text) - free acl_to_text int sys_acl_free_acl(SMB_ACL_T posix_acl) + int sys_acl_free_qualifier(SMB_ACL_T posix_acl) */ @@ -170,6 +171,11 @@ int sys_acl_free_acl(SMB_ACL_T the_acl) return acl_free(the_acl); } +int sys_acl_free_qualifier(void *qual) +{ + return acl_free(qual); +} + #elif defined(HAVE_UNIXWARE_ACLS) || defined(HAVE_SOLARIS_ACLS) /* @@ -762,6 +768,11 @@ int sys_acl_free_acl(SMB_ACL_T acl_d) return 0; } +int sys_acl_free_qualifier(void *qual) +{ + return 0; +} + #elif defined(HAVE_IRIX_ACLS) int sys_acl_get_entry(SMB_ACL_T acl_d, int entry_id, SMB_ACL_ENTRY_T *entry_p) @@ -1007,6 +1018,11 @@ int sys_acl_free_acl(SMB_ACL_T acl_d) return 0; } +int sys_acl_free_qualifier(void *qual) +{ + return 0; +} + #elif defined(HAVE_XFS_ACLS) /* For Linux SGI/XFS Filesystems * contributed by J Trostel, Connex @@ -1221,6 +1237,11 @@ int sys_acl_free_acl(SMB_ACL_T the_acl) return acl_free(the_acl); } +int sys_acl_free_qualifier(void *qual) +{ + return 0; +} + #else /* No ACLs. */ int sys_acl_get_entry( SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p) @@ -1342,4 +1363,11 @@ int sys_acl_free_acl(SMB_ACL_T the_acl) errno = ENOSYS; return -1; } + +int sys_acl_free_qualifier(void *qual) +{ + errno = ENOSYS; + return -1; +} + #endif /* No ACLs. */ diff --git a/source/smbd/posix_acls.c b/source/smbd/posix_acls.c index ae8493220ff..a9c88212387 100644 --- a/source/smbd/posix_acls.c +++ b/source/smbd/posix_acls.c @@ -1319,6 +1319,7 @@ static canon_ace *canonicalise_acl( files_struct *fsp, SMB_ACL_T posix_acl, SMB_ uid_to_sid( &sid, *puid); unix_ug.uid = *puid; owner_type = UID_ACE; + sys_acl_free_qualifier((void *)puid); break; } case SMB_ACL_GROUP_OBJ: @@ -1337,6 +1338,7 @@ static canon_ace *canonicalise_acl( files_struct *fsp, SMB_ACL_T posix_acl, SMB_ gid_to_sid( &sid, *pgid); unix_ug.gid = *pgid; owner_type = GID_ACE; + sys_acl_free_qualifier((void *)pgid); break; } case SMB_ACL_MASK: |