* dcrt0.cc (_dll_crt0): Check for changes in child_info size.
(multiple_cygwin_problem): Avoid "proc" errors when testing. Just assume new
cygwin proc.
* shared_info.h (mount_info): Add 'cb' element for sanity checks.
(shared_info): Ditto.
* child_info.h (child_info): Add fhandler_union_size element for sanity
checking.
* shared.cc (open_shared): Detect shared region size mismatch between parent
and child.
(shared_info::initialize): Detect shared region size mismatch with expectation.
(memory_Init): Ditto.
* sigproc.cc (init_child_info): Correctly set cb in passed structure.
* shared.cc (open_shared):
2001-12-26 Christopher Faylor <cgf@redhat.com>
+ * cygmagic: Add define name to warning.
+ * dcrt0.cc (_dll_crt0): Check for changes in child_info size.
+ (multiple_cygwin_problem): Avoid "proc" errors when testing. Just
+ assume new cygwin proc.
+ * shared_info.h (mount_info): Add 'cb' element for sanity checks.
+ (shared_info): Ditto.
+ * child_info.h (child_info): Add fhandler_union_size element for sanity
+ checking.
+ * shared.cc (open_shared): Detect shared region size mismatch between
+ parent and child.
+ (shared_info::initialize): Detect shared region size mismatch with
+ expectation.
+ (memory_Init): Ditto.
+ * sigproc.cc (init_child_info): Correctly set cb in passed structure.
+ * shared.cc (open_shared):
+
+2001-12-26 Christopher Faylor <cgf@redhat.com>
+
* include/getopt.h: Protect a declaratin.
2001-12-26 Robert Collins <rbtcollins@hotmail.com>
#define EXEC_MAGIC_SIZE sizeof(child_info)
-#define CURR_CHILD_INFO_MAGIC 0xba17
+#define CURR_CHILD_INFO_MAGIC 0x8b3c
/* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between
init_cygheap *cygheap;
void *cygheap_max;
HANDLE cygheap_h;
+ unsigned fhandler_union_cb;
};
class child_info_fork: public child_info
echo "#define $define $sum"
curr=`sed -n "s/^#[ ]*define CURR_$define[ ][ ]*\([^ ][^ ]*\)/\1/p" $file`
[ "$curr" == "$sum" ] || echo "*** WARNING WARNING WARNING WARNING WARNING ***
-*** $file: magic number changed old $curr != new $sum
+*** $file: magic number for $define changed old $curr != new $sum
*** WARNING WARNING WARNING WARNING WARNING ***" 1>&2
done >> $file_magic
exit 0
else if (fork_info->intro == PROC_MAGIC_GENERIC
&& fork_info->magic != CHILD_INFO_MAGIC)
multiple_cygwin_problem ("proc", fork_info->magic, CHILD_INFO_MAGIC);
+ unsigned should_be_cb = 0;
switch (fork_info->type)
{
case _PROC_FORK:
user_data->forkee = fork_info->cygpid;
+ should_be_cb = sizeof (child_info_fork);
case _PROC_SPAWN:
if (fork_info->pppid_handle)
CloseHandle (fork_info->pppid_handle);
case _PROC_EXEC:
- {
- child_proc_info = fork_info;
- cygwin_mount_h = child_proc_info->mount_h;
- mypid = child_proc_info->cygpid;
- break;
- }
+ if (!should_be_cb)
+ should_be_cb = sizeof (child_info);
+ if (should_be_cb != fork_info->cb)
+ multiple_cygwin_problem ("proc size", fork_info->cb, should_be_cb);
+ else if (sizeof (fhandler_union) != fork_info->fhandler_union_cb)
+ multiple_cygwin_problem ("fhandler size", fork_info->fhandler_union_cb, sizeof (fhandler_union));
+ else
+ {
+ child_proc_info = fork_info;
+ cygwin_mount_h = child_proc_info->mount_h;
+ mypid = child_proc_info->cygpid;
+ break;
+ }
default:
system_printf ("unknown exec type %d", fork_info->type);
fork_info = NULL;
void
multiple_cygwin_problem (const char *what, unsigned magic_version, unsigned version)
{
+ if (_cygwin_testing && strstr (what, "proc"))
+ {
+ fork_info = NULL;
+ return;
+ }
if (CYGWIN_VERSION_MAGIC_VERSION (magic_version) != version)
api_fatal ("%s version mismatch detected - %p/%p.\n\
You have multiple copies of cygwin1.dll on your system.\n\
void
shared_info::initialize ()
{
- if (inited)
+ if (version)
{
- if (inited != SHARED_VERSION_MAGIC)
- multiple_cygwin_problem ("shared", inited, SHARED_VERSION);
+ if (version != SHARED_VERSION_MAGIC)
+ multiple_cygwin_problem ("shared", version, SHARED_VERSION);
+ else if (cb != SHARED_INFO_CB)
+ multiple_cygwin_problem ("shared size", cb, SHARED_INFO_CB);
return;
}
/* Initialize tty table. */
tty.init ();
- inited = SHARED_VERSION_MAGIC;
+ version = SHARED_VERSION_MAGIC;
+ cb = sizeof (*this);
+ if (cb != SHARED_INFO_CB)
+ system_printf ("size of shared memory region changed from %u to %u",
+ SHARED_INFO_CB, cb);
}
void __stdcall
{
mount_table->version = MOUNT_VERSION_MAGIC;
debug_printf ("initializing mount table");
+ mount_table->cb = sizeof (*mount_table);
+ if (mount_table->cb != MOUNT_INFO_CB)
+ system_printf ("size of mount table region changed from %u to %u",
+ MOUNT_INFO_CB, mount_table->cb);
mount_table->init (); /* Initialize the mount table. */
}
else if (mount_table->version != MOUNT_VERSION_MAGIC)
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
+ else if (mount_table->cb != MOUNT_INFO_CB)
+ multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
}
public:
/* FIXME: Nasty static allocation. Need to have a heap in the shared
area [with the user being able to configure at runtime the max size]. */
-
/* Win32-style mounted partition source ("C:\foo\bar").
native_path[0] == 0 for unused entries. */
char native_path[MAX_PATH];
#define MOUNT_VERSION 27 // increment when mount table changes and
#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION)
-#define CURR_MOUNT_MAGIC 0xfe35
+#define CURR_MOUNT_MAGIC 0x41e0
+#define MOUNT_INFO_CB 16488
class reg_key;
{
public:
DWORD version;
+ unsigned cb;
DWORD sys_mount_table_counter;
int nmounts;
mount_item mount[MAX_MOUNTS];
cygwin_version.api_minor)
#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION)
-#define CURR_SHARED_MAGIC 0x6f6e
+#define SHARED_INFO_CB 47112
+
+#define CURR_SHARED_MAGIC 0x88e
/* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between
different cygwin versions. */
class shared_info
{
- DWORD inited;
+ DWORD version;
+ DWORD cb;
public:
int heap_chunk_in_mb;
DWORD sys_mount_table_counter;
init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
{
memset (ch, 0, sizeof *ch);
- ch->cb = sizeof *ch;
+ ch->cb = chtype == PROC_FORK ? sizeof (child_info_fork) : sizeof (child_info);
ch->intro = PROC_MAGIC_GENERIC;
ch->magic = CHILD_INFO_MAGIC;
ch->type = chtype;
ch->cygpid = pid;
ch->subproc_ready = subproc_ready;
ch->pppid_handle = myself->ppid_handle;
+ ch->fhandler_union_cb = sizeof (fhandler_union);
}
/* Check the state of all of our children to see if any are stopped or