If the cleanup function returns the appropriate type, use that to reset the variable. For other functions (usually the foreign ones which return void), add an explicit value to reset to. This causes a bit of code churn, but I think it might be worth it. In a following patch static destructors will be called from a fuzzer, and this change allows them to be called multiple times. But I think such a change might help with detecting unitialized code reuse too. We hit various bugs like this, and things are more obvious when a pointer has been set to NULL. I was worried whether this change increases text size, but it doesn't seem to: -Dbuildtype=debug: before "tree-wide: return NULL from freeing functions": -rwxrwxr-x 1 zbyszek zbyszek 4117672 Feb 16 14:36 build/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 4494520 Feb 16 15:06 build/systemd* after "tree-wide: return NULL from freeing functions": -rwxrwxr-x 1 zbyszek zbyszek 4117672 Feb 16 14:36 build/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 4494576 Feb 16 15:10 build/systemd* now: -rwxrwxr-x 1 zbyszek zbyszek 4117672 Feb 16 14:36 build/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 4494640 Feb 16 15:15 build/systemd* -Dbuildtype=release: before "tree-wide: return NULL from freeing functions": -rwxrwxr-x 1 zbyszek zbyszek 5252256 Feb 14 14:47 build-rawhide/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 1834184 Feb 16 15:09 build-rawhide/systemd* after "tree-wide: return NULL from freeing functions": -rwxrwxr-x 1 zbyszek zbyszek 5252256 Feb 14 14:47 build-rawhide/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 1834184 Feb 16 15:10 build-rawhide/systemd* now: -rwxrwxr-x 1 zbyszek zbyszek 5252256 Feb 14 14:47 build-rawhide/libsystemd.so.0.30.0* -rwxrwxr-x 1 zbyszek zbyszek 1834184 Feb 16 15:16 build-rawhide/systemd* I would expect that the compiler would be able to elide the setting of a variable if the variable is never used again. And this seems to be the case: in optimized builds there is no change in size whatsoever. And the change in size in unoptimized build is negligible. Something strange is happening with size of libsystemd: it's bigger in optimized builds. Something to figure out, but unrelated to this patch.
54 lines
1.8 KiB
C
54 lines
1.8 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "macro.h"
|
|
#include "label.h"
|
|
|
|
#if HAVE_SELINUX
|
|
#include <selinux/selinux.h>
|
|
|
|
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(char*, freecon, NULL);
|
|
#define _cleanup_freecon_ _cleanup_(freeconp)
|
|
#endif
|
|
|
|
bool mac_selinux_use(void);
|
|
void mac_selinux_retest(void);
|
|
bool mac_selinux_enforcing(void);
|
|
|
|
int mac_selinux_init(void);
|
|
void mac_selinux_maybe_reload(void);
|
|
void mac_selinux_finish(void);
|
|
|
|
int mac_selinux_fix_container(const char *path, const char *inside_path, LabelFixFlags flags);
|
|
static inline int mac_selinux_fix(const char *path, LabelFixFlags flags) {
|
|
return mac_selinux_fix_container(path, path, flags);
|
|
}
|
|
|
|
int mac_selinux_fix_container_fd(int fd, const char *path, const char *inside_path, LabelFixFlags flags);
|
|
static inline int mac_selinux_fix_fd(int fd, const char *path, LabelFixFlags flags) {
|
|
return mac_selinux_fix_container_fd(fd, path, path, flags);
|
|
}
|
|
|
|
int mac_selinux_apply(const char *path, const char *label);
|
|
int mac_selinux_apply_fd(int fd, const char *path, const char *label);
|
|
|
|
int mac_selinux_get_create_label_from_exe(const char *exe, char **label);
|
|
int mac_selinux_get_our_label(char **label);
|
|
int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label);
|
|
char* mac_selinux_free(char *label);
|
|
|
|
int mac_selinux_create_file_prepare(const char *path, mode_t mode);
|
|
int mac_selinux_create_file_prepare_at(int dirfd, const char *path, mode_t mode);
|
|
void mac_selinux_create_file_clear(void);
|
|
|
|
int mac_selinux_create_socket_prepare(const char *label);
|
|
void mac_selinux_create_socket_clear(void);
|
|
|
|
int mac_selinux_bind(int fd, const struct sockaddr *addr, socklen_t addrlen);
|
|
|
|
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, mac_selinux_free);
|