diff --git a/src/borg/platform/darwin.pyx b/src/borg/platform/darwin.pyx index 5ac4f18f..b9617a7a 100644 --- a/src/borg/platform/darwin.pyx +++ b/src/borg/platform/darwin.pyx @@ -130,7 +130,7 @@ def acl_get(path, item, st, numeric_ids=False, fd=None): raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) text = acl_to_text(acl, NULL) if text == NULL: - return + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) if numeric_ids: item['acl_extended'] = _remove_non_numeric_identifier(text) else: @@ -145,14 +145,14 @@ def acl_set(path, item, numeric_ids=False, fd=None): acl_text = item.get('acl_extended') if acl_text is not None: try: + if isinstance(path, str): + path = os.fsencode(path) if numeric_ids: acl = acl_from_text(acl_text) else: acl = acl_from_text(_remove_numeric_id_if_possible(acl_text)) if acl == NULL: - return - if isinstance(path, str): - path = os.fsencode(path) + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) if fd is not None: if acl_set_fd_np(fd, acl, ACL_TYPE_EXTENDED) == -1: raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) diff --git a/src/borg/platform/freebsd.pyx b/src/borg/platform/freebsd.pyx index 4caf8f7a..26dd2262 100644 --- a/src/borg/platform/freebsd.pyx +++ b/src/borg/platform/freebsd.pyx @@ -122,23 +122,21 @@ def setxattr(path, name, value, *, follow_symlinks=False): cdef _get_acl(p, type, item, attribute, flags, fd=None): - cdef acl_t acl = NULL - cdef char *text = NULL - try: - if fd is not None: - acl = acl_get_fd_np(fd, type) - else: - acl = acl_get_link_np(p, type) - if acl is not NULL: - text = acl_to_text_np(acl, NULL, flags) - if text is not NULL: - item[attribute] = text - finally: - acl_free(text) - acl_free(acl) + cdef acl_t acl + cdef char *text + if fd is not None: + acl = acl_get_fd_np(fd, type) else: + acl = acl_get_link_np(p, type) + if acl == NULL: raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(p)) - + text = acl_to_text_np(acl, NULL, flags) + if text == NULL: + acl_free(acl) + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(p)) + item[attribute] = text + acl_free(text) + acl_free(acl) def acl_get(path, item, st, numeric_ids=False, fd=None): """Saves ACL Entries @@ -168,16 +166,17 @@ cdef _set_acl(path, type, item, attribute, numeric_ids=False, fd=None): elif numeric_ids and type in (ACL_TYPE_ACCESS, ACL_TYPE_DEFAULT): text = posix_acl_use_stored_uid_gid(text) acl = acl_from_text(text) - if acl: - try: - if fd is not None: - if acl_set_fd_np(fd, acl, type) == -1: - raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) - else: - if acl_set_link_np(path, type, acl) == -1: - raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) - finally: - acl_free(acl) + if acl == NULL: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + try: + if fd is not None: + if acl_set_fd_np(fd, acl, type) == -1: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + else: + if acl_set_link_np(path, type, acl) == -1: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + finally: + acl_free(acl) cdef _nfs4_use_stored_uid_gid(acl): diff --git a/src/borg/platform/linux.pyx b/src/borg/platform/linux.pyx index bae1278a..943f020f 100644 --- a/src/borg/platform/linux.pyx +++ b/src/borg/platform/linux.pyx @@ -261,12 +261,14 @@ def acl_get(path, item, st, numeric_ids=False, fd=None): raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) if access_acl: access_text = acl_to_text(access_acl, NULL) - if access_text: - item['acl_access'] = converter(access_text) + if access_text == NULL: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + item['acl_access'] = converter(access_text) if default_acl: default_text = acl_to_text(default_acl, NULL) - if default_text: - item['acl_default'] = converter(default_text) + if default_text == NULL: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + item['acl_default'] = converter(default_text) finally: acl_free(access_text) acl_free(access_acl) @@ -291,24 +293,26 @@ def acl_set(path, item, numeric_ids=False, fd=None): access_text = item.get('acl_access') if access_text is not None: try: - access_acl = acl_from_text( converter(access_text)) - if access_acl is not NULL: - if fd is not None: - if acl_set_fd(fd, access_acl) == -1: - raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) - else: - if acl_set_file(path, ACL_TYPE_ACCESS, access_acl) == -1: - raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + access_acl = acl_from_text(converter(access_text)) + if access_acl == NULL: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + if fd is not None: + if acl_set_fd(fd, access_acl) == -1: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + else: + if acl_set_file(path, ACL_TYPE_ACCESS, access_acl) == -1: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) finally: acl_free(access_acl) default_text = item.get('acl_default') if default_text is not None: try: - default_acl = acl_from_text( converter(default_text)) - if default_acl is not NULL: - # only directories can get a default ACL. there is no fd-based api to set it. - if acl_set_file(path, ACL_TYPE_DEFAULT, default_acl) == -1: - raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + default_acl = acl_from_text(converter(default_text)) + if default_acl == NULL: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) + # only directories can get a default ACL. there is no fd-based api to set it. + if acl_set_file(path, ACL_TYPE_DEFAULT, default_acl) == -1: + raise OSError(errno.errno, os.strerror(errno.errno), os.fsdecode(path)) finally: acl_free(default_acl)