Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2018-03-01 20:14:23 +0300
committerCorinna Vinschen <corinna@vinschen.de>2018-03-01 20:14:23 +0300
commitdc3928fc75550422306f9630d34430634767d87a (patch)
tree24261aace215d1945783405483c351a1f633bc14 /winsup
parentaa467e6e3305a63a06161374d3ebb0c56f6c6193 (diff)
Cygwin: convert sun_name_t into class
Add constructors and new/delete operators to make sure sun_name_t objects are allocated on the cygheap. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/fhandler.h19
-rw-r--r--winsup/cygwin/fhandler_socket_unix.cc16
2 files changed, 22 insertions, 13 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 1d4e681c4..cfd93d2c8 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -817,8 +817,9 @@ class fhandler_socket_local: public fhandler_socket_wsock
}
};
-struct sun_name_t
+class sun_name_t
{
+ public:
__socklen_t un_len;
union
{
@@ -826,6 +827,22 @@ struct sun_name_t
/* Allows 108 bytes sun_path plus trailing NUL */
char _nul[sizeof (struct sockaddr_un) + 1];
};
+ sun_name_t ()
+ {
+ un_len = 0;
+ un.sun_family = 0;
+ _nul[sizeof (struct sockaddr_un)] = '\0';
+ }
+ sun_name_t (const struct sockaddr *name, __socklen_t namelen)
+ {
+ un_len = namelen < (__socklen_t) sizeof un ? namelen : sizeof un;
+ memcpy (&un, name, un_len);
+ _nul[sizeof (struct sockaddr_un)] = '\0';
+ }
+
+ void *operator new (size_t) __attribute__ ((nothrow))
+ { return cmalloc_abort (HEAP_FHANDLER, sizeof (sun_name_t)); }
+ void operator delete (void *p) {cfree (p);}
};
class fhandler_socket_unix : public fhandler_socket
diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc
index 1d8c4c4cd..506befc51 100644
--- a/winsup/cygwin/fhandler_socket_unix.cc
+++ b/winsup/cygwin/fhandler_socket_unix.cc
@@ -158,9 +158,9 @@ fhandler_socket_unix::fhandler_socket_unix () :
fhandler_socket_unix::~fhandler_socket_unix ()
{
if (sun_path)
- cfree (sun_path);
+ delete sun_path;
if (peer_sun_path)
- cfree (peer_sun_path);
+ delete peer_sun_path;
}
void
@@ -168,11 +168,7 @@ fhandler_socket_unix::set_sun_path (struct sockaddr_un *un, socklen_t unlen)
{
if (!un)
sun_path = NULL;
- sun_path = (struct sun_name_t *) cmalloc_abort (HEAP_FHANDLER,
- sizeof *sun_path);
- sun_path->un_len = unlen;
- memcpy (&sun_path->un, un, sizeof (*un));
- sun_path->_nul[sizeof (struct sockaddr_un)] = '\0';
+ sun_path = new sun_name_t ((const struct sockaddr *) un, unlen);
}
void
@@ -181,11 +177,7 @@ fhandler_socket_unix::set_peer_sun_path (struct sockaddr_un *un,
{
if (!un)
peer_sun_path = NULL;
- peer_sun_path = (struct sun_name_t *) cmalloc_abort (HEAP_FHANDLER,
- sizeof *peer_sun_path);
- peer_sun_path->un_len = unlen;
- memcpy (&peer_sun_path->un, un, sizeof (*un));
- peer_sun_path->_nul[sizeof (struct sockaddr_un)] = '\0';
+ peer_sun_path = new sun_name_t ((const struct sockaddr *) un, unlen);
}
void