* 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:
Christopher Faylor 2000-11-14 05:53:32 +00:00
parent 70a11195b9
commit a4785603b8
12 changed files with 122 additions and 87 deletions

View File

@ -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>
* path.cc (get_device_number): Allow /dev/ttySn to designate a com

View File

@ -39,7 +39,7 @@ public:
HANDLE parent_alive; // handle of thread used to track children
HANDLE parent;
HANDLE pppid_handle;
void *cygheap;
init_cygheap *cygheap;
void *cygheap_max;
};

View File

@ -18,24 +18,18 @@
#include "cygerrno.h"
#include "sync.h"
void NO_COPY *cygheap = NULL;
init_cygheap NO_COPY *cygheap;
void NO_COPY *cygheap_max = NULL;
static NO_COPY muto *cygheap_protect = NULL;
extern "C" void __stdcall
cygheap_init ()
{
cygheap_protect = new_muto (FALSE, "cygheap_protect");
}
inline static void
init_cheap ()
{
cygheap = VirtualAlloc (NULL, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS);
cygheap = (init_cygheap *) VirtualAlloc (NULL, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS);
if (!cygheap)
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)))
@ -60,32 +54,26 @@ _csbrk (int sbs)
if (!needalloc)
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");
return lastheap;
}
extern "C" void __stdcall
cygheap_init ()
{
cygheap_protect = new_muto (FALSE, "cygheap_protect");
_csbrk (0);
}
/* Copyright (C) 1997, 2000 DJ Delorie */
#define NBUCKETS 32
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 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 *__stdcall _crealloc (void *ptr, int size) __attribute ((regparm(2)));
@ -113,8 +101,8 @@ _cmalloc (int size)
rvc = (_cmalloc_entry *) _csbrk (size);
rvc->b = b;
rvc->prev = *cygheap_chain;
*cygheap_chain = rvc;
rvc->prev = cygheap->chain;
cygheap->chain = rvc;
}
cygheap_protect->release ();
return rvc->data;
@ -172,7 +160,7 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
/* Reserve cygwin heap in same spot as parent */
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 */
if (!VirtualAlloc (cygheap, n, MEM_COMMIT, PAGE_READWRITE))
@ -185,12 +173,13 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
api_fatal ("Couldn't read parent's cygwin heap %d bytes != %d, %E",
n, m);
if (!execed)
return; /* Forked. Nothing extra to do. */
cygheap_init ();
if (execed)
{
/* Walk the allocated memory chain looking for orphaned memory from
previous execs */
for (_cmalloc_entry *rvc = *cygheap_chain; rvc; rvc = rvc->prev)
for (_cmalloc_entry *rvc = cygheap->chain; rvc; rvc = rvc->prev)
{
cygheap_entry *ce = (cygheap_entry *) rvc->data;
if (rvc->b >= NBUCKETS || ce->type <= HEAP_1_START)
@ -201,6 +190,7 @@ cygheap_fixup_in_child (HANDLE parent, bool execed)
_cfree (ce); /* Marked by parent for freeing in child */
}
}
}
inline static void *
creturn (cygheap_types x, cygheap_entry * c, int len)

View File

@ -24,13 +24,36 @@ enum cygheap_types
HEAP_1_MAX = 100
};
#define CYGHEAPSIZE ((2000 * sizeof (fhandler_union)) + (2 * 65536))
extern HANDLE cygheap;
extern HANDLE cygheap_max;
#define CYGHEAPSIZE ((4000 * sizeof (fhandler_union)) + (2 * 65536))
#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" {
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
void __stdcall cygheap_fixup_in_child (HANDLE, bool);

View File

@ -654,7 +654,6 @@ dll_crt0_1 ()
threadname_init ();
debug_init ();
cygheap_init (); /* Initialize cygheap muto */
regthread ("main", GetCurrentThreadId ());
mainthread.init ("mainthread"); // For use in determining if signals
@ -734,6 +733,9 @@ dll_crt0_1 ()
/* Initialize events. */
events_init ();
if (!child_proc_info)
cygheap_init ();
cygcwd.init ();
cygbench ("pre-forkee");
@ -861,14 +863,6 @@ dll_crt0_1 ()
extern "C" void __stdcall
_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
char buf[80];
if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf)))
@ -878,7 +872,16 @@ _dll_crt0 ()
}
#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 = NULL;
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
set_console_handler ();

View File

@ -24,6 +24,7 @@ details. */
#include "fhandler.h"
#include "path.h"
#include "security.h"
#include "cygheap.h"
/* Cygwin internal */
/* Return whether the directory of a file is writable. Return 1 if it
@ -75,7 +76,7 @@ opendir (const char *dirname)
goto failed;
}
if (stat (myself->rootlen ? dirname : real_dirname.get_win32 (),
if (stat (cygheap->rootlen ? dirname : real_dirname.get_win32 (),
&statbuf) == -1)
goto failed;
@ -298,7 +299,7 @@ mkdir (const char *dir, mode_t mode)
if (CreateDirectoryA (real_dir.get_win32 (), 0))
{
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;
}
else

View File

@ -65,7 +65,7 @@ fillout_pinfo (pid_t pid, int winpid)
ep.gid = p->gid;
ep.pgid = p->pgid;
ep.sid = p->sid;
ep.umask = p->umask;
ep.umask = 0;
ep.start_time = p->start_time;
ep.rusage_self = p->rusage_self;
ep.rusage_children = p->rusage_children;

View File

@ -807,7 +807,7 @@ cygwin_bind (int fd, struct sockaddr *my_addr, int addrlen)
{
_close (fd);
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;
}
#undef un_addr

View File

@ -110,9 +110,9 @@ cwdstuff cygcwd; /* The current working directory. */
!path[cygwin_shared->mount.cygdrive_len + 1]))
#define ischrootpath(path) \
(myself->rootlen && \
strncasematch (myself->root, path, myself->rootlen) && \
(path[myself->rootlen] == '/' || path[myself->rootlen] == '\0'))
(cygheap->rootlen && \
strncasematch (cygheap->root, path, cygheap->rootlen) && \
(path[cygheap->rootlen] == '/' || path[cygheap->rootlen] == '\0'))
/* Return non-zero if PATH1 is a prefix of PATH2.
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. */
else if (isslash (src[1]))
{
if (myself->rootlen)
if (cygheap->rootlen)
{
debug_printf ("ENOENT = normalize_posix_path (%s)", src);
return ENOENT;
@ -631,10 +631,10 @@ normalize_posix_path (const char *src, char *dst)
}
}
/* Exactly one leading slash. Absolute path. Check for chroot. */
else if (myself->rootlen)
else if (cygheap->rootlen)
{
strcpy (dst, myself->root);
dst += myself->rootlen;
strcpy (dst, cygheap->root);
dst += cygheap->rootlen;
}
while (*src)
@ -669,7 +669,7 @@ normalize_posix_path (const char *src, char *dst)
else
{
if (!ischrootpath (dst_start) ||
dst - dst_start != (int) myself->rootlen)
dst - dst_start != (int) cygheap->rootlen)
while (dst > dst_start && !isslash (*--dst))
continue;
src++;
@ -718,7 +718,7 @@ normalize_win32_path (const char *src, char *dst)
/* Two leading \'s? If so, preserve them. */
else if (SLASH_P (src[0]) && SLASH_P (src[1]))
{
if (myself->rootlen)
if (cygheap->rootlen)
{
debug_printf ("ENOENT = normalize_win32_path (%s)", src);
return ENOENT;
@ -727,13 +727,13 @@ normalize_win32_path (const char *src, char *dst)
++src;
}
/* 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;
while ((c = strchr (dst, '/')) != NULL)
*c = '\\';
dst += myself->rootlen;
dst += cygheap->rootlen;
dst_root_start = dst;
*dst++ = '\\';
}
@ -997,7 +997,7 @@ mount_info::conv_to_win32_path (const char *src_path, char *win32_path,
}
isrelpath = !isabspath (src_path);
*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];
@ -2939,9 +2939,9 @@ cwdstuff::get (char *buf, int need_posix, int with_chroot, unsigned ulen)
tocopy = win32;
else
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)
{
set_errno (ERANGE);

View File

@ -72,7 +72,6 @@ public:
pid_t pgid; /* Process group ID */
pid_t sid; /* Session ID */
int ctty; /* Control tty */
mode_t umask;
bool has_pgid_children;/* True if we've forked or spawned children with our GID. */
char username[MAX_USER_NAME]; /* user's name */
@ -93,11 +92,6 @@ public:
uid_t real_uid; /* Remains intact on seteuid, replaced by setuid */
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. */
long start_time;
struct rusage rusage_self;

View File

@ -263,7 +263,6 @@ proc_subproc (DWORD what, DWORD val)
vchild->pgid = myself->pgid;
vchild->sid = myself->sid;
vchild->ctty = myself->ctty;
vchild->umask = myself->umask;
vchild->orig_uid = myself->orig_uid;
vchild->orig_gid = myself->orig_gid;
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->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
memcpy (vchild->root, myself->root, MAX_PATH+1);
vchild->token = myself->token;
vchild->rootlen = myself->rootlen;
vchild->process_state |= PID_INITIALIZING | (myself->process_state & PID_USETTY);
sigproc_printf ("added pid %d to wait list, slot %d, winpid %p, handle %p",

View File

@ -36,6 +36,7 @@ details. */
#include "shared_info.h"
#include "perprocess.h"
#include "security.h"
#include "cygheap.h"
extern BOOL allow_ntsec;
@ -401,7 +402,7 @@ _open (const char *unix_path, int flags, ...)
set_errno (ENMFILE);
else if ((fh = fdtab.build_fhandler (fd, unix_path, NULL)) == NULL)
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);
res = -1;
@ -764,8 +765,8 @@ umask (mode_t mask)
{
mode_t oldmask;
oldmask = myself->umask;
myself->umask = mask & 0777;
oldmask = cygheap->umask;
cygheap->umask = mask & 0777;
return oldmask;
}
@ -1921,16 +1922,19 @@ chroot (const char *newroot)
set_errno (ENOTDIR);
goto done;
}
char buf[MAX_PATH + 1];
ret = cygwin_shared->mount.conv_to_posix_path (path.get_win32 (),
myself->root, 0);
buf, 0);
if (ret)
{
set_errno (ret);
goto done;
}
myself->rootlen = strlen (myself->root);
if (myself->root[myself->rootlen - 1] == '/')
myself->root[--myself->rootlen] = '\0';
cygheap->rootlen = strlen (cygheap->root);
if (cygheap->rootlen > 1 && buf[cygheap->rootlen - 1] == '/')
buf[--cygheap->rootlen] = '\0';
cygheap->root = (char *) crealloc (cygheap->root, cygheap->rootlen + 1);
strcpy (cygheap->root, buf);
ret = 0;
done: