Package: metastore
Version: 1+20080623+debian-2
Severity: normal
Tags: upstream patch

Dear Maintainer,

Extended attributes without value make metastore print error and exit,
prematurely ending update of .metastore file, thus corrupting it in
almost all imaginable cases (as long as xattrs are used, of course).

The issue was originally reported by Todd A. Jacobs at launchpad:
https://bugs.launchpad.net/bugs/937306

Zak Wilcox prepared a fix (http://git.io/JZnLLA), which I slightly
modified and commited to my repo, as David's one is defunct atm:
https://github.com/przemoc/metastore/commit/f75ca58c96

[ BTW my repo has debian changes already merged in and one new feature:
  option allowing .git directories traversal. ]

Regards,
Przemysław Pawełczyk


-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages metastore depends on:
ii  libc6  2.13-32

metastore recommends no packages.

metastore suggests no packages.

-- no debconf information
>From f75ca58c96bba3f4d7294aec031bd9300f278e9f Mon Sep 17 00:00:00 2001
From: Zak Wilcox <[email protected]>
Date: Tue, 29 May 2012 14:09:22 +0200
Subject: [PATCH 1/2] Fix false error when writing zero-length records.

Quoting Todd A. Jacobs, https://bugs.launchpad.net/bugs/937306:

DATA LOSS WARNING: Using metastore in its current condition can lead to
loss of metadata. See below for details.

First of all, metastore provides confusing and useless feedback to the
user when storing extended attributes without defined values. To
consistently re-create this problem:

    $ touch foo
    $ setfattr -n user.bar foo
    $ metastore -s foo
    Failed to write to file: Success
    $ echo $?
    1

The error message and exit status imply the operation has failed, but it
has not--at least, not completely. You can see that metastore *appears*
to have succeeded as follows:

    $ rm foo
    $ touch foo
    $ metastore -a foo
    ./foo:	changing metadata
    ./foo:	adding xattr user.bar
    $ echo $?
    0
    $ getfattr -d foo
    # file: foo
    user.bar

So, the .metadata file seems to contains all the correct information,
but it provides this contradictory and cryptic error message to the user
on save. However, the .metadata file *is* actually broken, but you only
see it when saving multiple extended attributes where at least one of
them has no defined value.

    $ rm foo; rm .metadata
    $ touch foo
    $ setfattr -n user.bar foo
    $ setfattr -n user.baz -v quux foo
    $ getfattr -d foo
    # file: foo
    user.bar
    user.baz="quux"

    $ metastore -s foo
    Failed to write to file: Success
    $ echo $?
    1
    $ rm foo
    $ touch foo
    $ metastore -a
    Attempt to read beyond end of file, corrupt file?
    $ echo $?
    1

So, there are really two things that need fixing:

  1. The incredibly cryptic error message on save.
     What is the actual error condition it is trying to report?
  2. The proper handling of extended attributes without values.

Signed-off-by: Przemyslaw Pawelczyk <[email protected]>
---
 utils.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/utils.c b/utils.c
index d9ac4cf..a96e56e 100644
--- a/utils.c
+++ b/utils.c
@@ -109,7 +109,7 @@ binary_print(const char *s, ssize_t len)
 void
 xfwrite(const void *ptr, size_t size, FILE *stream)
 {
-	if (fwrite(ptr, size, 1, stream) != 1) {
+	if (size && fwrite(ptr, size, 1, stream) != 1) {
 		msg(MSG_CRITICAL, "Failed to write to file: %s\n",
 		    strerror(errno));
 		exit(EXIT_FAILURE);
-- 
1.7.10

Reply via email to