* cygheap.h (init_cygheap): New struct holding values that live in the Cygwin
heap. * child_info.h (child_info): Change pointer type of cygheap to init_cygheap. * cygheap.cc (init_cheap): Point cygheap_max after contents of cygheap. Move some stuff into cygheap.h. * dir.cc (opendir): Change to use root and rootlen in cygheap rather than in myself. (mkdir): Change to use umask in cygheap rather than in myself. * path.cc: Ditto, throughout. * syscalls.cc (_open): Ditto. Change to use umask in cygheap rather than in myself. (chroot): Change to allocate root dir on the cygwin heap. (umask): Change to use umask in cygheap rather than in myself. (cygwin_bind): Ditto. * sigproc.cc (proc_subproc): Don't copy umask or root stuff as this happens automatically now. * pinfo.h (_pinfo): Migrate stuff out of here and into init_cheap. * dcrt0.cc (dll_crt0_1): Call cygheap_init later in startup for first cygwin process.
This commit is contained in:
parent
70a11195b9
commit
a4785603b8
@ -1,3 +1,26 @@
|
|||||||
|
Tue Nov 14 00:51:28 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* cygheap.h (init_cygheap): New struct holding values that live in the
|
||||||
|
Cygwin heap.
|
||||||
|
* child_info.h (child_info): Change pointer type of cygheap to
|
||||||
|
init_cygheap.
|
||||||
|
* cygheap.cc (init_cheap): Point cygheap_max after contents of cygheap.
|
||||||
|
Move some stuff into cygheap.h.
|
||||||
|
* dir.cc (opendir): Change to use root and rootlen in cygheap rather
|
||||||
|
than in myself.
|
||||||
|
(mkdir): Change to use umask in cygheap rather than in myself.
|
||||||
|
* path.cc: Ditto, throughout.
|
||||||
|
* syscalls.cc (_open): Ditto. Change to use umask in cygheap rather
|
||||||
|
than in myself.
|
||||||
|
(chroot): Change to allocate root dir on the cygwin heap.
|
||||||
|
(umask): Change to use umask in cygheap rather than in myself.
|
||||||
|
(cygwin_bind): Ditto.
|
||||||
|
* sigproc.cc (proc_subproc): Don't copy umask or root stuff as this
|
||||||
|
happens automatically now.
|
||||||
|
* pinfo.h (_pinfo): Migrate stuff out of here and into init_cheap.
|
||||||
|
* dcrt0.cc (dll_crt0_1): Call cygheap_init later in startup for first
|
||||||
|
cygwin process.
|
||||||
|
|
||||||
Sun Nov 12 23:01:35 2000 Christopher Faylor <cgf@cygnus.com>
|
Sun Nov 12 23:01:35 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* path.cc (get_device_number): Allow /dev/ttySn to designate a com
|
* path.cc (get_device_number): Allow /dev/ttySn to designate a com
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
HANDLE parent_alive; // handle of thread used to track children
|
HANDLE parent_alive; // handle of thread used to track children
|
||||||
HANDLE parent;
|
HANDLE parent;
|
||||||
HANDLE pppid_handle;
|
HANDLE pppid_handle;
|
||||||
void *cygheap;
|
init_cygheap *cygheap;
|
||||||
void *cygheap_max;
|
void *cygheap_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,24 +18,18 @@
|
|||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
|
|
||||||
void NO_COPY *cygheap = NULL;
|
init_cygheap NO_COPY *cygheap;
|
||||||
void NO_COPY *cygheap_max = NULL;
|
void NO_COPY *cygheap_max = NULL;
|
||||||
|
|
||||||
static NO_COPY muto *cygheap_protect = NULL;
|
static NO_COPY muto *cygheap_protect = NULL;
|
||||||
|
|
||||||
extern "C" void __stdcall
|
|
||||||
cygheap_init ()
|
|
||||||
{
|
|
||||||
cygheap_protect = new_muto (FALSE, "cygheap_protect");
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static void
|
inline static void
|
||||||
init_cheap ()
|
init_cheap ()
|
||||||
{
|
{
|
||||||
cygheap = VirtualAlloc (NULL, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS);
|
cygheap = (init_cygheap *) VirtualAlloc (NULL, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS);
|
||||||
if (!cygheap)
|
if (!cygheap)
|
||||||
api_fatal ("Couldn't reserve space for cygwin's heap, %E");
|
api_fatal ("Couldn't reserve space for cygwin's heap, %E");
|
||||||
cygheap_max = (((char **) cygheap) + 1);
|
cygheap_max = cygheap + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pagetrunc(x) ((void *) (((DWORD) (x)) & ~(4096 - 1)))
|
#define pagetrunc(x) ((void *) (((DWORD) (x)) & ~(4096 - 1)))
|
||||||
@ -60,32 +54,26 @@ _csbrk (int sbs)
|
|||||||
|
|
||||||
if (!needalloc)
|
if (!needalloc)
|
||||||
needalloc = sbs && ((heapalign == lastheap) || heapalign != pagetrunc (cygheap_max));
|
needalloc = sbs && ((heapalign == lastheap) || heapalign != pagetrunc (cygheap_max));
|
||||||
if (needalloc && !VirtualAlloc (lastheap, (DWORD) sbs, MEM_COMMIT, PAGE_READWRITE))
|
if (needalloc && !VirtualAlloc (lastheap, (DWORD) sbs ?: 1, MEM_COMMIT, PAGE_READWRITE))
|
||||||
api_fatal ("couldn't commit memory for cygwin heap, %E");
|
api_fatal ("couldn't commit memory for cygwin heap, %E");
|
||||||
|
|
||||||
return lastheap;
|
return lastheap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void __stdcall
|
||||||
|
cygheap_init ()
|
||||||
|
{
|
||||||
|
cygheap_protect = new_muto (FALSE, "cygheap_protect");
|
||||||
|
_csbrk (0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Copyright (C) 1997, 2000 DJ Delorie */
|
/* Copyright (C) 1997, 2000 DJ Delorie */
|
||||||
|
|
||||||
#define NBUCKETS 32
|
#define NBUCKETS 32
|
||||||
char *buckets[NBUCKETS] = {0};
|
char *buckets[NBUCKETS] = {0};
|
||||||
|
|
||||||
struct _cmalloc_entry
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
DWORD b;
|
|
||||||
char *ptr;
|
|
||||||
};
|
|
||||||
struct _cmalloc_entry *prev;
|
|
||||||
char data[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define N0 ((_cmalloc_entry *) NULL)
|
#define N0 ((_cmalloc_entry *) NULL)
|
||||||
#define to_cmalloc(s) ((_cmalloc_entry *) (((char *) (s)) - (int) (N0->data)))
|
#define to_cmalloc(s) ((_cmalloc_entry *) (((char *) (s)) - (int) (N0->data)))
|
||||||
#define cygheap_chain ((_cmalloc_entry **)cygheap)
|
|
||||||
|
|
||||||
static void *_cmalloc (int size) __attribute ((regparm(1)));
|
static void *_cmalloc (int size) __attribute ((regparm(1)));
|
||||||
static void *__stdcall _crealloc (void *ptr, int size) __attribute ((regparm(2)));
|
static void *__stdcall _crealloc (void *ptr, int size) __attribute ((regparm(2)));
|
||||||
@ -113,8 +101,8 @@ _cmalloc (int size)
|
|||||||
rvc = (_cmalloc_entry *) _csbrk (size);
|
rvc = (_cmalloc_entry *) _csbrk (size);
|
||||||
|
|
||||||
rvc->b = b;
|
rvc->b = b;
|
||||||
rvc->prev = *cygheap_chain;
|
rvc->prev = cygheap->chain;
|
||||||
*cygheap_chain = rvc;
|
cygheap->chain = rvc;
|
||||||
}
|
}
|
||||||
cygheap_protect->release ();
|
cygheap_protect->release ();
|
||||||
return rvc->data;
|
return rvc->data;
|
||||||
@ -172,7 +160,7 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
|
|||||||
|
|
||||||
/* Reserve cygwin heap in same spot as parent */
|
/* Reserve cygwin heap in same spot as parent */
|
||||||
if (!VirtualAlloc (cygheap, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS))
|
if (!VirtualAlloc (cygheap, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS))
|
||||||
api_fatal ("Couldn't reserve space for cygwin's heap in child, %E");
|
api_fatal ("Couldn't reserve space for cygwin's heap (%p) in child, cygheap, %E", cygheap);
|
||||||
|
|
||||||
/* Allocate same amount of memory as parent */
|
/* Allocate same amount of memory as parent */
|
||||||
if (!VirtualAlloc (cygheap, n, MEM_COMMIT, PAGE_READWRITE))
|
if (!VirtualAlloc (cygheap, n, MEM_COMMIT, PAGE_READWRITE))
|
||||||
@ -185,20 +173,22 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
|
|||||||
api_fatal ("Couldn't read parent's cygwin heap %d bytes != %d, %E",
|
api_fatal ("Couldn't read parent's cygwin heap %d bytes != %d, %E",
|
||||||
n, m);
|
n, m);
|
||||||
|
|
||||||
if (!execed)
|
cygheap_init ();
|
||||||
return; /* Forked. Nothing extra to do. */
|
|
||||||
|
|
||||||
/* Walk the allocated memory chain looking for orphaned memory from
|
if (execed)
|
||||||
previous execs */
|
|
||||||
for (_cmalloc_entry *rvc = *cygheap_chain; rvc; rvc = rvc->prev)
|
|
||||||
{
|
{
|
||||||
cygheap_entry *ce = (cygheap_entry *) rvc->data;
|
/* Walk the allocated memory chain looking for orphaned memory from
|
||||||
if (rvc->b >= NBUCKETS || ce->type <= HEAP_1_START)
|
previous execs */
|
||||||
continue;
|
for (_cmalloc_entry *rvc = cygheap->chain; rvc; rvc = rvc->prev)
|
||||||
else if (ce->type < HEAP_1_MAX)
|
{
|
||||||
ce->type += HEAP_1_MAX; /* Mark for freeing after next exec */
|
cygheap_entry *ce = (cygheap_entry *) rvc->data;
|
||||||
else
|
if (rvc->b >= NBUCKETS || ce->type <= HEAP_1_START)
|
||||||
_cfree (ce); /* Marked by parent for freeing in child */
|
continue;
|
||||||
|
else if (ce->type < HEAP_1_MAX)
|
||||||
|
ce->type += HEAP_1_MAX; /* Mark for freeing after next exec */
|
||||||
|
else
|
||||||
|
_cfree (ce); /* Marked by parent for freeing in child */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,13 +24,36 @@ enum cygheap_types
|
|||||||
HEAP_1_MAX = 100
|
HEAP_1_MAX = 100
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CYGHEAPSIZE ((2000 * sizeof (fhandler_union)) + (2 * 65536))
|
#define CYGHEAPSIZE ((4000 * sizeof (fhandler_union)) + (2 * 65536))
|
||||||
|
|
||||||
extern HANDLE cygheap;
|
|
||||||
extern HANDLE cygheap_max;
|
|
||||||
|
|
||||||
#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
|
#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
|
||||||
|
|
||||||
|
struct _cmalloc_entry
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
DWORD b;
|
||||||
|
char *ptr;
|
||||||
|
};
|
||||||
|
struct _cmalloc_entry *prev;
|
||||||
|
char data[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct init_cygheap
|
||||||
|
{
|
||||||
|
_cmalloc_entry *chain;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
size_t rootlen;
|
||||||
|
char *root;
|
||||||
|
};
|
||||||
|
mode_t umask;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern init_cygheap *cygheap;
|
||||||
|
extern void *cygheap_max;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
|
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
|
||||||
void __stdcall cygheap_fixup_in_child (HANDLE, bool);
|
void __stdcall cygheap_fixup_in_child (HANDLE, bool);
|
||||||
|
@ -654,7 +654,6 @@ dll_crt0_1 ()
|
|||||||
|
|
||||||
threadname_init ();
|
threadname_init ();
|
||||||
debug_init ();
|
debug_init ();
|
||||||
cygheap_init (); /* Initialize cygheap muto */
|
|
||||||
|
|
||||||
regthread ("main", GetCurrentThreadId ());
|
regthread ("main", GetCurrentThreadId ());
|
||||||
mainthread.init ("mainthread"); // For use in determining if signals
|
mainthread.init ("mainthread"); // For use in determining if signals
|
||||||
@ -734,6 +733,9 @@ dll_crt0_1 ()
|
|||||||
/* Initialize events. */
|
/* Initialize events. */
|
||||||
events_init ();
|
events_init ();
|
||||||
|
|
||||||
|
if (!child_proc_info)
|
||||||
|
cygheap_init ();
|
||||||
|
|
||||||
cygcwd.init ();
|
cygcwd.init ();
|
||||||
|
|
||||||
cygbench ("pre-forkee");
|
cygbench ("pre-forkee");
|
||||||
@ -861,14 +863,6 @@ dll_crt0_1 ()
|
|||||||
extern "C" void __stdcall
|
extern "C" void __stdcall
|
||||||
_dll_crt0 ()
|
_dll_crt0 ()
|
||||||
{
|
{
|
||||||
char zeros[sizeof (fork_info->zero)] = {0};
|
|
||||||
#ifdef DEBUGGING
|
|
||||||
strace.microseconds ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set the os_being_run global. */
|
|
||||||
set_os_type ();
|
|
||||||
|
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
char buf[80];
|
char buf[80];
|
||||||
if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf)))
|
if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf)))
|
||||||
@ -878,7 +872,16 @@ _dll_crt0 ()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char zeros[sizeof (fork_info->zero)] = {0};
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
strace.microseconds ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set the os_being_run global. */
|
||||||
|
set_os_type ();
|
||||||
|
|
||||||
main_environ = user_data->envptr;
|
main_environ = user_data->envptr;
|
||||||
|
*main_environ = NULL;
|
||||||
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
|
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
|
||||||
|
|
||||||
set_console_handler ();
|
set_console_handler ();
|
||||||
|
@ -24,6 +24,7 @@ details. */
|
|||||||
#include "fhandler.h"
|
#include "fhandler.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "security.h"
|
#include "security.h"
|
||||||
|
#include "cygheap.h"
|
||||||
|
|
||||||
/* Cygwin internal */
|
/* Cygwin internal */
|
||||||
/* Return whether the directory of a file is writable. Return 1 if it
|
/* Return whether the directory of a file is writable. Return 1 if it
|
||||||
@ -75,7 +76,7 @@ opendir (const char *dirname)
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stat (myself->rootlen ? dirname : real_dirname.get_win32 (),
|
if (stat (cygheap->rootlen ? dirname : real_dirname.get_win32 (),
|
||||||
&statbuf) == -1)
|
&statbuf) == -1)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
@ -298,7 +299,7 @@ mkdir (const char *dir, mode_t mode)
|
|||||||
if (CreateDirectoryA (real_dir.get_win32 (), 0))
|
if (CreateDirectoryA (real_dir.get_win32 (), 0))
|
||||||
{
|
{
|
||||||
set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (),
|
set_file_attribute (real_dir.has_acls (), real_dir.get_win32 (),
|
||||||
S_IFDIR | ((mode & 0777) & ~myself->umask));
|
S_IFDIR | ((mode & 0777) & ~cygheap->umask));
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -65,7 +65,7 @@ fillout_pinfo (pid_t pid, int winpid)
|
|||||||
ep.gid = p->gid;
|
ep.gid = p->gid;
|
||||||
ep.pgid = p->pgid;
|
ep.pgid = p->pgid;
|
||||||
ep.sid = p->sid;
|
ep.sid = p->sid;
|
||||||
ep.umask = p->umask;
|
ep.umask = 0;
|
||||||
ep.start_time = p->start_time;
|
ep.start_time = p->start_time;
|
||||||
ep.rusage_self = p->rusage_self;
|
ep.rusage_self = p->rusage_self;
|
||||||
ep.rusage_children = p->rusage_children;
|
ep.rusage_children = p->rusage_children;
|
||||||
|
@ -807,7 +807,7 @@ cygwin_bind (int fd, struct sockaddr *my_addr, int addrlen)
|
|||||||
{
|
{
|
||||||
_close (fd);
|
_close (fd);
|
||||||
chmod (un_addr->sun_path,
|
chmod (un_addr->sun_path,
|
||||||
(S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~myself->umask);
|
(S_IFSOCK | S_IRWXU | S_IRWXG | S_IRWXO) & ~cygheap->umask);
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
#undef un_addr
|
#undef un_addr
|
||||||
|
@ -110,9 +110,9 @@ cwdstuff cygcwd; /* The current working directory. */
|
|||||||
!path[cygwin_shared->mount.cygdrive_len + 1]))
|
!path[cygwin_shared->mount.cygdrive_len + 1]))
|
||||||
|
|
||||||
#define ischrootpath(path) \
|
#define ischrootpath(path) \
|
||||||
(myself->rootlen && \
|
(cygheap->rootlen && \
|
||||||
strncasematch (myself->root, path, myself->rootlen) && \
|
strncasematch (cygheap->root, path, cygheap->rootlen) && \
|
||||||
(path[myself->rootlen] == '/' || path[myself->rootlen] == '\0'))
|
(path[cygheap->rootlen] == '/' || path[cygheap->rootlen] == '\0'))
|
||||||
|
|
||||||
/* Return non-zero if PATH1 is a prefix of PATH2.
|
/* Return non-zero if PATH1 is a prefix of PATH2.
|
||||||
Both are assumed to be of the same path style and / vs \ usage.
|
Both are assumed to be of the same path style and / vs \ usage.
|
||||||
@ -615,7 +615,7 @@ normalize_posix_path (const char *src, char *dst)
|
|||||||
/* Two leading /'s? If so, preserve them. */
|
/* Two leading /'s? If so, preserve them. */
|
||||||
else if (isslash (src[1]))
|
else if (isslash (src[1]))
|
||||||
{
|
{
|
||||||
if (myself->rootlen)
|
if (cygheap->rootlen)
|
||||||
{
|
{
|
||||||
debug_printf ("ENOENT = normalize_posix_path (%s)", src);
|
debug_printf ("ENOENT = normalize_posix_path (%s)", src);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
@ -631,10 +631,10 @@ normalize_posix_path (const char *src, char *dst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Exactly one leading slash. Absolute path. Check for chroot. */
|
/* Exactly one leading slash. Absolute path. Check for chroot. */
|
||||||
else if (myself->rootlen)
|
else if (cygheap->rootlen)
|
||||||
{
|
{
|
||||||
strcpy (dst, myself->root);
|
strcpy (dst, cygheap->root);
|
||||||
dst += myself->rootlen;
|
dst += cygheap->rootlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (*src)
|
while (*src)
|
||||||
@ -669,7 +669,7 @@ normalize_posix_path (const char *src, char *dst)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ischrootpath (dst_start) ||
|
if (!ischrootpath (dst_start) ||
|
||||||
dst - dst_start != (int) myself->rootlen)
|
dst - dst_start != (int) cygheap->rootlen)
|
||||||
while (dst > dst_start && !isslash (*--dst))
|
while (dst > dst_start && !isslash (*--dst))
|
||||||
continue;
|
continue;
|
||||||
src++;
|
src++;
|
||||||
@ -718,7 +718,7 @@ normalize_win32_path (const char *src, char *dst)
|
|||||||
/* Two leading \'s? If so, preserve them. */
|
/* Two leading \'s? If so, preserve them. */
|
||||||
else if (SLASH_P (src[0]) && SLASH_P (src[1]))
|
else if (SLASH_P (src[0]) && SLASH_P (src[1]))
|
||||||
{
|
{
|
||||||
if (myself->rootlen)
|
if (cygheap->rootlen)
|
||||||
{
|
{
|
||||||
debug_printf ("ENOENT = normalize_win32_path (%s)", src);
|
debug_printf ("ENOENT = normalize_win32_path (%s)", src);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
@ -727,13 +727,13 @@ normalize_win32_path (const char *src, char *dst)
|
|||||||
++src;
|
++src;
|
||||||
}
|
}
|
||||||
/* If absolute path, care for chroot. */
|
/* If absolute path, care for chroot. */
|
||||||
else if (SLASH_P (src[0]) && !SLASH_P (src[1]) && myself->rootlen)
|
else if (SLASH_P (src[0]) && !SLASH_P (src[1]) && cygheap->rootlen)
|
||||||
{
|
{
|
||||||
strcpy (dst, myself->root);
|
strcpy (dst, cygheap->root);
|
||||||
char *c;
|
char *c;
|
||||||
while ((c = strchr (dst, '/')) != NULL)
|
while ((c = strchr (dst, '/')) != NULL)
|
||||||
*c = '\\';
|
*c = '\\';
|
||||||
dst += myself->rootlen;
|
dst += cygheap->rootlen;
|
||||||
dst_root_start = dst;
|
dst_root_start = dst;
|
||||||
*dst++ = '\\';
|
*dst++ = '\\';
|
||||||
}
|
}
|
||||||
@ -997,7 +997,7 @@ mount_info::conv_to_win32_path (const char *src_path, char *win32_path,
|
|||||||
}
|
}
|
||||||
isrelpath = !isabspath (src_path);
|
isrelpath = !isabspath (src_path);
|
||||||
*flags = set_flags_from_win32_path (dst);
|
*flags = set_flags_from_win32_path (dst);
|
||||||
if (myself->rootlen && dst[0] && dst[1] == ':')
|
if (cygheap->rootlen && dst[0] && dst[1] == ':')
|
||||||
{
|
{
|
||||||
char posix_path[MAX_PATH + 1];
|
char posix_path[MAX_PATH + 1];
|
||||||
|
|
||||||
@ -2939,9 +2939,9 @@ cwdstuff::get (char *buf, int need_posix, int with_chroot, unsigned ulen)
|
|||||||
tocopy = win32;
|
tocopy = win32;
|
||||||
else
|
else
|
||||||
tocopy = with_chroot && ischrootpath(posix) ?
|
tocopy = with_chroot && ischrootpath(posix) ?
|
||||||
posix + myself->rootlen : posix;
|
posix + cygheap->rootlen : posix;
|
||||||
|
|
||||||
debug_printf("myself->root: %s, posix: %s", myself->root, posix);
|
debug_printf("cygheap->root: %s, posix: %s", cygheap->root, posix);
|
||||||
if (strlen (tocopy) >= ulen)
|
if (strlen (tocopy) >= ulen)
|
||||||
{
|
{
|
||||||
set_errno (ERANGE);
|
set_errno (ERANGE);
|
||||||
|
@ -72,7 +72,6 @@ public:
|
|||||||
pid_t pgid; /* Process group ID */
|
pid_t pgid; /* Process group ID */
|
||||||
pid_t sid; /* Session ID */
|
pid_t sid; /* Session ID */
|
||||||
int ctty; /* Control tty */
|
int ctty; /* Control tty */
|
||||||
mode_t umask;
|
|
||||||
bool has_pgid_children;/* True if we've forked or spawned children with our GID. */
|
bool has_pgid_children;/* True if we've forked or spawned children with our GID. */
|
||||||
char username[MAX_USER_NAME]; /* user's name */
|
char username[MAX_USER_NAME]; /* user's name */
|
||||||
|
|
||||||
@ -93,11 +92,6 @@ public:
|
|||||||
uid_t real_uid; /* Remains intact on seteuid, replaced by setuid */
|
uid_t real_uid; /* Remains intact on seteuid, replaced by setuid */
|
||||||
gid_t real_gid; /* Ditto */
|
gid_t real_gid; /* Ditto */
|
||||||
|
|
||||||
/* Filled when chroot() is called by the process or one of it's parents.
|
|
||||||
Saved without trailing backslash. */
|
|
||||||
char root[MAX_PATH+1];
|
|
||||||
size_t rootlen;
|
|
||||||
|
|
||||||
/* Resources used by process. */
|
/* Resources used by process. */
|
||||||
long start_time;
|
long start_time;
|
||||||
struct rusage rusage_self;
|
struct rusage rusage_self;
|
||||||
|
@ -263,7 +263,6 @@ proc_subproc (DWORD what, DWORD val)
|
|||||||
vchild->pgid = myself->pgid;
|
vchild->pgid = myself->pgid;
|
||||||
vchild->sid = myself->sid;
|
vchild->sid = myself->sid;
|
||||||
vchild->ctty = myself->ctty;
|
vchild->ctty = myself->ctty;
|
||||||
vchild->umask = myself->umask;
|
|
||||||
vchild->orig_uid = myself->orig_uid;
|
vchild->orig_uid = myself->orig_uid;
|
||||||
vchild->orig_gid = myself->orig_gid;
|
vchild->orig_gid = myself->orig_gid;
|
||||||
vchild->real_uid = myself->real_uid;
|
vchild->real_uid = myself->real_uid;
|
||||||
@ -276,9 +275,7 @@ proc_subproc (DWORD what, DWORD val)
|
|||||||
}
|
}
|
||||||
memcpy (vchild->logsrv, myself->logsrv, MAX_HOST_NAME);
|
memcpy (vchild->logsrv, myself->logsrv, MAX_HOST_NAME);
|
||||||
memcpy (vchild->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
|
memcpy (vchild->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
|
||||||
memcpy (vchild->root, myself->root, MAX_PATH+1);
|
|
||||||
vchild->token = myself->token;
|
vchild->token = myself->token;
|
||||||
vchild->rootlen = myself->rootlen;
|
|
||||||
vchild->process_state |= PID_INITIALIZING | (myself->process_state & PID_USETTY);
|
vchild->process_state |= PID_INITIALIZING | (myself->process_state & PID_USETTY);
|
||||||
|
|
||||||
sigproc_printf ("added pid %d to wait list, slot %d, winpid %p, handle %p",
|
sigproc_printf ("added pid %d to wait list, slot %d, winpid %p, handle %p",
|
||||||
|
@ -36,6 +36,7 @@ details. */
|
|||||||
#include "shared_info.h"
|
#include "shared_info.h"
|
||||||
#include "perprocess.h"
|
#include "perprocess.h"
|
||||||
#include "security.h"
|
#include "security.h"
|
||||||
|
#include "cygheap.h"
|
||||||
|
|
||||||
extern BOOL allow_ntsec;
|
extern BOOL allow_ntsec;
|
||||||
|
|
||||||
@ -401,7 +402,7 @@ _open (const char *unix_path, int flags, ...)
|
|||||||
set_errno (ENMFILE);
|
set_errno (ENMFILE);
|
||||||
else if ((fh = fdtab.build_fhandler (fd, unix_path, NULL)) == NULL)
|
else if ((fh = fdtab.build_fhandler (fd, unix_path, NULL)) == NULL)
|
||||||
res = -1; // errno already set
|
res = -1; // errno already set
|
||||||
else if (!fh->open (unix_path, flags, (mode & 0777) & ~myself->umask))
|
else if (!fh->open (unix_path, flags, (mode & 0777) & ~cygheap->umask))
|
||||||
{
|
{
|
||||||
fdtab.release (fd);
|
fdtab.release (fd);
|
||||||
res = -1;
|
res = -1;
|
||||||
@ -764,8 +765,8 @@ umask (mode_t mask)
|
|||||||
{
|
{
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
|
|
||||||
oldmask = myself->umask;
|
oldmask = cygheap->umask;
|
||||||
myself->umask = mask & 0777;
|
cygheap->umask = mask & 0777;
|
||||||
return oldmask;
|
return oldmask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1921,16 +1922,19 @@ chroot (const char *newroot)
|
|||||||
set_errno (ENOTDIR);
|
set_errno (ENOTDIR);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
char buf[MAX_PATH + 1];
|
||||||
ret = cygwin_shared->mount.conv_to_posix_path (path.get_win32 (),
|
ret = cygwin_shared->mount.conv_to_posix_path (path.get_win32 (),
|
||||||
myself->root, 0);
|
buf, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
set_errno (ret);
|
set_errno (ret);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
myself->rootlen = strlen (myself->root);
|
cygheap->rootlen = strlen (cygheap->root);
|
||||||
if (myself->root[myself->rootlen - 1] == '/')
|
if (cygheap->rootlen > 1 && buf[cygheap->rootlen - 1] == '/')
|
||||||
myself->root[--myself->rootlen] = '\0';
|
buf[--cygheap->rootlen] = '\0';
|
||||||
|
cygheap->root = (char *) crealloc (cygheap->root, cygheap->rootlen + 1);
|
||||||
|
strcpy (cygheap->root, buf);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user