aboutsummaryrefslogtreecommitdiffstats
path: root/testing/moosefs/moosefs-cs-segfault.patch
blob: 3eedb3e869d6cd2bacda9eac19fd498ddda95121 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
From 7313493f319a2e18f75e583070ba8a480bc9709c Mon Sep 17 00:00:00 2001
From: Jakub Kruszona-Zawadzki <acid@moosefs.com>
Date: Mon, 17 Feb 2020 13:01:54 +0100
Subject: [PATCH] (cs) added protections against segfaults (issue #342)

---
 NEWS                         |  4 ++++
 mfschunkserver/hddspacemgr.c | 19 +++++++++++++------
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/NEWS b/NEWS
index f40f7eb..f0d255c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,9 @@
 This file lists noteworthy changes in MooseFS.
 
+* MooseFS 3.0.111-1 (WIP)
+
+  - (cs) added protections against segfaults (issue #342)
+
 * MooseFS 3.0.110-1 (2020-02-12)
 
   - (cs) fixed bug that may lead to creating much more chunks in one subfolder (issues #319,#326)
diff --git a/mfschunkserver/hddspacemgr.c b/mfschunkserver/hddspacemgr.c
index 519b49b..5e0f9b2 100644
--- a/mfschunkserver/hddspacemgr.c
+++ b/mfschunkserver/hddspacemgr.c
@@ -483,7 +483,11 @@ static inline void hdd_create_filename(char fname[PATH_MAX],const char *fpath,ui
 
 void hdd_generate_filename(char fname[PATH_MAX],chunk *c) {
 	int errmem = errno;
-	hdd_create_filename(fname,c->owner->path,c->pathid,c->chunkid,c->version);
+	if (c->owner!=NULL) {
+		hdd_create_filename(fname,c->owner->path,c->pathid,c->chunkid,c->version);
+	} else {
+		hdd_create_filename(fname,"(unknown)",c->pathid,c->chunkid,c->version);
+	}
 	errno = errmem;
 }
 
@@ -1066,7 +1070,7 @@ static inline void hdd_chunk_remove(chunk *c) {
 		if (c==cp) {
 			*cptr = cp->next;
 			if (cp->fd>=0) {
-				if (cp->crcchanged) { // mainly pro forma
+				if (cp->crcchanged && cp->owner!=NULL) { // mainly pro forma
 					syslog(LOG_WARNING,"hdd_chunk_remove: CRC not flushed - writing now");
 					if (chunk_writecrc(cp)!=MFS_STATUS_OK) {
 						char fname[PATH_MAX];
@@ -2301,9 +2305,11 @@ static inline void chunk_freecrc(chunk *c) {
 static inline int chunk_writecrc(chunk *c) {
 	int ret;
 	char fname[PATH_MAX];
-	zassert(pthread_mutex_lock(&folderlock));
-	c->owner->needrefresh = 1;
-	zassert(pthread_mutex_unlock(&folderlock));
+	if (c->owner!=NULL) {
+		zassert(pthread_mutex_lock(&folderlock));
+		c->owner->needrefresh = 1;
+		zassert(pthread_mutex_unlock(&folderlock));
+	}
 	ret = mypwrite(c->fd,c->crc,CHUNKCRCSIZE,c->hdrsize);
 	if (ret!=CHUNKCRCSIZE) {
 		int errmem = errno;
@@ -2501,7 +2507,7 @@ void hdd_delayed_ops() {
 #endif /* PRESERVE_BLOCK */
 //				printf("descriptor\n");
 				if (c->fd>=0 && c->opento<now) {
-					if (c->crcchanged) { // should never happened !!!
+					if (c->crcchanged && c->owner!=NULL) { // should never happened !!!
 						syslog(LOG_WARNING,"hdd_delayed_ops: CRC not flushed - writing now");
 						if (chunk_writecrc(c)!=MFS_STATUS_OK) {
 							hdd_generate_filename(fname,c); // preserves errno !!!
@@ -2527,6 +2533,7 @@ void hdd_delayed_ops() {
 					}
 //					printf("chunk %llu - free crc record\n",c->chunkid);
 					chunk_freecrc(c);
+					c->crcchanged = 0;
 					c->crcto = 0.0;
 				}
 #ifdef PRESERVE_BLOCK