diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 34 | ||||
-rw-r--r-- | winsup/cygwin/Makefile.in | 14 | ||||
-rw-r--r-- | winsup/cygwin/child_info.h | 28 | ||||
-rwxr-xr-x | winsup/cygwin/cygmagic | 20 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 32 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/version.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/pinfo.cc | 19 | ||||
-rw-r--r-- | winsup/cygwin/shared.cc | 17 | ||||
-rw-r--r-- | winsup/cygwin/shared_info.h | 10 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/winsup.h | 2 |
11 files changed, 136 insertions, 48 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 0efb0ae0d..ecf7a06f4 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,37 @@ +2001-12-25 Christopher Faylor <cgf@redhat.com> + + * Makefile.in: Autogenerate some header files which provide magic + numbers. Force dependencies for files which depend on autogenerated + headers to ensure that they are always built. + * child_info.h (child_info): Add new fields to accommodate new magic + number header stuff. + * dcrt0.cc: Rely on "child_info_magic.h" to ensure that correct + child_info magic numbers are used. + (dll_crt0_1): Temporarily remove _cygwin_testing_magic test. + (_dll_crt0): Do more testing on magic numbers from fork_info structure. + Call "multiple_cygwin_problem" where appropriate. + (multiple_cygwin_problem): Rename from multiple_cygwin_die. Issue a + warning or die, as appropriate based on cygwin version/magic number + mismatch. + * pinfo.cc (pinfo::exit): Don't attempt to dereference `this' if it + doesn't exist. This can happen when a fatal error occurs early in + process initialization. + * shared.cc: Rely on "shared_info_magic.h" to accommodate that new + magic number header stuff. + (shared_info::initialize): Use new magic number stuff, for shared + region. + (memory_init): Ditto, for mount table. + * shared_info.h: Accomodate new magic number stuff for shared region + and mount table. + * sigproc.cc: Rely on "child_info_magic.h" to accommodate new magic + number header stuff. + (init_child_info): Initialize new fields in child_info) to accomodate + magic numbers. + * winsup.h: Rename multiple_cygwin_die to multiple_cygwin_problem. + * include/cygwin/version.h: Define macros for manipulating version + magic. + * cygmagic: New shell script for generating magic numbers. + 2001-12-20 Christopher Faylor <cgf@redhat.com> * include/cygwin/version.h: Bump API minor version for below changes. diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index 78ea72156..e7034ef65 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -51,7 +51,7 @@ CC:=@CC@ # FIXME: Which is it, CC or CC_FOR_TARGET? CC_FOR_TARGET:=$(CC) CFLAGS:=@CFLAGS@ -CFLAGS+=-MD -fbuiltin +CFLAGS+=-MMD -fbuiltin CXX:=@CXX@ CXXFLAGS:=@CXXFLAGS@ @@ -230,6 +230,16 @@ $(LIBGMON_A): $(GMON_OFILES) $(GMON_START) version.cc winver.o: winver_stamp @ : +shared_info_magic.h: cygmagic shared_info.h + /bin/sh ${word 1,$^} $@ $(CC) ${word 2,$^} MOUNT_MAGIC 'class mount_info' SHARED_MAGIC 'class shared_info' + +child_info_magic.h: cygmagic child_info.h + /bin/sh ${word 1,$^} $@ $(CC) ${word 2,$^} CHILD_INFO_MAGIC 'class child_info' + +dcrt0.o sigproc.o: child_info_magic.h + +shared.o: shared_info_magic.h + winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES) @echo "Making version.o and winver.o";\ $(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES) && \ @@ -240,8 +250,6 @@ cygrun.exe : cygrun.o $(LIB_NAME) $(w32api_lib)/libuser32.a \ $(w32api_lib)/libshell32.a $(w32api_lib)/libkernel32.a $(CC) -nodefaultlibs -o $@ $^ -# - Makefile: cygwin.din $(DEF_FILE): cygwin.din config.status diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index e744f5bcf..5b7f219a6 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -12,28 +12,32 @@ details. */ enum { - PROC_MAGIC = 0xaf12f000, - _PROC_EXEC = PROC_MAGIC + 2, - _PROC_SPAWN = PROC_MAGIC + 3, - _PROC_FORK = PROC_MAGIC + 4, // Newer versions provide stack - // location information + _PROC_EXEC, + _PROC_SPAWN, + _PROC_FORK }; -#define PROC_MAGIC_MASK 0xff00f000 -#define PROC_MAGIC_GENERIC 0xaf00f000 -#define PROC_MAGIC_VER_MASK 0x0ff0000 +#define OPROC_MAGIC_MASK 0xff00ff00 +#define OPROC_MAGIC_GENERIC 0xaf00f000 -#define PROC_EXEC (_PROC_EXEC + _cygwin_testing_magic) -#define PROC_SPAWN (_PROC_SPAWN + _cygwin_testing_magic) -#define PROC_FORK (_PROC_FORK + _cygwin_testing_magic) +#define PROC_MAGIC_GENERIC 0xaf00fa00 + +#define PROC_EXEC (_PROC_EXEC) +#define PROC_SPAWN (_PROC_SPAWN) +#define PROC_FORK (_PROC_FORK) #define EXEC_MAGIC_SIZE sizeof(child_info) + +#define CURR_CHILD_INFO_MAGIC 0xba17 + class child_info { public: DWORD zero[4]; // must be zeroed DWORD cb; // size of this record - DWORD type; // type of record + DWORD intro; // improbable string + unsigned short magic; // magic number unique to child_info + unsigned short type; // type of record, exec, spawn, fork int cygpid; // cygwin pid of child process HANDLE subproc_ready; // used for synchronization with parent HANDLE mount_h; diff --git a/winsup/cygwin/cygmagic b/winsup/cygwin/cygmagic new file mode 100755 index 000000000..17c74b496 --- /dev/null +++ b/winsup/cygwin/cygmagic @@ -0,0 +1,20 @@ +#!/bin/sh +file_magic=$1; shift +gcc=$1; shift +file=$1; shift +trap "rm -f /tmp/$$.magic" 0 1 2 15 +cat <<EOF > $file_magic +/* autogenerated - do not edit */ +#include "$file" +EOF +while [ -n "$1" ]; do + define=$1; shift + struct=$1; shift + sum=`$gcc -E $file | sed -n "/^$struct/,/^};/p" | sed -e 's/[ ]//g' -e '/^$/d' | sum | awk '{print "obase=16;\"0x\";", $1}' | bc | tr '[A-Z]' '[a-z]'` + 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 +*** WARNING WARNING WARNING WARNING WARNING ***" 1>&2 +done >> $file_magic +exit 0 diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 84754b250..a6a446f5e 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -30,7 +30,7 @@ details. */ #include "path.h" #include "dtable.h" #include "cygheap.h" -#include "child_info.h" +#include "child_info_magic.h" #include "perthread.h" #include "shared_info.h" #include "cygwin_version.h" @@ -585,7 +585,7 @@ dll_crt0_1 () if (child_proc_info) { - switch (child_proc_info->type - _cygwin_testing_magic) + switch (child_proc_info->type) { case _PROC_FORK: cygheap_fixup_in_child (child_proc_info, 0); @@ -826,7 +826,12 @@ _dll_crt0 () if (si.cbReserved2 >= EXEC_MAGIC_SIZE && memcmp (fork_info->zero, zeros, sizeof (zeros)) == 0) { - switch (fork_info->type - _cygwin_testing_magic) + if ((fork_info->intro & OPROC_MAGIC_MASK) == OPROC_MAGIC_GENERIC) + multiple_cygwin_problem ("proc", fork_info->intro, 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); + switch (fork_info->type) { case _PROC_FORK: user_data->forkee = fork_info->cygpid; @@ -841,10 +846,8 @@ _dll_crt0 () break; } default: - if (_cygwin_testing) - fork_info = NULL; - else if ((fork_info->type & PROC_MAGIC_MASK) == PROC_MAGIC_GENERIC) - multiple_cygwin_die (); + system_printf ("unknown exec type %d", fork_info->type); + fork_info = NULL; break; } } @@ -1020,14 +1023,19 @@ __api_fatal (const char *fmt, ...) } void -multiple_cygwin_die () +multiple_cygwin_problem (const char *what, unsigned magic_version, unsigned version) { - api_fatal ("\ + 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\ Search for cygwin1.dll using the Windows Start->Find/Search facility\n\ -and delete all but the most recent version. This will probably be\n\ -the one that resides in x:\\cygwin\\bin, where 'x' is the drive on which\n\ -you have installed the cygwin distribution.\n"); +and delete all but the most recent version. The most recent version *should*\n\ +reside in x:\\cygwin\\bin, where 'x' is the drive on which you have\n\ +installed the cygwin distribution.", what, magic_version, version); + + char buf[1024]; + if (!GetEnvironmentVariable ("CYGWIN_MISMATCH_OK", buf, sizeof (buf))) + system_printf ("%s magic number mismatch detected - %p/%p", what, magic_version, version); } #ifdef DEBUGGING diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 4ab6b3f7e..d24e64a3c 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -148,6 +148,8 @@ details. */ 48: Export "posix" regex functions */ + /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ + #define CYGWIN_VERSION_API_MAJOR 0 #define CYGWIN_VERSION_API_MINOR 48 @@ -214,3 +216,5 @@ details. */ cygwin_internal (CW_GETVERSIONINFO). */ +#define CYGWIN_VERSION_MAGIC(a, b) ((unsigned) (((unsigned short) a) | (unsigned short) b)) +#define CYGWIN_VERSION_MAGIC_VERSION(a) ((unsigned) ((unsigned)a & 0xffff)) diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index ffd3d4ec6..43e3c5aae 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -117,14 +117,17 @@ pinfo_init (char **envp, int envc) void _pinfo::exit (UINT n, bool norecord) { - if (!norecord) - process_state = PID_EXITED; - - /* FIXME: There is a potential race between an execed process and its - parent here. I hated to add a mutex just for this, though. */ - struct rusage r; - fill_rusage (&r, hMainProc); - add_rusage (&rusage_self, &r); + if (this) + { + if (!norecord) + process_state = PID_EXITED; + + /* FIXME: There is a potential race between an execed process and its + parent here. I hated to add a mutex just for this, though. */ + struct rusage r; + fill_rusage (&r, hMainProc); + add_rusage (&rusage_self, &r); + } sigproc_printf ("Calling ExitProcess %d", n); ExitProcess (n); diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc index ab748e5c1..db99b0737 100644 --- a/winsup/cygwin/shared.cc +++ b/winsup/cygwin/shared.cc @@ -25,13 +25,10 @@ details. */ #include "cygerrno.h" #include "cygheap.h" #include "heap.h" -#include "shared_info.h" +#include "shared_info_magic.h" #include "registry.h" #include "cygwin_version.h" -#define SHAREDVER (unsigned)(cygwin_version.api_major << 16 | \ - cygwin_version.api_minor) - shared_info NO_COPY *cygwin_shared = NULL; mount_info NO_COPY *mount_table = NULL; HANDLE cygwin_mount_h; @@ -108,8 +105,8 @@ shared_info::initialize () { if (inited) { - if (inited != SHAREDVER) - multiple_cygwin_die (); + if (inited != SHARED_VERSION_MAGIC) + multiple_cygwin_problem ("shared", inited, SHARED_VERSION); return; } @@ -118,7 +115,7 @@ shared_info::initialize () /* Initialize tty table. */ tty.init (); - inited = SHAREDVER; + inited = SHARED_VERSION_MAGIC; } void __stdcall @@ -163,12 +160,12 @@ memory_init () /* Initialize the Cygwin per-user mount table, if necessary */ if (!mount_table->version) { - mount_table->version = MOUNT_VERSION; + mount_table->version = MOUNT_VERSION_MAGIC; debug_printf ("initializing mount table"); mount_table->init (); /* Initialize the mount table. */ } - else if (mount_table->version != MOUNT_VERSION) - multiple_cygwin_die (); + else if (mount_table->version != MOUNT_VERSION_MAGIC) + multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION); } diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h index 3b8bbe7e3..2d3055491 100644 --- a/winsup/cygwin/shared_info.h +++ b/winsup/cygwin/shared_info.h @@ -40,7 +40,9 @@ class mount_item scheme should be satisfactory for a long while yet. */ #define MAX_MOUNTS 30 -#define MOUNT_VERSION 27 // increment when mount table changes +#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 class reg_key; class mount_info @@ -128,6 +130,12 @@ public: /******** Shared Info ********/ /* Data accessible to all tasks */ +#define SHARED_VERSION (unsigned)(cygwin_version.api_major << 8 | \ + cygwin_version.api_minor) +#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION) + +#define CURR_SHARED_MAGIC 0x6f6e + class shared_info { DWORD inited; diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index fdc7a6fef..6527313ec 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -26,7 +26,7 @@ details. */ #include "path.h" #include "dtable.h" #include "cygheap.h" -#include "child_info.h" +#include "child_info_magic.h" #define NEED_VFORK #include "perthread.h" #include <assert.h> @@ -858,6 +858,8 @@ init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready) { memset (ch, 0, sizeof *ch); ch->cb = sizeof *ch; + ch->intro = PROC_MAGIC_GENERIC; + ch->magic = CHILD_INFO_MAGIC; ch->type = chtype; ch->cygpid = pid; ch->subproc_ready = subproc_ready; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 93eae3397..d977d6214 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -217,7 +217,7 @@ extern bool wsock_started; extern "C" void __api_fatal (const char *, ...) __attribute__ ((noreturn)); extern "C" int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/; extern "C" int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/; -extern void multiple_cygwin_die () __attribute__ ((noreturn)); +extern void multiple_cygwin_problem (const char *, unsigned, unsigned); extern "C" void __malloc_lock (struct _reent *); extern "C" void __malloc_unlock (struct _reent *); |