File ksh93-fs3d.dif of Package ksh

2013-10-17 10:30:20 - werner@suse.de

Found by debugging with valgrind and environment variable LD_LIBRARY_PATH that
the mount() system call function from the glibc is used instead of a fs3d_mount()
function.  To avoid this make fs3d_mount() a weak symbol to be overloadable by
a shared library function and make the stub function return -1 for not configured
file system type.

--- src/lib/libast/misc/fs3d.c
+++ src/lib/libast/misc/fs3d.c	2013-10-17 10:30:20.000000000 +0000
@@ -28,6 +28,20 @@
  * only active for non-shared 3d library
  */
 
+#if defined(__linux__) && defined(__GNUC__)
+# if defined __USE_ISOC99
+#  define _cat_pragma(exp)	_Pragma(#exp)
+#  define _weak_pragma(exp)	_cat_pragma(weak name)
+# else
+#  define _weak_pragma(exp)
+# endif
+# define _declare(name,sym)	__extension__ extern __typeof__(sym) name
+# define weak_symbol(sym)	_weak_pragma(name) _declare(sym,sym) __attribute__((__weak__))
+# include <error.h>
+#else
+# define weak_symbol(sym)
+#endif
+
 #define mount	______mount
 
 #include <ast.h>
@@ -35,6 +49,7 @@
 #undef	mount
 
 #include <fs3d.h>
+weak_symbol(fs3d_mount);
 
 int
 fs3d(register int op)
@@ -102,11 +117,18 @@ fs3d(register int op)
  * user code that includes <fs3d.h> will have mount() mapped to fs3d_mount()
  * this restricts the various "standard" mount prototype conflicts to this spot
  * this means that code that includes <fs3d.h> cannot access the real mount
- * (at least without some additional macro hackery
+ * (at least without some additional macro hackery)
  */
 
 #undef	mount
-
+#if defined(__linux__) && defined(__GNUC__)
+int __attribute__((__noinline__))
+fs3d_mount(const char* source, char* target, int flags, void* data)
+{
+	errno = ENODEV;
+	return -1;
+}
+#else
 extern int	mount(const char*, char*, int, void*);
 
 int
@@ -114,3 +136,4 @@ fs3d_mount(const char* source, char* tar
 {
 	return mount(source, target, flags, data);
 }
+#endif