mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
Merge pull request #19034 from poettering/read-virtual-file-fix
read_virtual_file() tweaks
This commit is contained in:
commit
52b501c976
@ -100,7 +100,7 @@ int cg_read_event(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = read_full_file(events, &content, NULL);
|
||||
r = read_full_virtual_file(events, &content, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -368,7 +368,6 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
|
||||
struct stat st;
|
||||
size_t n, size;
|
||||
int n_retries;
|
||||
char *p;
|
||||
|
||||
assert(ret_contents);
|
||||
|
||||
@ -405,18 +404,21 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
|
||||
|
||||
/* Be prepared for files from /proc which generally report a file size of 0. */
|
||||
if (st.st_size > 0) {
|
||||
if (st.st_size > SSIZE_MAX) /* safety check in case off_t is 64bit and size_t 32bit */
|
||||
return -E2BIG;
|
||||
|
||||
size = st.st_size;
|
||||
n_retries--;
|
||||
} else
|
||||
size = size * 2;
|
||||
/* Double the buffer size (saturate in case of overflow) */
|
||||
size = size > SSIZE_MAX / 2 ? SSIZE_MAX : size * 2;
|
||||
|
||||
if (size > READ_FULL_BYTES_MAX)
|
||||
return -E2BIG;
|
||||
|
||||
p = realloc(buf, size + 1);
|
||||
if (!p)
|
||||
buf = malloc(size + 1);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
buf = TAKE_PTR(p);
|
||||
|
||||
for (;;) {
|
||||
ssize_t k;
|
||||
@ -445,12 +447,18 @@ int read_full_virtual_file(const char *filename, char **ret_contents, size_t *re
|
||||
|
||||
if (lseek(fd, 0, SEEK_SET) < 0)
|
||||
return -errno;
|
||||
|
||||
buf = mfree(buf);
|
||||
}
|
||||
|
||||
if (n < size) {
|
||||
char *p;
|
||||
|
||||
/* Return rest of the buffer to libc */
|
||||
p = realloc(buf, n + 1);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
buf = TAKE_PTR(p);
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *ret_mn
|
||||
xsprintf(path, "/proc/self/fdinfo/%i", subfd);
|
||||
}
|
||||
|
||||
r = read_full_file(path, &fdinfo, NULL);
|
||||
r = read_full_virtual_file(path, &fdinfo, NULL);
|
||||
if (r == -ENOENT) /* The fdinfo directory is a relatively new addition */
|
||||
return -EOPNOTSUPP;
|
||||
if (r < 0)
|
||||
|
@ -1548,7 +1548,7 @@ int pidfd_get_pid(int fd, pid_t *ret) {
|
||||
|
||||
xsprintf(path, "/proc/self/fdinfo/%i", fd);
|
||||
|
||||
r = read_full_file(path, &fdinfo, NULL);
|
||||
r = read_full_virtual_file(path, &fdinfo, NULL);
|
||||
if (r == -ENOENT) /* if fdinfo doesn't exist we assume the process does not exist */
|
||||
return -ESRCH;
|
||||
if (r < 0)
|
||||
|
@ -1125,23 +1125,23 @@ static int gather_pid_metadata(struct iovec_wrapper *iovw, Context *context) {
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_OPEN_FDS=", t);
|
||||
|
||||
p = procfs_file_alloca(pid, "status");
|
||||
if (read_full_file(p, &t, NULL) >= 0)
|
||||
if (read_full_virtual_file(p, &t, NULL) >= 0)
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_STATUS=", t);
|
||||
|
||||
p = procfs_file_alloca(pid, "maps");
|
||||
if (read_full_file(p, &t, NULL) >= 0)
|
||||
if (read_full_virtual_file(p, &t, NULL) >= 0)
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MAPS=", t);
|
||||
|
||||
p = procfs_file_alloca(pid, "limits");
|
||||
if (read_full_file(p, &t, NULL) >= 0)
|
||||
if (read_full_virtual_file(p, &t, NULL) >= 0)
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_LIMITS=", t);
|
||||
|
||||
p = procfs_file_alloca(pid, "cgroup");
|
||||
if (read_full_file(p, &t, NULL) >=0)
|
||||
if (read_full_virtual_file(p, &t, NULL) >=0)
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_CGROUP=", t);
|
||||
|
||||
p = procfs_file_alloca(pid, "mountinfo");
|
||||
if (read_full_file(p, &t, NULL) >=0)
|
||||
if (read_full_virtual_file(p, &t, NULL) >=0)
|
||||
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MOUNTINFO=", t);
|
||||
|
||||
if (get_process_cwd(pid, &t) >= 0)
|
||||
|
@ -1002,7 +1002,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
|
||||
const char *p;
|
||||
|
||||
p = procfs_file_alloca(pid, "cmdline");
|
||||
r = read_full_file(p, &c->cmdline, &c->cmdline_size);
|
||||
r = read_full_virtual_file(p, &c->cmdline, &c->cmdline_size);
|
||||
if (r == -ENOENT)
|
||||
return -ESRCH;
|
||||
if (r < 0) {
|
||||
|
@ -513,7 +513,7 @@ int device_read_uevent_file(sd_device *device) {
|
||||
|
||||
path = strjoina(syspath, "/uevent");
|
||||
|
||||
r = read_full_file(path, &uevent, &uevent_len);
|
||||
r = read_full_virtual_file(path, &uevent, &uevent_len);
|
||||
if (r == -EACCES) {
|
||||
/* empty uevent files may be write-only */
|
||||
device->uevent_loaded = true;
|
||||
|
@ -342,7 +342,7 @@ static int list_files(PStoreList *list, const char *sourcepath) {
|
||||
size_t buf_size;
|
||||
|
||||
/* Now read contents of pstore file */
|
||||
r = read_full_file(ifd_path, &buf, &buf_size);
|
||||
r = read_full_virtual_file(ifd_path, &buf, &buf_size);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "Failed to read file %s, skipping: %m", ifd_path);
|
||||
continue;
|
||||
|
@ -72,7 +72,7 @@ int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) {
|
||||
struct acpi_fpdt_boot_header hbrec;
|
||||
struct acpi_fpdt_boot brec;
|
||||
|
||||
r = read_full_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
|
||||
r = read_full_virtual_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -146,7 +146,6 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
|
||||
_cleanup_free_ char *new_contents = NULL;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
char **path;
|
||||
size_t size;
|
||||
|
||||
r = mac_selinux_create_file_prepare(new_path, S_IFREG);
|
||||
if (r < 0)
|
||||
@ -161,7 +160,7 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
|
||||
if (r < 0)
|
||||
return log_error_errno(errno, "Failed to change mode of \"%s\": %m", t);
|
||||
|
||||
r = read_full_file(new_path, &new_contents, &size);
|
||||
r = read_full_file(new_path, &new_contents, NULL);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
return log_error_errno(r, "Failed to read \"%s\": %m", new_path);
|
||||
|
||||
@ -182,7 +181,7 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
|
||||
if (path_equal(*path, new_path))
|
||||
continue;
|
||||
|
||||
r = read_full_file(*path, &contents, &size);
|
||||
r = read_full_file(*path, &contents, NULL);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to read \"%s\": %m", *path);
|
||||
|
||||
@ -468,10 +467,12 @@ static int trim_edit_markers(const char *path) {
|
||||
int r;
|
||||
|
||||
/* Trim out the lines between the two markers */
|
||||
r = read_full_file(path, &contents, &size);
|
||||
r = read_full_file(path, &contents, NULL);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to read temporary file \"%s\": %m", path);
|
||||
|
||||
size = strlen(contents);
|
||||
|
||||
contents_start = strstr(contents, EDIT_MARKER_START);
|
||||
if (contents_start)
|
||||
contents_start += strlen(EDIT_MARKER_START);
|
||||
|
Loading…
x
Reference in New Issue
Block a user