Line 0
Link Here
|
|
|
1 |
--- ngrep.c.orig 2006-11-28 17:38:43.000000000 +0400 |
2 |
+++ ngrep.c 2014-12-12 00:38:24.000000000 +0400 |
3 |
@@ -97,6 +97,10 @@ |
4 |
#include "regex-0.12/regex.h" |
5 |
#endif |
6 |
|
7 |
+#ifdef HAVE_CAPSICUM |
8 |
+#include <sys/capability.h> |
9 |
+#endif /* HAVE CAPSICUM */ |
10 |
+ |
11 |
#include "ngrep.h" |
12 |
|
13 |
|
14 |
@@ -186,6 +190,10 @@ uint32_t ws_row, ws_col = 80, ws_col_for |
15 |
int main(int argc, char **argv) { |
16 |
int32_t c; |
17 |
|
18 |
+#ifdef HAVE_CAPSICUM |
19 |
+ cap_rights_t rights; |
20 |
+#endif /* HAVE_CAPSICUM */ |
21 |
+ |
22 |
signal(SIGINT, clean_exit); |
23 |
signal(SIGABRT, clean_exit); |
24 |
|
25 |
@@ -416,6 +424,15 @@ int main(int argc, char **argv) { |
26 |
clean_exit(-1); |
27 |
} |
28 |
|
29 |
+#ifdef HAVE_CAPSICUM |
30 |
+ cap_rights_init(&rights, CAP_IOCTL, CAP_READ); |
31 |
+ if (cap_rights_limit(pcap_fileno(pd), &rights) < 0 && |
32 |
+ errno != ENOSYS) { |
33 |
+ fprintf(stderr, "unable to limit pcap descriptor"); |
34 |
+ clean_exit(-1); |
35 |
+ } |
36 |
+#endif /* HAVE CAPSICUM */ |
37 |
+ |
38 |
if (match_data) { |
39 |
if (bin_match) { |
40 |
uint32_t i = 0, n; |
41 |
@@ -603,6 +620,20 @@ int main(int argc, char **argv) { |
42 |
drop_privs(); |
43 |
#endif |
44 |
|
45 |
+#ifdef HAVE_CAPSICUM |
46 |
+ cap_rights_init(&rights); |
47 |
+ |
48 |
+ if (cap_rights_limit(STDIN_FILENO, &rights) < 0 && errno != ENOSYS) { |
49 |
+ fprintf(stderr, "can't limit stdin"); |
50 |
+ clean_exit(-1); |
51 |
+ } |
52 |
+ |
53 |
+ if (cap_enter() < 0 && errno != ENOSYS) { |
54 |
+ fprintf(stderr, "Can't enter capability mode"); |
55 |
+ clean_exit(-1); |
56 |
+ } |
57 |
+#endif /* HAVE_CAPSICUM */ |
58 |
+ |
59 |
while (pcap_loop(pd, 0, (pcap_handler)process, 0)); |
60 |
|
61 |
clean_exit(0); |