mirror of
https://github.com/SELinuxProject/selinux
synced 2025-04-25 04:08:02 +00:00
libselinux: preserve errno in selinux_log()
selinux_log() is used in many error branches, where the caller might expect errno to bet set, e.g. label_file.c::lookup_all(): if (match_count) { *match_count = 0; result = calloc(data->nspec, sizeof(struct spec*)); } else { result = calloc(1, sizeof(struct spec*)); } if (!result) { selinux_log(SELINUX_ERROR, "Failed to allocate %zu bytes of data\n", data->nspec * sizeof(struct spec*)); goto finish; } Preserve errno in the macro wrapper itself, also preventing accidental errno modifications in client specified SELINUX_CB_LOG callbacks. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
8266fd9401
commit
88d43a8dc2
@ -5,6 +5,7 @@
|
|||||||
#ifndef _SELINUX_CALLBACKS_H_
|
#ifndef _SELINUX_CALLBACKS_H_
|
||||||
#define _SELINUX_CALLBACKS_H_
|
#define _SELINUX_CALLBACKS_H_
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -32,9 +33,11 @@ extern int
|
|||||||
extern pthread_mutex_t log_mutex;
|
extern pthread_mutex_t log_mutex;
|
||||||
|
|
||||||
#define selinux_log(type, ...) do { \
|
#define selinux_log(type, ...) do { \
|
||||||
|
int saved_errno__ = errno; \
|
||||||
__pthread_mutex_lock(&log_mutex); \
|
__pthread_mutex_lock(&log_mutex); \
|
||||||
selinux_log_direct(type, __VA_ARGS__); \
|
selinux_log_direct(type, __VA_ARGS__); \
|
||||||
__pthread_mutex_unlock(&log_mutex); \
|
__pthread_mutex_unlock(&log_mutex); \
|
||||||
|
errno = saved_errno__; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#endif /* _SELINUX_CALLBACKS_H_ */
|
#endif /* _SELINUX_CALLBACKS_H_ */
|
||||||
|
@ -93,7 +93,6 @@ static int process_line(struct selabel_handle *rec,
|
|||||||
|
|
||||||
items = read_spec_entries(line_buf, &errbuf, 2, &prop, &context);
|
items = read_spec_entries(line_buf, &errbuf, 2, &prop, &context);
|
||||||
if (items < 0) {
|
if (items < 0) {
|
||||||
items = errno;
|
|
||||||
if (errbuf) {
|
if (errbuf) {
|
||||||
selinux_log(SELINUX_ERROR,
|
selinux_log(SELINUX_ERROR,
|
||||||
"%s: line %u error due to: %s\n", path,
|
"%s: line %u error due to: %s\n", path,
|
||||||
@ -103,7 +102,6 @@ static int process_line(struct selabel_handle *rec,
|
|||||||
"%s: line %u error due to: %m\n", path,
|
"%s: line %u error due to: %m\n", path,
|
||||||
lineno);
|
lineno);
|
||||||
}
|
}
|
||||||
errno = items;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,7 +444,6 @@ static inline int process_line(struct selabel_handle *rec,
|
|||||||
|
|
||||||
items = read_spec_entries(line_buf, &errbuf, 3, ®ex, &type, &context);
|
items = read_spec_entries(line_buf, &errbuf, 3, ®ex, &type, &context);
|
||||||
if (items < 0) {
|
if (items < 0) {
|
||||||
rc = errno;
|
|
||||||
if (errbuf) {
|
if (errbuf) {
|
||||||
selinux_log(SELINUX_ERROR,
|
selinux_log(SELINUX_ERROR,
|
||||||
"%s: line %u error due to: %s\n", path,
|
"%s: line %u error due to: %s\n", path,
|
||||||
@ -454,7 +453,6 @@ static inline int process_line(struct selabel_handle *rec,
|
|||||||
"%s: line %u error due to: %m\n", path,
|
"%s: line %u error due to: %m\n", path,
|
||||||
lineno);
|
lineno);
|
||||||
}
|
}
|
||||||
errno = rc;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,7 +1053,7 @@ static int selinux_restorecon_common(const char *pathname_orig,
|
|||||||
struct stat sb;
|
struct stat sb;
|
||||||
char *pathname = NULL, *pathdnamer = NULL, *pathdname, *pathbname;
|
char *pathname = NULL, *pathdnamer = NULL, *pathdname, *pathbname;
|
||||||
char *paths[2] = { NULL, NULL };
|
char *paths[2] = { NULL, NULL };
|
||||||
int fts_flags, error, sverrno;
|
int fts_flags, error;
|
||||||
struct dir_hash_node *current = NULL;
|
struct dir_hash_node *current = NULL;
|
||||||
|
|
||||||
if (state.flags.verbose && state.flags.progress)
|
if (state.flags.verbose && state.flags.progress)
|
||||||
@ -1307,18 +1307,14 @@ cleanup:
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
oom:
|
oom:
|
||||||
sverrno = errno;
|
|
||||||
selinux_log(SELINUX_ERROR, "%s: Out of memory\n", __func__);
|
selinux_log(SELINUX_ERROR, "%s: Out of memory\n", __func__);
|
||||||
errno = sverrno;
|
|
||||||
error = -1;
|
error = -1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
realpatherr:
|
realpatherr:
|
||||||
sverrno = errno;
|
|
||||||
selinux_log(SELINUX_ERROR,
|
selinux_log(SELINUX_ERROR,
|
||||||
"SELinux: Could not get canonical path for %s restorecon: %m.\n",
|
"SELinux: Could not get canonical path for %s restorecon: %m.\n",
|
||||||
pathname_orig);
|
pathname_orig);
|
||||||
errno = sverrno;
|
|
||||||
error = -1;
|
error = -1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user