[systemd-devel] [PATCH v2, ping?] tmpfiles, man: Add xattr support to tmpfiles

Maciej Wereski m.wereski at partner.samsung.com
Thu Jul 18 08:09:14 PDT 2013


Hello,

16.07.2013 at 00:31 Lennart Poettering <lennart at poettering.net> wrote:

>> +        STRV_FOREACH(x, i->xattrs) {
>> +                value = *x;
>> +                name = strsep(&value, "=");
>
> I'd really prefer if we didn't corrupt the string here. Maybe use
> strv_split_quoted() here? That handles all the values for you anyway...

You mean strv_split() (I'm splitting by "=")? This has one issue: it
splits by all separator occurrences and I need to split after first one.
If corrupting string is the issue, I can make a copy of it. If you prefer
strv_split(), then I can just join if strv_length > 2.

>> +        for (n = 0; n < strv_length(tmp); ++n) {
>> +                len = strlen(tmp[n]);
>> +                strncpy(xattr, tmp[n], len+1);
>> +                p = strchr(xattr, '=');
>> +                if (!p) {
>> +                        log_error("%s: Attribute has incorrect  
>> format.", i->path);
>> +                        return -EBADMSG;
>> +                }
>> +                if (p[1] == '\"') {
>> +                        while (true) {
>> +                                if (!p)
>> +                                        p = tmp[n];
>> +                                else
>> +                                        p += 2;
>> +                                p = strchr(p, '\"');
>> +                                if (p && xattr[p-xattr-1] != '\\')
>> +                                        break;
>> +                                p = NULL;
>> +                                ++n;
>> +                                if (n == strv_length(tmp))
>> +                                        break;
>> +                                len += strlen(tmp[n]) + 1;
>> +                                strncat(xattr, " ", 1);
>> +                                strncat(xattr, tmp[n], len);
>> +                        }
>> +                }
>> +                strstrip(xattr);
>> +                f = i->xattrs;
>> +                i->xattrs = strv_append(i->xattrs, xattr);
>> +                if (!i->xattrs){
>> +                        strv_free(f);
>> +                        return log_oom();
>> +                }
>
> For this stuf I'd really prefer using one of our already existing
> quoting APIs, like strv_spit_quoted() or FOREACH_WORD_QUOTED or so.

Well, I've tried it in the beginning, but in doesn't work properly in this
case. split_quoted() expects quote on the beginning of a string (ignoring
whitespace occurrences). If there's no such case string will be split using
whitespace. Example of extended attribute with quotes:

user.test="This will \" fail"

So how would you like this case to be solved?

regards,
Maciej

-- 
Maciej Wereski
Samsung R&D Institute Poland
Samsung Electronics
m.wereski at partner.samsung.com


More information about the systemd-devel mailing list