Line data Source code
1 : #include "../burp.h"
2 : #include "../alloc.h"
3 : #include "../bfile.h"
4 : #include "../cmd.h"
5 : #include "../conf.h"
6 : #include "../log.h"
7 : #include "acl.h"
8 : #include "cvss.h"
9 : #include "extrameta.h"
10 : #include "xattr.h"
11 :
12 4 : int has_extrameta(const char *path, enum cmd cmd,
13 : int enable_acl, int enable_xattr)
14 : {
15 : #if defined(WIN32_VSS)
16 : return 1;
17 : #endif
18 : #if defined(HAVE_LINUX_OS) || \
19 : defined(HAVE_FREEBSD_OS) || \
20 : defined(HAVE_NETBSD_OS)
21 :
22 : #ifdef HAVE_ACL
23 4 : if(enable_acl && has_acl(path, cmd))
24 : return 1;
25 : #endif
26 : #endif
27 : #if defined(HAVE_LINUX_OS) || \
28 : defined(HAVE_FREEBSD_OS) || \
29 : defined(HAVE_NETBSD_OS) || \
30 : defined(HAVE_DARWIN_OS)
31 : #ifdef HAVE_XATTR
32 4 : if(enable_xattr && has_xattr(path))
33 : return 1;
34 : #endif
35 : #endif
36 4 : return 0;
37 : }
38 :
39 6 : int get_extrameta(struct asfd *asfd,
40 : BFILE *bfd,
41 : const char *path,
42 : int isdir,
43 : char **extrameta,
44 : size_t *elen,
45 : struct cntr *cntr)
46 : {
47 : #if defined (WIN32_VSS)
48 : if(get_vss(bfd, extrameta, elen))
49 : return -1;
50 : #endif
51 : // Important to do xattr directly after acl, because xattr is excluding
52 : // some entries if acls were set.
53 : #if defined(HAVE_LINUX_OS) || \
54 : defined(HAVE_FREEBSD_OS) || \
55 : defined(HAVE_NETBSD_OS)
56 : #ifdef HAVE_ACL
57 6 : if(get_acl(asfd, path, isdir, extrameta, elen, cntr))
58 : return -1;
59 : #endif
60 : #endif
61 : #if defined(HAVE_LINUX_OS) || \
62 : defined(HAVE_FREEBSD_OS) || \
63 : defined(HAVE_NETBSD_OS) || \
64 : defined(HAVE_DARWIN_OS)
65 : #ifdef HAVE_XATTR
66 6 : if(get_xattr(asfd, path, extrameta, elen, cntr))
67 : return -1;
68 : #endif
69 : #endif
70 6 : return 0;
71 : }
72 :
73 4 : int set_extrameta(struct asfd *asfd,
74 : BFILE *bfd,
75 : const char *path,
76 : const char *extrameta,
77 : size_t metalen,
78 : struct cntr *cntr)
79 : {
80 4 : size_t l=0;
81 4 : char cmdtmp='\0';
82 4 : unsigned int s=0;
83 4 : const char *metadata=NULL;
84 4 : int errors=0;
85 :
86 4 : metadata=extrameta;
87 4 : l=metalen;
88 13 : while(l>0)
89 : {
90 5 : char *m=NULL;
91 5 : if((sscanf(metadata, "%c%08X", &cmdtmp, &s))!=2)
92 : {
93 : logw(asfd, cntr,
94 : "sscanf of metadata failed for %s: %s\n",
95 0 : path, metadata);
96 0 : return -1;
97 : }
98 5 : metadata+=9;
99 5 : l-=9;
100 5 : if(!(m=(char *)malloc_w(s+1, __func__)))
101 : return -1;
102 5 : memcpy(m, metadata, s);
103 5 : m[s]='\0';
104 :
105 5 : metadata+=s;
106 5 : l-=s;
107 :
108 5 : switch(cmdtmp)
109 : {
110 : #if defined(HAVE_WIN32)
111 : case META_VSS:
112 : if(set_vss(bfd, m, s))
113 : errors++;
114 : break;
115 : #endif
116 : #if defined(HAVE_LINUX_OS) || \
117 : defined(HAVE_FREEBSD_OS) || \
118 : defined(HAVE_NETBSD_OS)
119 : #ifdef HAVE_ACL
120 : case META_ACCESS_ACL:
121 2 : if(set_acl(asfd, path, m, s, cmdtmp, cntr))
122 0 : errors++;
123 : break;
124 : case META_DEFAULT_ACL:
125 1 : if(set_acl(asfd, path, m, s, cmdtmp, cntr))
126 0 : errors++;
127 : break;
128 : #endif
129 : #endif
130 : #if defined(HAVE_LINUX_OS) || \
131 : defined(HAVE_DARWIN_OS)
132 : #ifdef HAVE_XATTR
133 : case META_XATTR:
134 2 : if(set_xattr(asfd,
135 2 : path, m, s, cmdtmp, cntr))
136 0 : errors++;
137 : break;
138 : #endif
139 : #endif
140 : #if defined(HAVE_FREEBSD_OS) || \
141 : defined(HAVE_NETBSD_OS)
142 : #ifdef HAVE_XATTR
143 : case META_XATTR_BSD:
144 : if(set_xattr(asfd,
145 : path, m, s, cmdtmp, cntr))
146 : errors++;
147 : break;
148 : #endif
149 : #endif
150 : default:
151 0 : logp("unknown metadata: %c\n", cmdtmp);
152 : logw(asfd, cntr,
153 0 : "unknown metadata: %c\n", cmdtmp);
154 0 : errors++;
155 0 : break;
156 :
157 : }
158 5 : free_w(&m);
159 : }
160 :
161 : return errors;
162 : }
|