mirror of
https://github.com/systemd/systemd.git
synced 2025-02-06 01:57:47 +03:00
Modernization
Fixes minor leak in error path in device.c.
This commit is contained in:
parent
7ff7394d9e
commit
b47d419c25
@ -189,10 +189,12 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||
|
||||
assert(m);
|
||||
|
||||
if (!(sysfs = udev_device_get_syspath(dev)))
|
||||
sysfs = udev_device_get_syspath(dev);
|
||||
if (!sysfs)
|
||||
return -ENOMEM;
|
||||
|
||||
if ((r = device_find_escape_name(m, path, &u)) < 0)
|
||||
r = device_find_escape_name(m, path, &u);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
|
||||
@ -234,17 +236,21 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||
first = hashmap_get(m->devices_by_sysfs, sysfs);
|
||||
LIST_PREPEND(Device, same_sysfs, first, DEVICE(u));
|
||||
|
||||
if ((r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first)) < 0)
|
||||
r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE")) ||
|
||||
(model = udev_device_get_property_value(dev, "ID_MODEL"))) {
|
||||
if ((r = unit_set_description(u, model)) < 0)
|
||||
r = unit_set_description(u, model);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
} else
|
||||
if ((r = unit_set_description(u, path)) < 0)
|
||||
} else {
|
||||
r = unit_set_description(u, path);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (main) {
|
||||
/* The additional systemd udev properties we only
|
||||
@ -257,7 +263,7 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||
size_t l;
|
||||
|
||||
FOREACH_WORD_QUOTED(w, l, alias, state) {
|
||||
char *e;
|
||||
_cleanup_free_ char *e;
|
||||
|
||||
e = strndup(w, l);
|
||||
if (!e) {
|
||||
@ -265,13 +271,10 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!is_path(e)) {
|
||||
log_warning("SYSTEMD_ALIAS for %s is not a path, ignoring: %s", sysfs, e);
|
||||
free(e);
|
||||
} else {
|
||||
if (is_path(e))
|
||||
device_update_unit(m, dev, e, false);
|
||||
free(e);
|
||||
}
|
||||
else
|
||||
log_warning("SYSTEMD_ALIAS for %s is not a path, ignoring: %s", sysfs, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,22 +284,21 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
|
||||
size_t l;
|
||||
|
||||
FOREACH_WORD_QUOTED(w, l, wants, state) {
|
||||
char *e, *n;
|
||||
_cleanup_free_ char *e, *n = NULL;
|
||||
|
||||
e = strndup(w, l);
|
||||
if (!e) {
|
||||
r = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
n = unit_name_mangle(e);
|
||||
if (!n) {
|
||||
r = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
free(e);
|
||||
|
||||
r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
|
||||
free(n);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
@ -48,6 +48,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define GPT_SWAP SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f)
|
||||
#define GPT_HOME SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15)
|
||||
|
||||
static const char *arg_dest = "/tmp";
|
||||
|
||||
static inline void blkid_free_probep(blkid_probe *b) {
|
||||
@ -113,13 +116,13 @@ static int verify_gpt_partition(const char *node, sd_id128_t *type, unsigned *nr
|
||||
|
||||
|
||||
if (fstype) {
|
||||
char *fst;
|
||||
|
||||
errno = 0;
|
||||
r = blkid_probe_lookup_value(b, "TYPE", &v, NULL);
|
||||
if (r != 0)
|
||||
*fstype = NULL;
|
||||
else {
|
||||
char *fst;
|
||||
|
||||
fst = strdup(v);
|
||||
if (!fst)
|
||||
return -ENOMEM;
|
||||
@ -242,10 +245,8 @@ static int enumerate_partitions(struct udev *udev, dev_t dev) {
|
||||
int r;
|
||||
|
||||
e = udev_enumerate_new(udev);
|
||||
if (!e) {
|
||||
r = log_oom();
|
||||
goto finish;
|
||||
}
|
||||
if (!e)
|
||||
return log_oom();
|
||||
|
||||
d = udev_device_new_from_devnum(udev, 'b', dev);
|
||||
if (!d) {
|
||||
@ -314,10 +315,9 @@ static int enumerate_partitions(struct udev *udev, dev_t dev) {
|
||||
if (r == 0)
|
||||
goto skip;
|
||||
|
||||
if (sd_id128_equal(type_id, SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f)))
|
||||
if (sd_id128_equal(type_id, GPT_SWAP))
|
||||
add_swap(node, fstype);
|
||||
else if (sd_id128_equal(type_id, SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15))) {
|
||||
|
||||
else if (sd_id128_equal(type_id, GPT_HOME)) {
|
||||
if (!home || nr < home_nr) {
|
||||
free(home);
|
||||
home = strdup(node);
|
||||
@ -353,7 +353,7 @@ finish:
|
||||
}
|
||||
|
||||
static int get_btrfs_block_device(const char *path, dev_t *dev) {
|
||||
struct btrfs_ioctl_fs_info_args fsi;
|
||||
struct btrfs_ioctl_fs_info_args fsi = {};
|
||||
_cleanup_close_ int fd = -1;
|
||||
uint64_t id;
|
||||
|
||||
@ -364,7 +364,6 @@ static int get_btrfs_block_device(const char *path, dev_t *dev) {
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
zero(fsi);
|
||||
if (ioctl(fd, BTRFS_IOC_FS_INFO, &fsi) < 0)
|
||||
return -errno;
|
||||
|
||||
@ -373,12 +372,11 @@ static int get_btrfs_block_device(const char *path, dev_t *dev) {
|
||||
return 0;
|
||||
|
||||
for (id = 1; id <= fsi.max_id; id++) {
|
||||
struct btrfs_ioctl_dev_info_args di;
|
||||
struct btrfs_ioctl_dev_info_args di = {
|
||||
.devid = id,
|
||||
};
|
||||
struct stat st;
|
||||
|
||||
zero(di);
|
||||
di.devid = id;
|
||||
|
||||
if (ioctl(fd, BTRFS_IOC_DEV_INFO, &di) < 0) {
|
||||
if (errno == ENODEV)
|
||||
continue;
|
||||
@ -433,10 +431,8 @@ static int devno_to_devnode(struct udev *udev, dev_t devno, char **ret) {
|
||||
int r;
|
||||
|
||||
d = udev_device_new_from_devnum(udev, 'b', devno);
|
||||
if (!d) {
|
||||
r = log_oom();
|
||||
goto finish;
|
||||
}
|
||||
if (!d)
|
||||
return log_oom();
|
||||
|
||||
t = udev_device_get_devnode(d);
|
||||
if (!t) {
|
||||
@ -454,8 +450,7 @@ static int devno_to_devnode(struct udev *udev, dev_t devno, char **ret) {
|
||||
r = 0;
|
||||
|
||||
finish:
|
||||
if (d)
|
||||
udev_device_unref(d);
|
||||
udev_device_unref(d);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -805,7 +805,7 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
|
||||
free_data_x11();
|
||||
} else {
|
||||
FILE *f;
|
||||
_cleanup_fclose_ FILE *f;
|
||||
unsigned n = 0;
|
||||
unsigned best_matching = 0;
|
||||
char *new_keymap = NULL;
|
||||
@ -815,16 +815,13 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
return -errno;
|
||||
|
||||
for (;;) {
|
||||
char **a;
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
unsigned matching = 0;
|
||||
int r;
|
||||
|
||||
r = read_next_mapping(f, &n, &a);
|
||||
if (r < 0) {
|
||||
fclose(f);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
@ -879,19 +876,11 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
|
||||
free(new_keymap);
|
||||
new_keymap = strdup(a[0]);
|
||||
|
||||
if (!new_keymap) {
|
||||
strv_free(a);
|
||||
fclose(f);
|
||||
if (!new_keymap)
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
strv_free(a);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
if (!streq_ptr(state.vc_keymap, new_keymap)) {
|
||||
free(state.vc_keymap);
|
||||
state.vc_keymap = new_keymap;
|
||||
@ -906,7 +895,8 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
|
||||
if (modified) {
|
||||
dbus_bool_t b;
|
||||
DBusMessage *changed;
|
||||
|
||||
_cleanup_dbus_message_unref_ DBusMessage *changed = NULL;
|
||||
int r;
|
||||
|
||||
r = write_data_vconsole();
|
||||
@ -918,13 +908,10 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
"org.freedesktop.locale1",
|
||||
"VConsoleKeymap\0"
|
||||
"VConsoleKeymapToggle\0");
|
||||
|
||||
if (!changed)
|
||||
return -ENOMEM;
|
||||
|
||||
b = dbus_connection_send(connection, changed, NULL);
|
||||
dbus_message_unref(changed);
|
||||
|
||||
if (!b)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -935,31 +922,26 @@ static int convert_x11_to_vconsole(DBusConnection *connection) {
|
||||
}
|
||||
|
||||
static int append_locale(DBusMessageIter *i, const char *property, void *userdata) {
|
||||
int r, c = 0, p;
|
||||
char **l;
|
||||
int c, p;
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
|
||||
l = new0(char*, _PROP_MAX+1);
|
||||
if (!l)
|
||||
return -ENOMEM;
|
||||
|
||||
for (p = 0; p < _PROP_MAX; p++) {
|
||||
for (p = 0, c = 0; p < _PROP_MAX; p++) {
|
||||
char *t;
|
||||
|
||||
if (isempty(data[p]))
|
||||
continue;
|
||||
|
||||
if (asprintf(&t, "%s=%s", names[p], data[p]) < 0) {
|
||||
strv_free(l);
|
||||
if (asprintf(&t, "%s=%s", names[p], data[p]) < 0)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
l[c++] = t;
|
||||
}
|
||||
|
||||
r = bus_property_append_strv(i, property, (void*) l);
|
||||
strv_free(l);
|
||||
|
||||
return r;
|
||||
return bus_property_append_strv(i, property, (void*) l);
|
||||
}
|
||||
|
||||
static const BusProperty bus_locale_properties[] = {
|
||||
|
@ -415,7 +415,8 @@ static int collect(const char *root) {
|
||||
}
|
||||
}
|
||||
|
||||
if ((n = read(fanotify_fd, &data, sizeof(data))) < 0) {
|
||||
n = read(fanotify_fd, &data, sizeof(data));
|
||||
if (n < 0) {
|
||||
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
@ -436,7 +437,7 @@ static int collect(const char *root) {
|
||||
}
|
||||
|
||||
for (m = &data.metadata; FAN_EVENT_OK(m, n); m = FAN_EVENT_NEXT(m, n)) {
|
||||
char fn[PATH_MAX];
|
||||
char fn[sizeof("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
|
||||
int k;
|
||||
|
||||
if (m->fd < 0)
|
||||
@ -450,9 +451,8 @@ static int collect(const char *root) {
|
||||
goto next_iteration;
|
||||
|
||||
snprintf(fn, sizeof(fn), "/proc/self/fd/%i", m->fd);
|
||||
char_array_0(fn);
|
||||
|
||||
if ((k = readlink_malloc(fn, &p)) >= 0) {
|
||||
k = readlink_malloc(fn, &p);
|
||||
if (k >= 0) {
|
||||
if (startswith(p, "/tmp") ||
|
||||
endswith(p, " (deleted)") ||
|
||||
hashmap_get(files, p))
|
||||
|
@ -67,7 +67,7 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
|
||||
/* And sort */
|
||||
qsort(pids, n_pids, sizeof(pid_t), compare);
|
||||
|
||||
if(flags & OUTPUT_FULL_WIDTH)
|
||||
if (flags & OUTPUT_FULL_WIDTH)
|
||||
n_columns = 0;
|
||||
else {
|
||||
if (n_columns > pid_width+2)
|
||||
@ -76,7 +76,7 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
|
||||
n_columns = 20;
|
||||
}
|
||||
for (i = 0; i < n_pids; i++) {
|
||||
char *t = NULL;
|
||||
_cleanup_free_ char *t = NULL;
|
||||
|
||||
get_process_cmdline(pids[i], n_columns, true, &t);
|
||||
|
||||
@ -87,8 +87,6 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
|
||||
pid_width,
|
||||
(unsigned long) pids[i],
|
||||
strna(t));
|
||||
|
||||
free(t);
|
||||
}
|
||||
}
|
||||
|
||||
@ -98,7 +96,7 @@ static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
size_t n = 0, n_allocated = 0;
|
||||
_cleanup_free_ pid_t *pids = NULL;
|
||||
char *p = NULL;
|
||||
_cleanup_free_ char *p = NULL;
|
||||
pid_t pid;
|
||||
int r;
|
||||
|
||||
@ -106,13 +104,8 @@ static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
fn = strappend(p, "/cgroup.procs");
|
||||
free(p);
|
||||
if (!fn)
|
||||
return -ENOMEM;
|
||||
|
||||
fn = strappenda(p, "/cgroup.procs");
|
||||
f = fopen(fn, "re");
|
||||
free(fn);
|
||||
if (!f)
|
||||
return -errno;
|
||||
|
||||
|
@ -37,7 +37,7 @@ bool is_efi_boot(void) {
|
||||
|
||||
static int read_flag(const char *varname) {
|
||||
int r;
|
||||
void *v;
|
||||
_cleanup_free_ void *v = NULL;
|
||||
size_t s;
|
||||
uint8_t b;
|
||||
|
||||
@ -45,15 +45,11 @@ static int read_flag(const char *varname) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (s != 1) {
|
||||
r = -EINVAL;
|
||||
goto finish;
|
||||
}
|
||||
if (s != 1)
|
||||
return -EINVAL;
|
||||
|
||||
b = *(uint8_t *)v;
|
||||
r = b > 0;
|
||||
finish:
|
||||
free(v);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1874,6 +1874,7 @@ static void unitfilelist_free(UnitFileList **f) {
|
||||
free((*f)->path);
|
||||
free(*f);
|
||||
}
|
||||
#define _cleanup_unitfilelist_free_ _cleanup_(unitfilelist_free)
|
||||
|
||||
int unit_file_get_list(
|
||||
UnitFileScope scope,
|
||||
@ -1925,8 +1926,7 @@ int unit_file_get_list(
|
||||
for (;;) {
|
||||
struct dirent *de;
|
||||
union dirent_storage buffer;
|
||||
UnitFileList __attribute__((cleanup(unitfilelist_free)))
|
||||
*f = NULL;
|
||||
_cleanup_unitfilelist_free_ UnitFileList *f = NULL;
|
||||
|
||||
r = readdir_r(d, &buffer.de, &de);
|
||||
if (r != 0)
|
||||
|
@ -300,7 +300,8 @@ int socket_address_print(const SocketAddress *a, char **p) {
|
||||
case AF_INET: {
|
||||
char *ret;
|
||||
|
||||
if (!(ret = new(char, INET_ADDRSTRLEN+1+5+1)))
|
||||
ret = new(char, INET_ADDRSTRLEN+1+5+1);
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!inet_ntop(AF_INET, &a->sockaddr.in4.sin_addr, ret, INET_ADDRSTRLEN)) {
|
||||
@ -316,7 +317,8 @@ int socket_address_print(const SocketAddress *a, char **p) {
|
||||
case AF_INET6: {
|
||||
char *ret;
|
||||
|
||||
if (!(ret = new(char, 1+INET6_ADDRSTRLEN+2+5+1)))
|
||||
ret = new(char, 1+INET6_ADDRSTRLEN+2+5+1);
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
|
||||
ret[0] = '[';
|
||||
@ -334,8 +336,8 @@ int socket_address_print(const SocketAddress *a, char **p) {
|
||||
char *ret;
|
||||
|
||||
if (a->size <= offsetof(struct sockaddr_un, sun_path)) {
|
||||
|
||||
if (!(ret = strdup("<unnamed>")))
|
||||
ret = strdup("<unnamed>");
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
|
||||
} else if (a->sockaddr.un.sun_path[0] == 0) {
|
||||
@ -346,7 +348,8 @@ int socket_address_print(const SocketAddress *a, char **p) {
|
||||
* more than one NUL byte. That is
|
||||
* actually an invalid assumption */
|
||||
|
||||
if (!(ret = new(char, sizeof(a->sockaddr.un.sun_path)+1)))
|
||||
ret = new(char, sizeof(a->sockaddr.un.sun_path)+1);
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
|
||||
ret[0] = '@';
|
||||
@ -354,8 +357,8 @@ int socket_address_print(const SocketAddress *a, char **p) {
|
||||
ret[sizeof(a->sockaddr.un.sun_path)] = 0;
|
||||
|
||||
} else {
|
||||
|
||||
if (!(ret = strdup(a->sockaddr.un.sun_path)))
|
||||
ret = strdup(a->sockaddr.un.sun_path);
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -643,7 +643,7 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
|
||||
|
||||
/* Kernel threads have no argv[] */
|
||||
if (r == NULL || r[0] == 0) {
|
||||
char *t;
|
||||
_cleanup_free_ char *t = NULL;
|
||||
int h;
|
||||
|
||||
free(r);
|
||||
@ -656,8 +656,6 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
|
||||
return h;
|
||||
|
||||
r = strjoin("[", t, "]", NULL);
|
||||
free(t);
|
||||
|
||||
if (!r)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user