summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrzemyslaw Pawelczyk <przemoc@gmail.com>2016-01-12 01:04:13 +0100
committerPrzemyslaw Pawelczyk <przemoc@gmail.com>2016-01-12 01:04:13 +0100
commit98e73203bf9df504cd45baab0bee63c6fe7a14df (patch)
tree95adb27f7569174e46c9cbd8e992922d067cc01b
parentd534dd28eb3f02120087b127bb7738233a752a31 (diff)
metaentry.c: Fix meta entry handling in case of xattr errors.
getxattr() call can fail in mentry_create(), so NULL-initialize mentry->xattr_values[i] and update mentry->xattrs upon error, so there is no attempt in mentry_free() to free unitialized xattr_names[i] and xattr_values[i] pointers. Fixes #38.
-rw-r--r--NEWS3
-rw-r--r--src/metaentry.c4
2 files changed, 7 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 7cf7a77..96d7b49 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@ Latest stuff (planned release date: 2015-09-??)
* BUGFIX: Applying metadata with extended attribute having null byte
in value zeroed all following bytes of this xattr value.
+ * BUGFIX: Reading extended attributes while not having permissions
+ resulted in crash.
+
* Empty directories not present in metadata can be now removed when
applying stored metadata if -E / --remove-empty-dirs option is used.
diff --git a/src/metaentry.c b/src/metaentry.c
index fdb7f71..25bb00f 100644
--- a/src/metaentry.c
+++ b/src/metaentry.c
@@ -266,11 +266,14 @@ mentry_create(const char *path)
continue;
mentry->xattr_names[i] = xstrdup(attr);
+ mentry->xattr_values[i] = NULL;
+
vsize = getxattr(path, attr, NULL, 0);
if (vsize < 0) {
msg(MSG_ERROR, "getxattr failed for %s: %s\n",
path, strerror(errno));
free(list);
+ mentry->xattrs = i + 1;
mentry_free(mentry);
return NULL;
}
@@ -283,6 +286,7 @@ mentry_create(const char *path)
msg(MSG_ERROR, "getxattr failed for %s: %s\n",
path, strerror(errno));
free(list);
+ mentry->xattrs = i + 1;
mentry_free(mentry);
return NULL;
}