[systemd-devel] [systemd-commits] 3 commits - Makefile.am src/core src/fstab-generator units/initrd-cleanup.service units/initrd-fs-pre.target units/initrd-fs.target units/initrd-parse-etc.service units/initrd-switch-root.target

Harald Hoyer harald.hoyer at gmail.com
Tue Mar 5 08:25:40 PST 2013


Am 05.03.2013 02:05, schrieb Lennart Poettering:
> On Mon, 04.03.13 10:43, Harald Hoyer (harald at kemper.freedesktop.org) wrote:
> 
>> +                if (initrd) {
>> +                        char _cleanup_free_ *mu = NULL, *name = NULL;
>> +                        /* Skip generation, if unit already exists */
>> +                        name = unit_name_from_path(where, ".mount");
>> +                        if (!name)
>> +                                return log_oom();
>> +                        mu = strjoin(arg_dest, "/", name, NULL);
>> +                        if (!mu)
>> +                                return log_oom();
>> +
>> +                        k = access(mu, R_OK);
>> +                        if (k == 0)
>> +                                continue;
>> +                }
> 
> Ahum. I can't say I like invocations to access() like this one. There
> are very few cases where access() is the right syscall to invoke, and I
> am pretty sure this is not one of them, due to its inherent
> raciness. There might be other generators running in parallel to this
> one, so the existance of the mount unit might have already changed by
> the time you then go on and actually create the unit file. So, your
> test here doesn't work and is pointless.

> Please folks, be very careful with access()! Uses like this are broken,
> you want to rely on O_EXCL (or fopen's "x") instead, to ensure the file
> is only created if it doesn't exist yet, and that is atomic.
> 
> Quite frankly, the majority of the uses of access()es I have seen in my
> life are misuses, people really should keep the atomicity of things in mind. 
> 
>>  static int parse_new_root_from_proc_cmdline(void) {
>>          char *w, *state;
>> -        _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
>> +        _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL, *mu = NULL;
>>          int r;
>>          size_t l;
>>  
>> +        /* Skip generation, if sysroot.mount already exists */
>> +        mu = strjoin(arg_dest, "/", "sysroot.mount", NULL);
>> +        if (!mu)
>> +                return log_oom();
>> +
>> +        r = access(mu, R_OK);
>> +        if (r == 0)
>> +            return 0;
>> +
> 
> Same here. Also: indentation is borked.
> 
> Lennart
> 

Sorry... reverted anyway


More information about the systemd-devel mailing list