diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-03-03 16:02:41 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-03-03 16:02:41 +0100 |
commit | 8619aea268c1bda2a536a65d8fbc24c4bcb9d239 (patch) | |
tree | f927dc848428bdb189d9f5a984cd44d76538e96b /libstore | |
parent | 8d4a84a44b85dd982f3130d004c29c8382f516ac (diff) | |
download | hurd-8619aea268c1bda2a536a65d8fbc24c4bcb9d239.tar.gz hurd-8619aea268c1bda2a536a65d8fbc24c4bcb9d239.tar.bz2 hurd-8619aea268c1bda2a536a65d8fbc24c4bcb9d239.zip |
libstore: Fix dopen() with non-path which happens to be a path
For instance storeio on /dev/mem would try to open itself...
* libstore/device.c (dopen): Only file_name_lookup() name if it starts
with '/'.
Diffstat (limited to 'libstore')
-rw-r--r-- | libstore/device.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/libstore/device.c b/libstore/device.c index 1a79c249..1d8f57fd 100644 --- a/libstore/device.c +++ b/libstore/device.c @@ -94,42 +94,46 @@ static error_t dopen (const char *name, device_t *device, int *mod_flags) { device_t dev_master; - error_t err; - if (*mod_flags & STORE_HARD_READONLY) - { - dev_master = file_name_lookup (name, O_READ, 0); - if (dev_master != MACH_PORT_NULL) - { - err = device_open (dev_master, D_READ, "disk", device); - if (err) - err = ENODEV; + error_t err = ENODEV; - mach_port_deallocate (mach_task_self (), dev_master); - } - else - err = ENODEV; - } - else + if (name[0] == '/') { - dev_master = file_name_lookup (name, O_READ | O_WRITE, 0); - if (dev_master != MACH_PORT_NULL) + if (*mod_flags & STORE_HARD_READONLY) { - err = device_open (dev_master, D_READ | D_WRITE, "disk", device); - if (err == ED_READ_ONLY) + dev_master = file_name_lookup (name, O_READ, 0); + if (dev_master != MACH_PORT_NULL) { err = device_open (dev_master, D_READ, "disk", device); - if (! err) - *mod_flags |= STORE_HARD_READONLY; - else + if (err) err = ENODEV; - } - else if (! err) - *mod_flags &= ~STORE_HARD_READONLY; - mach_port_deallocate (mach_task_self (), dev_master); + mach_port_deallocate (mach_task_self (), dev_master); + } + else + err = ENODEV; } else - err = ENODEV; + { + dev_master = file_name_lookup (name, O_READ | O_WRITE, 0); + if (dev_master != MACH_PORT_NULL) + { + err = device_open (dev_master, D_READ | D_WRITE, "disk", device); + if (err == ED_READ_ONLY) + { + err = device_open (dev_master, D_READ, "disk", device); + if (! err) + *mod_flags |= STORE_HARD_READONLY; + else + err = ENODEV; + } + else if (! err) + *mod_flags &= ~STORE_HARD_READONLY; + + mach_port_deallocate (mach_task_self (), dev_master); + } + else + err = ENODEV; + } } if (err) |