aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2001-08-24 06:57:53 +0000
committerCorinna Vinschen <corinna@vinschen.de>2001-08-24 06:57:53 +0000
commit5d0fe6351a1979bbfe6665ccb67376e076d68eec (patch)
treea6908275e2ec087eedabd14f5bb508e873d74480 /winsup
parent56d5caaa850a9d80f3ced38169cc96dce59f4fea (diff)
downloadnewlib-5d0fe6351a1979bbfe6665ccb67376e076d68eec.zip
newlib-5d0fe6351a1979bbfe6665ccb67376e076d68eec.tar.gz
newlib-5d0fe6351a1979bbfe6665ccb67376e076d68eec.tar.bz2
* net.cc (free_addr_list): Add define for symmetry.
(free_hostent_ptr): Use free_addr_list to free h_addr_list element. (dup_addr_list): New static function. (dup_hostent_ptr): Use dup_addr_list instead of dup_char_list in order to handle embedded null characters.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog11
-rw-r--r--winsup/cygwin/net.cc26
2 files changed, 35 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index cb19cbb..87c7c07 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,14 @@
+Fri Aug 24 8:54:00 2001 Corinna Vinschen <corinna@vinschen.de>
+
+ * net.cc (free_addr_list): Add define for symmetry.
+ (free_hostent_ptr): Use free_addr_list to free h_addr_list element.
+
+Thu Aug 23 16:00:09 2001 Jason Tishler <jason@tishler.net>
+
+ * net.cc (dup_addr_list): New static function.
+ (dup_hostent_ptr): Use dup_addr_list instead of dup_char_list in order
+ to handle embedded null characters.
+
Wed Aug 22 22:23:14 2001 Christopher Faylor <cgf@cygnus.com>
* dtable.cc (dtable::dup2): Allow extension of fd table by dup2.
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index 19063e9..b9faa1b 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -409,6 +409,27 @@ dup_char_list (char **src)
return dst;
}
+#define free_addr_list(addr_list) free_char_list (addr_list)
+
+static char **
+dup_addr_list (char **src, unsigned int size)
+{
+ char **dst;
+ int cnt = 0;
+
+ for (char **cl = src; *cl; ++cl)
+ ++cnt;
+ if (!(dst = (char **) calloc (cnt + 1, sizeof *dst)))
+ return NULL;
+ while (cnt-- > 0)
+ {
+ if (!(dst[cnt] = (char *) malloc(size)))
+ return NULL;
+ memcpy(dst[cnt], src[cnt], size);
+ }
+ return dst;
+}
+
static void
free_protoent_ptr (struct protoent *&p)
{
@@ -998,7 +1019,7 @@ free_hostent_ptr (struct hostent *&p)
if (p->h_name)
free ((void *)p->h_name);
free_char_list (p->h_aliases);
- free_char_list (p->h_addr_list);
+ free_addr_list (p->h_addr_list);
p = NULL;
}
}
@@ -1021,7 +1042,8 @@ dup_hostent_ptr (struct hostent *src)
goto out;
if (src->h_aliases && !(dst->h_aliases = dup_char_list (src->h_aliases)))
goto out;
- if (src->h_addr_list && !(dst->h_addr_list = dup_char_list(src->h_addr_list)))
+ if (src->h_addr_list
+ && !(dst->h_addr_list = dup_addr_list(src->h_addr_list, src->h_length)))
goto out;
debug_printf ("hostent: copied %s", dst->h_name);