X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Facls.c;h=6f2abdf30f43b4c22f7d26a0c7ed7f38d54df9cf;hb=b9a9ac3498b7ae48c11b2bec6be1aff810cd37d2;hp=e37c6262bf4264e9766eaa1550efa2073f67f805;hpb=f929f4e41ead6abd4cf05d4aeca5ce1f5942e569;p=netatalk.git diff --git a/etc/afpd/acls.c b/etc/afpd/acls.c index e37c6262..6f2abdf3 100644 --- a/etc/afpd/acls.c +++ b/etc/afpd/acls.c @@ -629,6 +629,7 @@ EC_CLEANUP: EC_EXIT; } +#if 0 /*! * Add entries of one acl to another acl * @@ -651,6 +652,7 @@ static int acl_add_acl(acl_t *aclp, const acl_t acl) EC_CLEANUP: EC_EXIT; } +#endif /*! * Map Darwin ACE rights to POSIX 1e perm @@ -991,7 +993,7 @@ static int get_and_map_acl(char *name, char *rbuf, size_t *rbuflen) EC_INIT; int mapped_aces = 0; int dirflag; - uint32_t *darwin_ace_count = (uint32_t *)rbuf; + char *darwin_ace_count = rbuf; #ifdef HAVE_SOLARIS_ACLS int ace_count = 0; ace_t *aces = NULL; @@ -1040,8 +1042,9 @@ static int get_and_map_acl(char *name, char *rbuf, size_t *rbuflen) LOG(log_debug, logtype_afpd, "get_and_map_acl: mapped %d ACEs", mapped_aces); - *darwin_ace_count = htonl(mapped_aces); *rbuflen += sizeof(darwin_acl_header_t) + (mapped_aces * sizeof(darwin_ace_t)); + mapped_aces = htonl(mapped_aces); + memcpy(darwin_ace_count, &mapped_aces, sizeof(uint32_t)); EC_STATUS(0); @@ -1154,17 +1157,21 @@ static int set_acl(const struct vol *vol, } LOG(log_debug7, logtype_afpd, "set_acl: copied %d trivial ACEs", trivial_ace_count); - /* Ressourcefork first. - Note: for dirs we set the same ACL on the .AppleDouble/.Parent _file_. This - might be strange for ACE_DELETE_CHILD and for inheritance flags. */ + /* Ressourcefork first */ if ((ret = (vol->vfs->vfs_acl(vol, name, ACE_SETACL, new_aces_count, new_aces))) != 0) { - LOG(log_error, logtype_afpd, "set_acl: error setting acl: %s", strerror(errno)); - if (errno == (EACCES | EPERM)) + LOG(log_debug, logtype_afpd, "set_acl: error setting acl: %s", strerror(errno)); + switch (errno) { + case EACCES: + case EPERM: EC_STATUS(AFPERR_ACCESS); - else if (errno == ENOENT) - EC_STATUS(AFPERR_NOITEM); - else + break; + case ENOENT: + EC_STATUS(AFP_OK); + break; + default: EC_STATUS(AFPERR_MISC); + break; + } goto EC_CLEANUP; } if ((ret = (acl(name, ACE_SETACL, new_aces_count, new_aces))) != 0) { @@ -1260,7 +1267,6 @@ static int set_acl(const struct vol *vol, acl_entry_t entry; acl_tag_t tag; int entry_id = ACL_FIRST_ENTRY; - int has_def_acl = 0; /* flags to indicate if the object has a minimal default acl and/or an extended * default acl. */ @@ -1354,7 +1360,6 @@ static int check_acl_access(const AFPObj *obj, int ret; uint32_t allowed_rights = 0; char *username = NULL; - uuidtype_t uuidtype; struct stat st; bstring parent = NULL; int is_dir; @@ -1362,6 +1367,8 @@ static int check_acl_access(const AFPObj *obj, LOG(log_maxdebug, logtype_afpd, "check_acl_access(dir: \"%s\", path: \"%s\", curdir: \"%s\", 0x%08x)", cfrombstr(dir->d_fullpath), path, getcwdpath(), requested_rights); + AFP_ASSERT(vol); + /* This check is not used anymore, as OS X Server seems to be ignoring too */ #if 0 /* Get uid or gid from UUID */ @@ -1379,7 +1386,7 @@ static int check_acl_access(const AFPObj *obj, } #endif - EC_ZERO_LOG_ERR(lstat(path, &st), AFPERR_PARAM); + EC_ZERO_LOG_ERR(ostat(path, &st, vol_syml_opt(vol)), AFPERR_PARAM); is_dir = !strcmp(path, "."); @@ -1576,10 +1583,10 @@ int afp_getacl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size LOG(log_debug, logtype_afpd, "afp_getacl: client requested files owner user UUID"); if (NULL == (pw = getpwuid(s_path->st.st_uid))) { LOG(log_debug, logtype_afpd, "afp_getacl: local uid: %u", s_path->st.st_uid); - localuuid_from_id(rbuf, UUID_USER, s_path->st.st_uid); + localuuid_from_id((unsigned char *)rbuf, UUID_USER, s_path->st.st_uid); } else { LOG(log_debug, logtype_afpd, "afp_getacl: got uid: %d, name: %s", s_path->st.st_uid, pw->pw_name); - if ((ret = getuuidfromname(pw->pw_name, UUID_USER, rbuf)) != 0) + if ((ret = getuuidfromname(pw->pw_name, UUID_USER, (unsigned char *)rbuf)) != 0) return AFPERR_MISC; } rbuf += UUID_BINSIZE; @@ -1591,10 +1598,10 @@ int afp_getacl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size LOG(log_debug, logtype_afpd, "afp_getacl: client requested files owner group UUID"); if (NULL == (gr = getgrgid(s_path->st.st_gid))) { LOG(log_debug, logtype_afpd, "afp_getacl: local gid: %u", s_path->st.st_gid); - localuuid_from_id(rbuf, UUID_GROUP, s_path->st.st_gid); + localuuid_from_id((unsigned char *)rbuf, UUID_GROUP, s_path->st.st_gid); } else { LOG(log_debug, logtype_afpd, "afp_getacl: got gid: %d, name: %s", s_path->st.st_gid, gr->gr_name); - if ((ret = getuuidfromname(gr->gr_name, UUID_GROUP, rbuf)) != 0) + if ((ret = getuuidfromname(gr->gr_name, UUID_GROUP, (unsigned char *)rbuf)) != 0) return AFPERR_MISC; } rbuf += UUID_BINSIZE; @@ -1726,7 +1733,6 @@ int afp_setacl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size int acltoownermode(const AFPObj *obj, const struct vol *vol, char *path, struct stat *st, struct maccess *ma) { EC_INIT; - uint32_t rights = 0; if ( ! (obj->options.flags & OPTION_ACL2MACCESS) || ! (vol->v_flags & AFPVOL_ACLS)) @@ -1736,6 +1742,7 @@ int acltoownermode(const AFPObj *obj, const struct vol *vol, char *path, struct getcwdpath(), path, ma->ma_user); #ifdef HAVE_SOLARIS_ACLS + uint32_t rights = 0; EC_ZERO_LOG(solaris_acl_rights(obj, path, st, &rights)); LOG(log_maxdebug, logtype_afpd, "rights: 0x%08x", rights);