diff options
author | madmurphy <madmurphy333@gmail.com> | 2022-07-26 07:58:32 +0000 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2022-07-26 07:58:32 +0000 |
commit | b295c537696fcad7191b8e009473aa0c922288b6 (patch) | |
tree | 4174624e7a0082f2bca7286796628627ef8fd67b /gio/glocalfileinfo.c | |
parent | f839eae274129278154a0d017e38f443e2018869 (diff) | |
download | glib-b295c537696fcad7191b8e009473aa0c922288b6.tar.gz |
gfileinfo: Implement xattr attribute removal
Fixes: #1187
Diffstat (limited to 'gio/glocalfileinfo.c')
-rw-r--r-- | gio/glocalfileinfo.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index edec7bdde..6f186957a 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -261,10 +261,12 @@ get_selinux_context (const char *path, #define g_fgetxattr(fd,name,value,size) fgetxattr(fd,name,value,size,0,0) #define g_flistxattr(fd,name,size) flistxattr(fd,name,size,0) #define g_setxattr(path,name,value,size) setxattr(path,name,value,size,0,0) +#define g_removexattr(path,name) removexattr(path,name,0) #else #define g_fgetxattr fgetxattr #define g_flistxattr flistxattr #define g_setxattr(path,name,value,size) setxattr(path,name,value,size,0) +#define g_removexattr(path,name) removexattr(path,name) #endif static gssize @@ -774,10 +776,10 @@ set_xattr (char *filename, return FALSE; } - if (attr_value->type != G_FILE_ATTRIBUTE_TYPE_STRING) + if (attr_value->type != G_FILE_ATTRIBUTE_TYPE_STRING && attr_value->type != G_FILE_ATTRIBUTE_TYPE_INVALID) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, - _("Invalid attribute type (string expected)")); + _("Invalid attribute type (string or invalid expected)")); return FALSE; } @@ -799,16 +801,27 @@ set_xattr (char *filename, escaped_attribute += strlen ("xattr-sys::"); is_user = FALSE; } - + attribute = hex_unescape_string (escaped_attribute, NULL, &free_attribute); - value = hex_unescape_string (attr_value->u.string, &val_len, &free_value); if (is_user) a = g_strconcat ("user.", attribute, NULL); else a = attribute; - - res = g_setxattr (filename, a, value, val_len); + + if (attr_value->type == G_FILE_ATTRIBUTE_TYPE_STRING) + { + value = hex_unescape_string (attr_value->u.string, &val_len, &free_value); + res = g_setxattr (filename, a, value, val_len); + } + else + { + value = NULL; + val_len = 0; + free_value = FALSE; + res = g_removexattr (filename, a); + } + errsv = errno; if (is_user) |