aboutsummaryrefslogtreecommitdiffstats
path: root/src/firemon/procevent.c
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2019-09-29 19:03:16 -0400
committerLibravatar netblue30 <netblue30@yahoo.com>2019-09-29 19:03:16 -0400
commitbef5d86a10ec8f75fe341abb6ad58948107ec56e (patch)
tree9218e8adfd88dc3a7807e34759f6db2e864907dd /src/firemon/procevent.c
parentUpdate evince (diff)
downloadfirejail-bef5d86a10ec8f75fe341abb6ad58948107ec56e.tar.gz
firejail-bef5d86a10ec8f75fe341abb6ad58948107ec56e.tar.zst
firejail-bef5d86a10ec8f75fe341abb6ad58948107ec56e.zip
increase socket buffer size for firemon, bug #2700
Diffstat (limited to 'src/firemon/procevent.c')
-rw-r--r--src/firemon/procevent.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/firemon/procevent.c b/src/firemon/procevent.c
index b79f12362..762d22514 100644
--- a/src/firemon/procevent.c
+++ b/src/firemon/procevent.c
@@ -173,6 +173,20 @@ static int procevent_netlink_setup(void) {
173 if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) 173 if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
174 goto errexit; 174 goto errexit;
175 175
176 // set a large socket rx buffer
177 // the regular default value as set in /proc/sys/net/core/rmem_default will fill the
178 // buffer much quicker than we can process it
179 int bsize = 1024 * 1024; // 1MB
180 socklen_t blen = sizeof(int);
181 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, &bsize, blen) == -1)
182 fprintf(stderr, "Warning: cannot set rx buffer size, using default system value\n");
183 else if (arg_debug) {
184 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &bsize, &blen) == -1)
185 fprintf(stderr, "Error: cannot read rx buffer size\n");
186 else
187 printf("rx buffer size %d\n", bsize / 2); // the value returned is duble the real one, see man 7 socket
188 }
189
176 // send monitoring message 190 // send monitoring message
177 struct nlmsghdr nlmsghdr; 191 struct nlmsghdr nlmsghdr;
178 memset(&nlmsghdr, 0, sizeof(nlmsghdr)); 192 memset(&nlmsghdr, 0, sizeof(nlmsghdr));
@@ -244,14 +258,19 @@ static int procevent_monitor(const int sock, pid_t mypid) {
244 } 258 }
245 259
246 260
247 if ((len = recv(sock, buf, sizeof(buf), 0)) == 0) { 261 if ((len = recv(sock, buf, sizeof(buf), 0)) == 0)
248 return 0; 262 return 0;
249 }
250 if (len == -1) { 263 if (len == -1) {
251 if (errno == EINTR) { 264 if (errno == EINTR)
252 return 0; 265 continue;
253 } else { 266 else if (errno == ENOBUFS) {
254 fprintf(stderr,"recv: %s\n", strerror(errno)); 267 // rx buffer is full, the kernel started dropping messages
268 printf("*** Waning *** - message burst received, not all events are printed\n");
269//return -1;
270 continue;
271 }
272 else {
273 fprintf(stderr,"Error: rx socket recv call, errno %d, %s\n", errno, strerror(errno));
255 return -1; 274 return -1;
256 } 275 }
257 } 276 }