diff options
author | Christopher Faylor <me@cgf.cx> | 2001-09-16 02:56:58 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2001-09-16 02:56:58 +0000 |
commit | d59583993906b2232b995eb4ae5731f7b71384c3 (patch) | |
tree | cb7c886def41cc1ed0f48ca1c9bc88b0f15e77d6 /winsup/cygwin/net.cc | |
parent | 1d1c6baa7b6d235dec1d8b2a562561e80af4c620 (diff) | |
download | cygnal-d59583993906b2232b995eb4ae5731f7b71384c3.tar.gz cygnal-d59583993906b2232b995eb4ae5731f7b71384c3.tar.bz2 cygnal-d59583993906b2232b995eb4ae5731f7b71384c3.zip |
* net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure and
realign appropriately.
Diffstat (limited to 'winsup/cygwin/net.cc')
-rw-r--r-- | winsup/cygwin/net.cc | 20 |
1 files changed, 18 insertions, 2 deletions
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); |