]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix runtime LSAN/ASAN error in command.c
authorJorge Pereira <jpereiran@gmail.com>
Thu, 23 Mar 2023 00:10:20 +0000 (21:10 -0300)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 23 Mar 2023 14:27:41 +0000 (10:27 -0400)
Such error:

src/main/command.c:185:12: runtime error: member access within null
pointer of type 'struct sockaddr_un'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
src/main/command.c:185:12 in

src/include/socket.h [new file with mode: 0644]
src/lib/socket.c
src/main/command.c

diff --git a/src/include/socket.h b/src/include/socket.h
new file mode 100644 (file)
index 0000000..821c2a0
--- /dev/null
@@ -0,0 +1,53 @@
+#pragma once
+
+/*
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or (at
+ *   your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/** Functions for establishing and managing low level sockets
+ *
+ * @file src/include/socket.h
+ *
+ * @author Arran Cudbard-Bell (a.cudbardb@freeradius.org)
+ * @author Alan DeKok (aland@freeradius.org)
+ *
+ * @copyright 2015 The FreeRADIUS project
+ */
+RCSIDH(socket_h, "$Id$")
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <freeradius-devel/build.h>
+#include <freeradius-devel/missing.h>
+
+#ifdef HAVE_SYS_UN_H
+#  include <sys/un.h>
+/*
+ *  The linux headers define the macro as:
+ *
+ * # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path)        \
+ *                      + strlen ((ptr)->sun_path))
+ *
+ * Which trips UBSAN, because it sees an operation on a NULL pointer.
+ */
+#  undef SUN_LEN
+#  define SUN_LEN(su)  (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
+
+#ifdef __cplusplus
+}
+#endif
index 3c88b78f9f00b188267ab16ad88a71d1663a5ab2..970f4f495e967891976df2a97a028517e8a8eba3 100644 (file)
  *
  * @copyright 2015 The FreeRADIUS project
  */
- #include <freeradius-devel/libradius.h>
+#include <freeradius-devel/libradius.h>
+#include <freeradius-devel/socket.h>
 
 #ifdef HAVE_SYS_UN_H
-#  include <sys/un.h>
-#  ifndef SUN_LEN
-#    define SUN_LEN(su)  (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
-#  endif
-
 /** Open a Unix socket
  *
  * @note If the file doesn't exist then errno will be set to ENOENT.
index 12d1afdfdb1a8c675526f29a5fd2c5336f2484f5..988f43bb02451d9ad744d23bc60fac69f2a92e13 100644 (file)
 #include <freeradius-devel/md5.h>
 #include <freeradius-devel/channel.h>
 #include <freeradius-devel/connection.h>
+#include <freeradius-devel/socket.h>
 
 #include <libgen.h>
 #ifdef HAVE_INTTYPES_H
 #include <inttypes.h>
 #endif
 
-#ifdef HAVE_SYS_UN_H
-#include <sys/un.h>
-#ifndef SUN_LEN
-#define SUN_LEN(su)  (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
-#endif
-#endif
-
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif