summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2001-09-16 02:56:58 +0000
committerChristopher Faylor <me@cgf.cx>2001-09-16 02:56:58 +0000
commitd59583993906b2232b995eb4ae5731f7b71384c3 (patch)
treecb7c886def41cc1ed0f48ca1c9bc88b0f15e77d6
parent1d1c6baa7b6d235dec1d8b2a562561e80af4c620 (diff)
downloadcygnal-d59583993906b2232b995eb4ae5731f7b71384c3.tar.gz
cygnal-d59583993906b2232b995eb4ae5731f7b71384c3.tar.bz2
cygnal-d59583993906b2232b995eb4ae5731f7b71384c3.zip
* net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure and
realign appropriately.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/net.cc20
2 files changed, 23 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f50707d71..ff8cc18bd 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+Sat Sep 15 22:54:49 2001 Christopher Faylor <cgf@cygnus.com>
+
+ * net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure
+ and realign appropriately.
+
Sat Sep 15 00:28:40 2001 Christopher Faylor <cgf@cygnus.com>
* Makefile.in: Generate libcygwin.a during the link pass rather than as
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index c53613abc..c310c78b3 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -932,6 +932,15 @@ free_servent_ptr (struct servent *&p)
}
}
+#pragma pack(push,2)
+struct pservent
+{
+ char *s_name;
+ char **s_aliases;
+ short s_port;
+ char *s_proto;
+};
+#pragma pack(pop)
static struct servent *
dup_servent_ptr (struct servent *src)
{
@@ -947,10 +956,17 @@ dup_servent_ptr (struct servent *src)
dst->s_port = src->s_port;
if (src->s_name && !(dst->s_name = strdup (src->s_name)))
goto out;
- if (src->s_proto && !(dst->s_proto = strdup (src->s_proto)))
- goto out;
if (src->s_aliases && !(dst->s_aliases = dup_char_list (src->s_aliases)))
goto out;
+ char *s_proto;
+ if (IsBadReadPtr (src->s_proto, sizeof (src->s_proto))
+ && !IsBadReadPtr (((pservent *) src)->s_proto, sizeof (src->s_proto)))
+ s_proto = ((pservent *)src)->s_proto;
+ else
+ s_proto = src->s_proto;
+
+ if (s_proto && !(dst->s_proto = strdup (s_proto)))
+ goto out;
debug_printf ("servent: copied %s", dst->s_name);