summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-02-09 10:44:03 +0000
committerLars Wirzenius <liw@liw.fi>2013-02-09 10:44:03 +0000
commit2f35fb1fd3888bf84f586b093b450b26af86c8df (patch)
treeb08345f2c183f142fe8e91ff548afdd4706b29da
parentf1bf6c79cfba0117a0f4cf94b851200b079447a9 (diff)
downloadsummain-2f35fb1fd3888bf84f586b093b450b26af86c8df.tar.gz
Encode binary xattr values
-rw-r--r--summainlib.py10
-rwxr-xr-xtests/xattrs.script4
2 files changed, 11 insertions, 3 deletions
diff --git a/summainlib.py b/summainlib.py
index 07895e1..e148760 100644
--- a/summainlib.py
+++ b/summainlib.py
@@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import base64
import grp
import hashlib
import hmac
@@ -220,7 +221,14 @@ class FilesystemObject(object):
def _compute_xattrs(self): # pragma: no cover
if len(self._xattrs) == 0:
return ''
- parts = [' %s=%s' % (k, self._xattrs[k]) for k in self._xattrs]
+
+ def quote(s):
+ if s.isalnum():
+ return '"%s"' % s
+ else:
+ return '0s' + base64.urlsafe_b64encode(s)
+
+ parts = [' %s=%s' % (k, quote(self._xattrs[k])) for k in self._xattrs]
return '\n' + '\n'.join(parts)
def format_time(self, secs, nsecs):
diff --git a/tests/xattrs.script b/tests/xattrs.script
index 1d64954..c9959da 100755
--- a/tests/xattrs.script
+++ b/tests/xattrs.script
@@ -1,11 +1,11 @@
#!/bin/sh
-set -e
+set -eux
umask 0002
mkdir -m 0775 "$DATADIR/xattrs"
touch "$DATADIR/xattrs/file"
-if setfattr -n user.foo -v bar "$DATADIR/xattrs/file" 2> /dev/null &&
+if setfattr -n user.foo -v "$(printf '\177')" "$DATADIR/xattrs/file" 2> /dev/null &&
setfattr -n user.empty -v '""' "$DATADIR/xattrs/file" 2> /dev/null
then
./summain --exclude=mtime --exclude=uid --exclude=username \