* path.cc (mount_info::read_mounts): Don't delete mount entries of which mount

points have the cygdrive prefix.
* (mount_info::add_reg_mount): Properly catch errors on registry operations.
* (mount_info::write_cygdrive_info_to_registry): Ditto.
* (mount_info::del_reg_mount): Cosmetic changes to be consistent with other
methods.
* (mount_info::add_item): Check arguments more precisely.  Increment nmounts
only when registry operations succeed.
This commit is contained in:
Christopher Faylor 2000-09-18 16:42:28 +00:00
parent ca7ea5a6e7
commit 9a02bdb58c
2 changed files with 58 additions and 77 deletions

View File

@ -1,3 +1,15 @@
Mon Sep 18 17:15:37 2000 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
* path.cc (mount_info::read_mounts): Don't delete mount entries of
which mount points have the cygdrive prefix.
* (mount_info::add_reg_mount): Properly catch errors on registry
operations.
* (mount_info::write_cygdrive_info_to_registry): Ditto.
* (mount_info::del_reg_mount): Cosmetic changes to be consistent
with other methods.
* (mount_info::add_item): Check arguments more precisely.
Increment nmounts only when registry operations succeed.
Sun Sep 17 22:18:39 2000 Christopher Faylor <cgf@cygnus.com> Sun Sep 17 22:18:39 2000 Christopher Faylor <cgf@cygnus.com>
* exceptions.cc (interruptible): Return 0 if given an address in * exceptions.cc (interruptible): Return 0 if given an address in

View File

@ -1269,13 +1269,13 @@ mount_info::read_mounts (reg_key& r)
char posix_path[MAX_PATH]; char posix_path[MAX_PATH];
HKEY key = r.get_key (); HKEY key = r.get_key ();
DWORD i, posix_path_size; DWORD i, posix_path_size;
int found_cygdrive = FALSE; int res;
/* Loop through subkeys */ /* Loop through subkeys */
/* FIXME: we would like to not check MAX_MOUNTS but the heap in the /* FIXME: we would like to not check MAX_MOUNTS but the heap in the
shared area is currently statically allocated so we can't have an shared area is currently statically allocated so we can't have an
arbitrarily large number of mounts. */ arbitrarily large number of mounts. */
for (DWORD i = 0; ; i++) for (i = 0; ; i++)
{ {
char native_path[MAX_PATH]; char native_path[MAX_PATH];
int mount_flags; int mount_flags;
@ -1284,23 +1284,17 @@ mount_info::read_mounts (reg_key& r)
/* FIXME: if maximum posix_path_size is 256, we're going to /* FIXME: if maximum posix_path_size is 256, we're going to
run into problems if we ever try to store a mount point that's run into problems if we ever try to store a mount point that's
over 256 but is under MAX_PATH! */ over 256 but is under MAX_PATH! */
LONG err = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL, res = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL,
NULL, NULL, NULL); NULL, NULL, NULL);
if (err == ERROR_NO_MORE_ITEMS) if (res == ERROR_NO_MORE_ITEMS)
break; break;
else if (err != ERROR_SUCCESS) else if (res != ERROR_SUCCESS)
{ {
debug_printf ("RegEnumKeyEx failed, error %d!\n", err); debug_printf ("RegEnumKeyEx failed, error %d!\n", res);
break; break;
} }
if (iscygdrive (posix_path))
{
found_cygdrive = TRUE;
continue;
}
/* Get a reg_key based on i. */ /* Get a reg_key based on i. */
reg_key subkey = reg_key (key, KEY_READ, posix_path, NULL); reg_key subkey = reg_key (key, KEY_READ, posix_path, NULL);
@ -1309,31 +1303,10 @@ mount_info::read_mounts (reg_key& r)
mount_flags = subkey.get_int ("flags", 0); mount_flags = subkey.get_int ("flags", 0);
/* Add mount_item corresponding to registry mount point. */ /* Add mount_item corresponding to registry mount point. */
int res = cygwin_shared->mount.add_item (native_path, posix_path, mount_flags, FALSE); res = cygwin_shared->mount.add_item (native_path, posix_path, mount_flags, FALSE);
if (res && get_errno () == EMFILE) if (res && get_errno () == EMFILE)
break; /* The number of entries exceeds MAX_MOUNTS */ break; /* The number of entries exceeds MAX_MOUNTS */
} }
if (!found_cygdrive)
return;
loop:
for (i = 0; ;i++)
{
posix_path_size = MAX_PATH;
LONG err = RegEnumKeyEx (key, i, posix_path, &posix_path_size, NULL,
NULL, NULL, NULL);
if (err != ERROR_SUCCESS)
break;
if (iscygdrive (posix_path))
{
/* This shouldn't be in the mount table. */
(void) r.kill (posix_path);
goto loop;
}
}
} }
/* from_registry: Build the entire mount table from the registry. Also, /* from_registry: Build the entire mount table from the registry. Also,
@ -1376,6 +1349,8 @@ mount_info::from_registry ()
int int
mount_info::add_reg_mount (const char * native_path, const char * posix_path, unsigned mountflags) mount_info::add_reg_mount (const char * native_path, const char * posix_path, unsigned mountflags)
{ {
int res = 0;
/* Add the mount to the right registry location, depending on /* Add the mount to the right registry location, depending on
whether MOUNT_SYSTEM is set in the mount flags. */ whether MOUNT_SYSTEM is set in the mount flags. */
if (!(mountflags & MOUNT_SYSTEM)) /* current_user mount */ if (!(mountflags & MOUNT_SYSTEM)) /* current_user mount */
@ -1384,14 +1359,18 @@ mount_info::add_reg_mount (const char * native_path, const char * posix_path, un
reg_key reg_user; reg_key reg_user;
/* Start by deleting existing mount if one exists. */ /* Start by deleting existing mount if one exists. */
reg_user.kill (posix_path); res = reg_user.kill (posix_path);
if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND)
goto err;
/* Create the new mount. */ /* Create the new mount. */
reg_key subkey = reg_key (reg_user.get_key (), reg_key subkey = reg_key (reg_user.get_key (),
KEY_ALL_ACCESS, KEY_ALL_ACCESS,
posix_path, NULL); posix_path, NULL);
subkey.set_string ("native", native_path); res = subkey.set_string ("native", native_path);
subkey.set_int ("flags", mountflags); if (res != ERROR_SUCCESS)
goto err;
res = subkey.set_int ("flags", mountflags);
} }
else /* local_machine mount */ else /* local_machine mount */
{ {
@ -1402,24 +1381,25 @@ mount_info::add_reg_mount (const char * native_path, const char * posix_path, un
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
NULL); NULL);
if (reg_sys.get_key () == INVALID_HANDLE_VALUE)
{
set_errno (EACCES);
return -1;
}
/* Start by deleting existing mount if one exists. */ /* Start by deleting existing mount if one exists. */
reg_sys.kill (posix_path); res = reg_sys.kill (posix_path);
if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND)
goto err;
/* Create the new mount. */ /* Create the new mount. */
reg_key subkey = reg_key (reg_sys.get_key (), reg_key subkey = reg_key (reg_sys.get_key (),
KEY_ALL_ACCESS, KEY_ALL_ACCESS,
posix_path, NULL); posix_path, NULL);
subkey.set_string ("native", native_path); res = subkey.set_string ("native", native_path);
subkey.set_int ("flags", mountflags); if (res != ERROR_SUCCESS)
goto err;
res = subkey.set_int ("flags", mountflags);
} }
return 0; /* Success! */ return 0; /* Success! */
err:
__seterrno_from_win_error (res);
return -1;
} }
/* del_reg_mount: delete mount item from registry indicated in flags. /* del_reg_mount: delete mount item from registry indicated in flags.
@ -1429,13 +1409,13 @@ mount_info::add_reg_mount (const char * native_path, const char * posix_path, un
int int
mount_info::del_reg_mount (const char * posix_path, unsigned flags) mount_info::del_reg_mount (const char * posix_path, unsigned flags)
{ {
int killres; int res;
if ((flags & MOUNT_SYSTEM) == 0) /* Delete from user registry */ if ((flags & MOUNT_SYSTEM) == 0) /* Delete from user registry */
{ {
reg_key reg_user (KEY_ALL_ACCESS, reg_key reg_user (KEY_ALL_ACCESS,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
killres = reg_user.kill (posix_path); res = reg_user.kill (posix_path);
} }
else /* Delete from system registry */ else /* Delete from system registry */
{ {
@ -1444,19 +1424,12 @@ mount_info::del_reg_mount (const char * posix_path, unsigned flags)
CYGWIN_INFO_CYGWIN_REGISTRY_NAME, CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
NULL); NULL);
res = reg_sys.kill (posix_path);
if (reg_sys.get_key () == INVALID_HANDLE_VALUE)
{
set_errno (EACCES);
return -1;
}
killres = reg_sys.kill (posix_path);
} }
if (killres != ERROR_SUCCESS) if (res != ERROR_SUCCESS)
{ {
__seterrno_from_win_error (killres); __seterrno_from_win_error (res);
return -1; return -1;
} }
@ -1541,7 +1514,13 @@ mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsign
/* Ensure that there is never a final slash */ /* Ensure that there is never a final slash */
nofinalslash (cygdrive_prefix, hold_cygdrive_prefix); nofinalslash (cygdrive_prefix, hold_cygdrive_prefix);
r.set_string ("cygdrive prefix", hold_cygdrive_prefix); int res;
res = r.set_string ("cygdrive prefix", hold_cygdrive_prefix);
if (res != ERROR_SUCCESS)
{
__seterrno_from_win_error (res);
return -1;
}
r.set_int ("cygdrive flags", flags); r.set_int ("cygdrive flags", flags);
/* This also needs to go in the in-memory copy of "cygdrive", but only if /* This also needs to go in the in-memory copy of "cygdrive", but only if
@ -1711,7 +1690,8 @@ mount_info::add_item (const char *native, const char *posix, unsigned mountflags
if ((native == NULL) || (*native == 0) || if ((native == NULL) || (*native == 0) ||
(posix == NULL) || (*posix == 0) || (posix == NULL) || (*posix == 0) ||
(!slash_unc_prefix_p (native) && !isabspath (native))) !isabspath (native) || !isabspath (posix) ||
slash_unc_prefix_p (posix) || isdrive (posix))
{ {
set_errno (EINVAL); set_errno (EINVAL);
return -1; return -1;
@ -1753,20 +1733,17 @@ mount_info::add_item (const char *native, const char *posix, unsigned mountflags
break; break;
} }
if (i == nmounts) if (i == nmounts && nmounts == MAX_MOUNTS)
{ {
if (nmounts < MAX_MOUNTS) set_errno (EMFILE);
i = nmounts++; return -1;
else
{
set_errno (EMFILE);
return -1;
}
} }
if (reg_p && add_reg_mount (nativetmp, posixtmp, mountflags)) if (reg_p && add_reg_mount (nativetmp, posixtmp, mountflags))
return -1; return -1;
if (i == nmounts)
nmounts++;
mount[i].init (nativetmp, posixtmp, mountflags); mount[i].init (nativetmp, posixtmp, mountflags);
sort (); sort ();
@ -2001,15 +1978,7 @@ mount (const char *win32_path, const char *posix_path, unsigned flags)
win32_path = NULL; win32_path = NULL;
} }
else else
{ res = cygwin_shared->mount.add_item (win32_path, posix_path, flags, TRUE);
if (iscygdrive (posix_path))
{
set_errno (EINVAL);
return res; /* Don't try to add cygdrive prefix. */
}
res = cygwin_shared->mount.add_item (win32_path, posix_path, flags, TRUE);
}
syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags); syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags);
return res; return res;