summaryrefslogtreecommitdiff
path: root/libstore
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2019-03-03 16:02:41 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2019-03-03 16:02:41 +0100
commit8619aea268c1bda2a536a65d8fbc24c4bcb9d239 (patch)
treef927dc848428bdb189d9f5a984cd44d76538e96b /libstore
parent8d4a84a44b85dd982f3130d004c29c8382f516ac (diff)
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.c58
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)