From 9b7ccc9727de9c1e7439e17c8fa866901d77470e Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 20 Sep 2022 09:28:06 +0200 Subject: [PATCH] Improved error messages in case of failing Linux-specific ACL or xattr functions --- libisofs/aaip-os-linux.c | 74 +++++++++++++++++++++++++++++++++++----- libisofs/libisofs.h | 4 +++ 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/libisofs/aaip-os-linux.c b/libisofs/aaip-os-linux.c index 5e2828a..70e56f0 100644 --- a/libisofs/aaip-os-linux.c +++ b/libisofs/aaip-os-linux.c @@ -7,7 +7,7 @@ To be included by aaip_0_2.c for Linux - Copyright (c) 2009 - 2018 Thomas Schmitt + Copyright (c) 2009 - 2022 Thomas Schmitt This file is part of the libisofs project; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 @@ -77,6 +77,44 @@ int aaip_local_attr_support(int flag) } +/* -------------------------- Error reporting ----------------------------- */ + + +/* Report an error with local ACL or xattr calls. + @param flag bit0-7: mode 0=NO_GET_LOCAL , 1=NO_SET_LOCAL +*/ +static +void aaip_local_error(char *function_name, char *path, int err, int flag) +{ + int mode, err_code; + + mode= (flag & 255); + if(mode == 1) + err_code= ISO_AAIP_NO_SET_LOCAL_S; + else + err_code= ISO_AAIP_NO_GET_LOCAL_S; + if(err > 0) { + if(path[0]) + iso_msg_submit(-1, err_code, 0, + "Function %s(\"%s\") failed with errno %d '%s'", + function_name, path, err, strerror(err)); + else + iso_msg_submit(-1, err_code, 0, "Function %s() failed with %d '%s'", + function_name, err, strerror(err)); + } else { + if(path[0]) + iso_msg_submit(-1, err_code, 0, + "Function %s(\"%s\") failed without error code", + function_name, path); + else + iso_msg_submit(-1, err_code, 0, + "Function %s() failed without error code", + function_name); + } +} + + + /* ------------------------------ Getters --------------------------------- */ /* Obtain the ACL of the given file in long text form. @@ -181,8 +219,10 @@ static int get_single_attr(char *path, char *name, size_t *value_length, value_ret= getxattr(path, name, NULL, 0); else value_ret= lgetxattr(path, name, NULL, 0); - if(value_ret == -1) + if(value_ret == -1) { + aaip_local_error((flag & 32) ? "getxattr" : "lgetxattr", path, errno, 0); return(0); + } *value_bytes= calloc(value_ret + 1, 1); if(*value_bytes == NULL) return(-1); @@ -191,6 +231,7 @@ static int get_single_attr(char *path, char *name, size_t *value_length, else value_ret= lgetxattr(path, name, *value_bytes, value_ret); if(value_ret == -1) { + aaip_local_error((flag & 32) ? "getxattr" : "lgetxattr", path, errno, 0); free(*value_bytes); *value_bytes= NULL; *value_length= 0; @@ -275,10 +316,13 @@ ex:; else list_size= llistxattr(path, list, 0); if(list_size == -1) { - if(errno == ENOSYS) /* Function not implemented */ + if(errno == ENOSYS) { /* Function not implemented */ list_size= 0; /* Handle as if xattr was disabled at compile time */ - else + } else { + aaip_local_error((flag & 32) ? "listxattr" : "llistxattr", path, errno, + 0); {ret= -1; goto ex;} + } } if(list_size > 0) { list= calloc(list_size, 1); @@ -288,8 +332,11 @@ ex:; list_size= listxattr(path, list, list_size); else list_size= llistxattr(path, list, list_size); - if(list_size == -1) + if(list_size == -1) { + aaip_local_error((flag & 32) ? "listxattr" : "llistxattr", path, errno, + 0); {ret= -1; goto ex;} + } } for(i= 0; i < list_size; i+= strlen(list + i) + 1) num_names++; @@ -443,11 +490,14 @@ int aaip_set_acl_text(char *path, char *text, int flag) acl= acl_from_text(text); if(acl == NULL) { + aaip_local_error("acl_from_text", "", errno, 1); ret= -1; goto ex; } ret= acl_set_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS, acl); - if(ret == -1) + if(ret == -1) { + aaip_local_error("acl_set_file", path, errno, 1); goto ex; + } ret= 1; ex: if(acl != NULL) @@ -533,8 +583,11 @@ int aaip_set_attr_list(char *path, size_t num_attrs, char **names, list_size= listxattr(path, list, list_size); else list_size= llistxattr(path, list, list_size); - if(list_size == -1) + if(list_size == -1) { + aaip_local_error((flag & 32) ? "listxattr" : "llistxattr", path, errno, + 1); {ret= -5; goto ex;} + } for(i= 0; i < (size_t) list_size; i+= strlen(list + i) + 1) { if(!(flag & 8)) if(strncmp(list + i, "user.", 5)) @@ -543,8 +596,11 @@ int aaip_set_attr_list(char *path, size_t num_attrs, char **names, ret= removexattr(path, list + i); else ret= lremovexattr(path, list + i); - if(ret == -1) + if(ret == -1) { + aaip_local_error((flag & 32) ? "removexattr" : "lremovexattr", path, + errno, 1); {ret= -5; goto ex;} + } } free(list); list= NULL; } @@ -587,6 +643,8 @@ int aaip_set_attr_list(char *path, size_t num_attrs, char **names, else ret= lsetxattr(path, names[i], values[i], value_lengths[i], 0); if(ret == -1) { + aaip_local_error((flag & 32) ? "setxattr" : "lsetxattr", path, errno, + 1); register_errno(errnos, i); end_ret= -4; continue; diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index 13af024..ea75269 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -8954,9 +8954,13 @@ int iso_conv_name_chars(IsoWriteOpts *opts, char *name, size_t name_len, /** Error with reading ACL or xattr from local file (FAILURE, HIGH, -341) */ #define ISO_AAIP_NO_GET_LOCAL 0xE830FEAB +/** Error with reading ACL or xattr from local file (SORRY, HIGH, -341) */ +#define ISO_AAIP_NO_GET_LOCAL_S 0xE030FEAB /** Error with attaching ACL or xattr to local file (FAILURE, HIGH, -342) */ #define ISO_AAIP_NO_SET_LOCAL 0xE830FEAA +/** Error with attaching ACL or xattr to local file (SORRY, HIGH, -342) */ +#define ISO_AAIP_NO_SET_LOCAL_S 0xE030FEAA /** Unallowed attempt to set an xattr with non-userspace name (FAILURE, HIGH, -343) */