summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-02-09 10:45:15 +0000
committerLars Wirzenius <liw@liw.fi>2013-02-09 10:45:15 +0000
commit4e10984c2d0a1f3d041941c7daecf93edd17cecd (patch)
treee9399ed1e828ada7b875fcfc9d10923dfd46ee4a
parentf1bf6c79cfba0117a0f4cf94b851200b079447a9 (diff)
parent7a87822120ff9d17a50f6b0e4f7bc3729f1473be (diff)
downloadsummain-4e10984c2d0a1f3d041941c7daecf93edd17cecd.tar.gz
Encode binary xattr values
-rw-r--r--NEWS5
-rw-r--r--summainlib.py10
-rwxr-xr-xtests/xattrs.script4
3 files changed, 16 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 02221e9..05ba2a5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,11 @@
NEWS file for summain
=====================
+Version 0.18, released UNRELEASED
+---------------------------------
+
+* Encode binary values of extended attributes in base64.
+
Version 0.17, released 2012-10-27
---------------------------------
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 \