forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Bump EAPI to 7. Fix segfault, use slotted sys-fs/fuse dependency Committed straight to stable Signed-off-by: Sergey Popov <[email protected]> Closes: https://bugs.gentoo.org/570992 Closes: https://bugs.gentoo.org/673644 Package-Manager: Portage-2.3.49, Repoman-2.3.10
- Loading branch information
Showing
3 changed files
with
221 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
Patch backported from | ||
https://github.com/vdudouyt/mhddfs-nosegfault | ||
|
||
Thanks to Gabor Kovari <[email protected]> | ||
|
||
--- a/src/main.c 2012-06-17 16:09:56.000000000 +0200 | ||
+++ b/src/main.c 2015-12-21 16:32:29.000000000 +0100 | ||
@@ -33,6 +33,13 @@ | ||
#include <sys/time.h> | ||
#include <utime.h> | ||
|
||
+#include <execinfo.h> | ||
+#include <signal.h> | ||
+#include <unistd.h> | ||
+ | ||
+#include <glib.h> | ||
+#include <sys/resource.h> | ||
+ | ||
#ifndef WITHOUT_XATTR | ||
#include <attr/xattr.h> | ||
#endif | ||
@@ -42,7 +49,21 @@ | ||
|
||
#include "debug.h" | ||
|
||
-#include <uthash.h> | ||
+void save_backtrace(int sig) | ||
+{ | ||
+ void *array[10]; | ||
+ size_t size; | ||
+ | ||
+ // get void*'s for all entries on the stack | ||
+ size = backtrace(array, 10); | ||
+ | ||
+ // print out all the frames to stderr | ||
+ fprintf(stderr, "Error: signal %d\n", sig); | ||
+ FILE *log = fopen("/tmp/mhddfs_backtrace.log", "w"); | ||
+ backtrace_symbols_fd(array, size, fileno(log)); | ||
+ fclose(log); | ||
+ exit(1); | ||
+} | ||
|
||
// getattr | ||
static int mhdd_stat(const char *file_name, struct stat *buf) | ||
@@ -161,16 +182,13 @@ | ||
mhdd_debug(MHDD_MSG, "mhdd_readdir: %s\n", dirname); | ||
char **dirs = (char **) calloc(mhdd.cdirs+1, sizeof(char *)); | ||
|
||
+ struct stat st; | ||
+ | ||
typedef struct dir_item { | ||
char *name; | ||
struct stat *st; | ||
- UT_hash_handle hh; | ||
} dir_item; | ||
|
||
- dir_item * items_ht = NULL; | ||
- | ||
- | ||
- struct stat st; | ||
|
||
// find all dirs | ||
for(i = j = found = 0; i<mhdd.cdirs; i++) { | ||
@@ -194,6 +212,8 @@ | ||
return -errno; | ||
} | ||
|
||
+ GHashTable* hash = g_hash_table_new(g_str_hash, g_str_equal); | ||
+ | ||
// read directories | ||
for (i = 0; dirs[i]; i++) { | ||
struct dirent *de; | ||
@@ -204,51 +224,43 @@ | ||
while((de = readdir(dh))) { | ||
// find dups | ||
|
||
- struct dir_item *prev; | ||
- | ||
- HASH_FIND_STR(items_ht, de->d_name, prev); | ||
- | ||
- if (prev) { | ||
+ if(g_hash_table_lookup(hash, de->d_name)) | ||
+ { | ||
continue; | ||
} | ||
|
||
// add item | ||
char *object_name = create_path(dirs[i], de->d_name); | ||
- struct dir_item *new_item = | ||
- calloc(1, sizeof(struct dir_item)); | ||
+ struct dir_item *new_item = calloc(1, sizeof(struct dir_item)); | ||
|
||
new_item->name = strdup(de->d_name); | ||
new_item->st = calloc(1, sizeof(struct stat)); | ||
lstat(object_name, new_item->st); | ||
|
||
- HASH_ADD_KEYPTR( | ||
- hh, | ||
- items_ht, | ||
- new_item->name, | ||
- strlen(new_item->name), | ||
- new_item | ||
- ); | ||
+ g_hash_table_insert(hash, new_item->name, new_item); | ||
free(object_name); | ||
} | ||
|
||
closedir(dh); | ||
} | ||
|
||
- dir_item *item, *tmp; | ||
- | ||
- // fill list | ||
- HASH_ITER(hh, items_ht, item, tmp) { | ||
- if (filler(buf, item->name, item->st, 0)) | ||
- break; | ||
- } | ||
+ dir_item *item; | ||
|
||
- // free memory | ||
- HASH_ITER(hh, items_ht, item, tmp) { | ||
+ gpointer key, value; | ||
+ GHashTableIter iter; | ||
+ g_hash_table_iter_init(&iter, hash); | ||
+ | ||
+ while(g_hash_table_iter_next (&iter, &key, &value)) | ||
+ { | ||
+ item = (dir_item*) value; | ||
+ int result = filler(buf, item->name, item->st, 0); | ||
free(item->name); | ||
free(item->st); | ||
free(item); | ||
+ if(result) break; | ||
} | ||
- HASH_CLEAR(hh, items_ht); | ||
+ | ||
+ g_hash_table_destroy(hash); | ||
|
||
for (i = 0; dirs[i]; i++) | ||
free(dirs[i]); | ||
@@ -1008,6 +1020,19 @@ | ||
} | ||
#endif | ||
|
||
+static void limits_init() | ||
+{ | ||
+ struct rlimit limit; | ||
+ limit.rlim_cur = 512000; | ||
+ limit.rlim_max = 512000; | ||
+ | ||
+ if(setrlimit(RLIMIT_NOFILE, &limit) != 0) | ||
+ { | ||
+ perror("setrlimit() failed"); | ||
+ exit(-1); | ||
+ } | ||
+} | ||
+ | ||
// functions links | ||
static struct fuse_operations mhdd_oper = { | ||
.getattr = mhdd_stat, | ||
@@ -1048,5 +1073,7 @@ | ||
mhdd_debug_init(); | ||
struct fuse_args *args = parse_options(argc, argv); | ||
flist_init(); | ||
+ limits_init(); | ||
+ signal(SIGSEGV, save_backtrace); | ||
return fuse_main(args->argc, args->argv, &mhdd_oper, 0); | ||
} | ||
--- a/src/usage.c 2012-06-17 16:09:56.000000000 +0200 | ||
+++ b/src/usage.c 2015-12-21 16:32:29.000000000 +0100 | ||
@@ -25,6 +25,7 @@ | ||
"\n" | ||
"Multi-hdd FUSE filesystem\n" | ||
" Copyright (C) 2008, Dmitry E. Oboukhov <[email protected]>\n" | ||
+ " Copyright (C) 2015, Valentin Dudouyt <[email protected]>\n" | ||
"\n" | ||
"Usage:\n" | ||
" mhddfs dir1,dir2.. mountpoint [ -o OPTIONS ]\n" | ||
--- a/Makefile 2016-01-05 16:45:10.184105001 +0100 | ||
+++ b/Makefile 2015-12-21 16:32:29.000000000 +0100 | ||
@@ -22,13 +22,13 @@ | ||
|
||
TARGET = mhddfs | ||
|
||
-CFLAGS += -Wall $(shell pkg-config fuse --cflags) \ | ||
- -DFUSE_USE_VERSION=26 -MMD | ||
+CFLAGS = -Wall $(shell pkg-config fuse glib-2.0 --cflags) \ | ||
+ -DFUSE_USE_VERSION=26 -MMD -g -rdynamic -O0 | ||
ifdef WITHOUT_XATTR | ||
CFLAGS += -DWITHOUT_XATTR | ||
endif | ||
|
||
-LIBS = $(shell pkg-config fuse --libs) | ||
+LDFLAGS = $(shell pkg-config fuse glib-2.0 --libs) | ||
|
||
FORTAR = src COPYING LICENSE README Makefile \ | ||
README.ru.UTF-8 ChangeLog mhddfs.1 \ | ||
@@ -53,7 +53,7 @@ | ||
ifeq ($(DEBVERSION), $(VERSION)) | ||
all: $(TARGET) | ||
else | ||
-all: update_version $(TARGET) | ||
+all: $(TARGET) | ||
endif | ||
|
||
update_version: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters