fix
authorMiklos Szeredi <miklos@szeredi.hu>
Wed, 15 Feb 2006 14:25:17 +0000 (14:25 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Wed, 15 Feb 2006 14:25:17 +0000 (14:25 +0000)
ChangeLog
configure.in
lib/fuse.c
lib/fuse_i.h
lib/fuse_lowlevel.c

index 260c2cee5111c8118451ec0f56bd385aba69d985..3b2f2d966157817bfbcaf87c7b87b9887908ccad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-15  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Work around FreeBSD runtime linker "feature" which binds an old
+       version of a symbol to internal references if the symbol has more
+       than one version.  This resulted in infinite recursion in
+       fuse_lowlevel_new_compat25().
+
 2006-02-10  Csaba Henk <csaba.henk@creo.hu>
 
        * Refine clock_gettime() querying so that linker options
index f35cae265a340658942de886750d9bf6defc6cf3..e10226e50f971283e7f7f9e389d021077af00703 100644 (file)
@@ -66,12 +66,8 @@ AC_CHECK_MEMBERS([struct stat.st_atim])
 libfuse_libs=-lpthread
 LIBS=
 AC_SEARCH_LIBS(clock_gettime, [rt])
-rt_libs=$LIBS
-
-AC_SUBST(rt_libs)
+libfuse_libs="$libfuse_libs $LIBS"
 LIBS=
-
-libfuse_libs="$libfuse_libs $rt_libs"
 AC_SUBST(libfuse_libs)
 
 if test -z "$MOUNT_FUSE_PATH"; then
index b2a190494c87cd146e433b6afa6062ab522f6cb0..d070f4d86642917f8a5daa4fbfeceb080b20a3cf 100644 (file)
@@ -2014,7 +2014,8 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
             goto out_free;
     }
 
-    f->se = fuse_lowlevel_new(args, &fuse_path_ops, sizeof(fuse_path_ops), f);
+    f->se = fuse_lowlevel_new_common(args, &fuse_path_ops,
+                                     sizeof(fuse_path_ops), f);
     if (f->se == NULL)
         goto out_free;
 
index 79c3cbf287458fc905b2368d6d26f1ef33a18d37..e54509e20d5ae999e517100e6c1cac5ce24855a8 100644 (file)
@@ -10,6 +10,7 @@
 
 struct fuse_session;
 struct fuse_chan;
+struct fuse_lowlevel_ops;
 
 struct fuse_cmd {
     char *buf;
@@ -24,3 +25,7 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
                              size_t op_size, int compat);
 
 int fuse_sync_compat_args(struct fuse_args *args);
+
+struct fuse_session *fuse_lowlevel_new_common(struct fuse_args *args,
+                                       const struct fuse_lowlevel_ops *op,
+                                       size_t op_size, void *userdata);
index 13ddab96b5159d6b96954562bf17d4ca12471bb9..efcc2a71f08e20b90afe68046ca1e21e50315fe7 100644 (file)
@@ -989,7 +989,7 @@ static void fuse_ll_destroy(void *data)
     free(f);
 }
 
-struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
+struct fuse_session *fuse_lowlevel_new_common(struct fuse_args *args,
                                        const struct fuse_lowlevel_ops *op,
                                        size_t op_size, void *userdata)
 {
@@ -1034,6 +1034,20 @@ struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
     return NULL;
 }
 
+
+/*
+ * always call fuse_lowlevel_new_common() internally, to work around a
+ * bug in the FreeBSD runtime linker, which links the old version of a
+ * symbol to internal references.
+ */
+struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
+                                       const struct fuse_lowlevel_ops *op,
+                                       size_t op_size, void *userdata)
+{
+    return fuse_lowlevel_new_common(args, op, op_size, userdata);
+}
+
+
 #include "fuse_lowlevel_compat.h"
 
 #ifndef __FreeBSD__
@@ -1100,12 +1114,6 @@ struct fuse_session *fuse_lowlevel_new_compat(const char *opts,
     return se;
 }
 
-__asm__(".symver fuse_reply_statfs_compat,fuse_reply_statfs@FUSE_2.4");
-__asm__(".symver fuse_reply_open_compat,fuse_reply_open@FUSE_2.4");
-__asm__(".symver fuse_lowlevel_new_compat,fuse_lowlevel_new@FUSE_2.4");
-
-#endif /* __FreeBSD__ */
-
 struct fuse_ll_compat_conf {
     unsigned max_read;
     int set_max_read;
@@ -1138,6 +1146,20 @@ int fuse_sync_compat_args(struct fuse_args *args)
     return 0;
 }
 
+__asm__(".symver fuse_reply_statfs_compat,fuse_reply_statfs@FUSE_2.4");
+__asm__(".symver fuse_reply_open_compat,fuse_reply_open@FUSE_2.4");
+__asm__(".symver fuse_lowlevel_new_compat,fuse_lowlevel_new@FUSE_2.4");
+
+#else /* __FreeBSD__ */
+
+int fuse_sync_compat_args(struct fuse_args *args)
+{
+    (void) args;
+    return 0;
+}
+
+#endif /* __FreeBSD__ */
+
 struct fuse_session *fuse_lowlevel_new_compat25(struct fuse_args *args,
                         const struct fuse_lowlevel_ops_compat25 *op,
                         size_t op_size, void *userdata)
@@ -1145,9 +1167,9 @@ struct fuse_session *fuse_lowlevel_new_compat25(struct fuse_args *args,
     if (fuse_sync_compat_args(args) == -1)
         return NULL;
 
-    return fuse_lowlevel_new(args, (const struct fuse_lowlevel_ops *) op,
-                             op_size, userdata);
+    return fuse_lowlevel_new_common(args,
+                                    (const struct fuse_lowlevel_ops *) op,
+                                    op_size, userdata);
 }
 
-
 __asm__(".symver fuse_lowlevel_new_compat25,fuse_lowlevel_new@FUSE_2.5");