Fix UNIX_PATH_MAX on NetBSD.
authorAndre Noll <maan@systemlinux.org>
Mon, 19 Sep 2011 17:12:40 +0000 (19:12 +0200)
committerAndre Noll <maan@systemlinux.org>
Wed, 28 Sep 2011 21:20:36 +0000 (23:20 +0200)
UNIX_PATH_MAX was hardcoded to 108 for all systems. However, at
least on 32 bit NetBSD the size of the sun_path buffer is only
104 bytes. This resulted in a very nasty bug caused by a memset()
overwriting 4 bytes on the stack.

Fix this by calculating the correct value at compile time.

net.h

diff --git a/net.h b/net.h
index 80f5794..79c5994 100644 (file)
--- a/net.h
+++ b/net.h
@@ -8,13 +8,15 @@
 /** \file net.h exported symbols from net.c */
 
 /**
- * the buffer size of the sun_path component of struct sockaddr_un
+ * The buffer size of the sun_path component of struct sockaddr_un.
  *
- * While glibc doesn't define \p UNIX_PATH_MAX, it
- * documents it has being limited to 108 bytes.
+ * While glibc doesn't define \p UNIX_PATH_MAX, it documents it has being
+ * limited to 108 bytes. On NetBSD it is only 104 bytes though. We trust \p
+ * UNIX_PATH_MAX if it is defined and use the size of the ->sun_path member
+ * otherwise. This should be safe everywhere.
  */
 #ifndef UNIX_PATH_MAX
-#define UNIX_PATH_MAX 108
+#define UNIX_PATH_MAX (sizeof(((struct sockaddr_un *)0)->sun_path))
 #endif
 
 /* Userland defines for Linux DCCP support. */