@@ -36,7 +36,7 @@ bool image_name_is_valid(const char *s) {
36
36
return true;
37
37
}
38
38
39
- int path_is_extension_tree (const char * path , const char * extension ) {
39
+ int path_is_extension_tree (const char * path , const char * extension , bool relax_extension_release_check ) {
40
40
int r ;
41
41
42
42
assert (path );
@@ -49,7 +49,7 @@ int path_is_extension_tree(const char *path, const char *extension) {
49
49
50
50
/* We use /usr/lib/extension-release.d/extension-release[.NAME] as flag for something being a system extension,
51
51
* and {/etc|/usr/lib}/os-release as a flag for something being an OS (when not an extension). */
52
- r = open_extension_release (path , extension , NULL , NULL );
52
+ r = open_extension_release (path , extension , relax_extension_release_check , NULL , NULL );
53
53
if (r == - ENOENT ) /* We got nothing */
54
54
return 0 ;
55
55
if (r < 0 )
@@ -58,7 +58,45 @@ int path_is_extension_tree(const char *path, const char *extension) {
58
58
return 1 ;
59
59
}
60
60
61
- int open_extension_release (const char * root , const char * extension , char * * ret_path , int * ret_fd ) {
61
+ static int extension_release_strict_xattr_value (int extension_release_fd , const char * extension_release_dir_path , const char * filename ) {
62
+ int r ;
63
+
64
+ assert (extension_release_fd >= 0 );
65
+ assert (extension_release_dir_path );
66
+ assert (filename );
67
+
68
+ /* No xattr or cannot parse it? Then skip this. */
69
+ _cleanup_free_ char * extension_release_xattr = NULL ;
70
+ r = fgetxattr_malloc (extension_release_fd , "user.extension-release.strict" , & extension_release_xattr );
71
+ if (r < 0 ) {
72
+ if (!ERRNO_IS_XATTR_ABSENT (r ))
73
+ return log_debug_errno (r ,
74
+ "%s/%s: Failed to read 'user.extension-release.strict' extended attribute from file, ignoring: %m" ,
75
+ extension_release_dir_path , filename );
76
+
77
+ return log_debug_errno (r , "%s/%s does not have user.extension-release.strict xattr, ignoring." , extension_release_dir_path , filename );
78
+ }
79
+
80
+ /* Explicitly set to request strict matching? Skip it. */
81
+ r = parse_boolean (extension_release_xattr );
82
+ if (r < 0 )
83
+ return log_debug_errno (r ,
84
+ "%s/%s: Failed to parse 'user.extension-release.strict' extended attribute from file, ignoring: %m" ,
85
+ extension_release_dir_path , filename );
86
+ if (r > 0 ) {
87
+ log_debug ("%s/%s: 'user.extension-release.strict' attribute is true, ignoring file." ,
88
+ extension_release_dir_path , filename );
89
+ return true;
90
+ }
91
+
92
+ log_debug ("%s/%s: 'user.extension-release.strict' attribute is false%s" ,
93
+ extension_release_dir_path , filename ,
94
+ special_glyph (SPECIAL_GLYPH_ELLIPSIS ));
95
+
96
+ return false;
97
+ }
98
+
99
+ int open_extension_release (const char * root , const char * extension , bool relax_extension_release_check , char * * ret_path , int * ret_fd ) {
62
100
_cleanup_free_ char * q = NULL ;
63
101
int r , fd ;
64
102
@@ -123,34 +161,14 @@ int open_extension_release(const char *root, const char *extension, char **ret_p
123
161
continue ;
124
162
}
125
163
126
- /* No xattr or cannot parse it? Then skip this. */
127
- _cleanup_free_ char * extension_release_xattr = NULL ;
128
- k = fgetxattr_malloc (extension_release_fd , "user.extension-release.strict" , & extension_release_xattr );
129
- if (k < 0 && !ERRNO_IS_XATTR_ABSENT (k ))
130
- log_debug_errno (k ,
131
- "%s/%s: Failed to read 'user.extension-release.strict' extended attribute from file: %m" ,
132
- extension_release_dir_path , de -> d_name );
133
- if (k < 0 ) {
134
- log_debug ("%s/%s does not have user.extension-release.strict xattr, ignoring." , extension_release_dir_path , de -> d_name );
135
- continue ;
164
+ if (!relax_extension_release_check ) {
165
+ k = extension_release_strict_xattr_value (extension_release_fd ,
166
+ extension_release_dir_path ,
167
+ de -> d_name );
168
+ if (k != 0 )
169
+ continue ;
136
170
}
137
171
138
- /* Explicitly set to request strict matching? Skip it. */
139
- k = parse_boolean (extension_release_xattr );
140
- if (k < 0 )
141
- log_debug_errno (k ,
142
- "%s/%s: Failed to parse 'user.extension-release.strict' extended attribute from file: %m" ,
143
- extension_release_dir_path , de -> d_name );
144
- else if (k > 0 )
145
- log_debug ("%s/%s: 'user.extension-release.strict' attribute is true, ignoring file." ,
146
- extension_release_dir_path , de -> d_name );
147
- if (k != 0 )
148
- continue ;
149
-
150
- log_debug ("%s/%s: 'user.extension-release.strict' attribute is false%s" ,
151
- extension_release_dir_path , de -> d_name ,
152
- special_glyph (SPECIAL_GLYPH_ELLIPSIS ));
153
-
154
172
/* We already found what we were looking for, but there's another candidate?
155
173
* We treat this as an error, as we want to enforce that there are no ambiguities
156
174
* in case we are in the fallback path.*/
@@ -207,16 +225,16 @@ int open_extension_release(const char *root, const char *extension, char **ret_p
207
225
return 0 ;
208
226
}
209
227
210
- int fopen_extension_release (const char * root , const char * extension , char * * ret_path , FILE * * ret_file ) {
228
+ int fopen_extension_release (const char * root , const char * extension , bool relax_extension_release_check , char * * ret_path , FILE * * ret_file ) {
211
229
_cleanup_free_ char * p = NULL ;
212
230
_cleanup_close_ int fd = -1 ;
213
231
FILE * f ;
214
232
int r ;
215
233
216
234
if (!ret_file )
217
- return open_extension_release (root , extension , ret_path , NULL );
235
+ return open_extension_release (root , extension , relax_extension_release_check , ret_path , NULL );
218
236
219
- r = open_extension_release (root , extension , ret_path ? & p : NULL , & fd );
237
+ r = open_extension_release (root , extension , relax_extension_release_check , ret_path ? & p : NULL , & fd );
220
238
if (r < 0 )
221
239
return r ;
222
240
@@ -231,24 +249,24 @@ int fopen_extension_release(const char *root, const char *extension, char **ret_
231
249
return 0 ;
232
250
}
233
251
234
- static int parse_release_internal (const char * root , const char * extension , va_list ap ) {
252
+ static int parse_release_internal (const char * root , bool relax_extension_release_check , const char * extension , va_list ap ) {
235
253
_cleanup_fclose_ FILE * f = NULL ;
236
254
_cleanup_free_ char * p = NULL ;
237
255
int r ;
238
256
239
- r = fopen_extension_release (root , extension , & p , & f );
257
+ r = fopen_extension_release (root , extension , relax_extension_release_check , & p , & f );
240
258
if (r < 0 )
241
259
return r ;
242
260
243
261
return parse_env_filev (f , p , ap );
244
262
}
245
263
246
- int _parse_extension_release (const char * root , const char * extension , ...) {
264
+ int _parse_extension_release (const char * root , bool relax_extension_release_check , const char * extension , ...) {
247
265
va_list ap ;
248
266
int r ;
249
267
250
268
va_start (ap , extension );
251
- r = parse_release_internal (root , extension , ap );
269
+ r = parse_release_internal (root , relax_extension_release_check , extension , ap );
252
270
va_end (ap );
253
271
254
272
return r ;
@@ -259,7 +277,7 @@ int _parse_os_release(const char *root, ...) {
259
277
int r ;
260
278
261
279
va_start (ap , root );
262
- r = parse_release_internal (root , NULL , ap );
280
+ r = parse_release_internal (root , /* relax_extension_release_check= */ false, NULL , ap );
263
281
va_end (ap );
264
282
265
283
return r ;
@@ -306,12 +324,12 @@ int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char
306
324
return 0 ;
307
325
}
308
326
309
- int load_extension_release_pairs (const char * root , const char * extension , char * * * ret ) {
327
+ int load_extension_release_pairs (const char * root , const char * extension , bool relax_extension_release_check , char * * * ret ) {
310
328
_cleanup_fclose_ FILE * f = NULL ;
311
329
_cleanup_free_ char * p = NULL ;
312
330
int r ;
313
331
314
- r = fopen_extension_release (root , extension , & p , & f );
332
+ r = fopen_extension_release (root , extension , relax_extension_release_check , & p , & f );
315
333
if (r < 0 )
316
334
return r ;
317
335
0 commit comments