| File: | build-scan/../src/basic/journal-importer.c |
| Warning: | line 412, column 17 1st function call argument is an uninitialized value |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | |||
| 2 | ||||
| 3 | #include <errno(*__errno_location ()).h> | |||
| 4 | #include <unistd.h> | |||
| 5 | ||||
| 6 | #include "alloc-util.h" | |||
| 7 | #include "escape.h" | |||
| 8 | #include "fd-util.h" | |||
| 9 | #include "io-util.h" | |||
| 10 | #include "journal-file.h" | |||
| 11 | #include "journal-importer.h" | |||
| 12 | #include "journal-util.h" | |||
| 13 | #include "parse-util.h" | |||
| 14 | #include "string-util.h" | |||
| 15 | #include "unaligned.h" | |||
| 16 | ||||
| 17 | enum { | |||
| 18 | IMPORTER_STATE_LINE = 0, /* waiting to read, or reading line */ | |||
| 19 | IMPORTER_STATE_DATA_START, /* reading binary data header */ | |||
| 20 | IMPORTER_STATE_DATA, /* reading binary data */ | |||
| 21 | IMPORTER_STATE_DATA_FINISH, /* expecting newline */ | |||
| 22 | IMPORTER_STATE_EOF, /* done */ | |||
| 23 | }; | |||
| 24 | ||||
| 25 | static int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) { | |||
| 26 | if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1)greedy_realloc((void**) &(iovw->iovec), &(iovw-> size_bytes), (iovw->count + 1), sizeof((iovw->iovec)[0] ))) | |||
| 27 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/basic/journal-importer.c" , 27, __func__); | |||
| 28 | ||||
| 29 | iovw->iovec[iovw->count++] = IOVEC_MAKE(data, len)(struct iovec) { .iov_base = (data), .iov_len = (len) }; | |||
| 30 | return 0; | |||
| 31 | } | |||
| 32 | ||||
| 33 | static void iovw_free_contents(struct iovec_wrapper *iovw) { | |||
| 34 | iovw->iovec = mfree(iovw->iovec); | |||
| 35 | iovw->size_bytes = iovw->count = 0; | |||
| 36 | } | |||
| 37 | ||||
| 38 | static void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) { | |||
| 39 | size_t i; | |||
| 40 | ||||
| 41 | for (i = 0; i < iovw->count; i++) | |||
| 42 | iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new; | |||
| 43 | } | |||
| 44 | ||||
| 45 | size_t iovw_size(struct iovec_wrapper *iovw) { | |||
| 46 | size_t n = 0, i; | |||
| 47 | ||||
| 48 | for (i = 0; i < iovw->count; i++) | |||
| 49 | n += iovw->iovec[i].iov_len; | |||
| 50 | ||||
| 51 | return n; | |||
| 52 | } | |||
| 53 | ||||
| 54 | void journal_importer_cleanup(JournalImporter *imp) { | |||
| 55 | if (imp->fd >= 0 && !imp->passive_fd) { | |||
| 56 | log_debug("Closing %s (fd=%d)", imp->name ?: "importer", imp->fd)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 56, __func__, "Closing %s (fd=%d)" , imp->name ?: "importer", imp->fd) : -abs(_e); }); | |||
| 57 | safe_close(imp->fd); | |||
| 58 | } | |||
| 59 | ||||
| 60 | free(imp->name); | |||
| 61 | free(imp->buf); | |||
| 62 | iovw_free_contents(&imp->iovw); | |||
| 63 | } | |||
| 64 | ||||
| 65 | static char* realloc_buffer(JournalImporter *imp, size_t size) { | |||
| 66 | char *b, *old = imp->buf; | |||
| 67 | ||||
| 68 | b = GREEDY_REALLOC(imp->buf, imp->size, size)greedy_realloc((void**) &(imp->buf), &(imp->size ), (size), sizeof((imp->buf)[0])); | |||
| 69 | if (!b) | |||
| 70 | return NULL((void*)0); | |||
| 71 | ||||
| 72 | iovw_rebase(&imp->iovw, old, imp->buf); | |||
| 73 | ||||
| 74 | return b; | |||
| 75 | } | |||
| 76 | ||||
| 77 | static int get_line(JournalImporter *imp, char **line, size_t *size) { | |||
| 78 | ssize_t n; | |||
| 79 | char *c = NULL((void*)0); | |||
| 80 | ||||
| 81 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 81, __PRETTY_FUNCTION__); } while (0); | |||
| 82 | assert(imp->state == IMPORTER_STATE_LINE)do { if ((__builtin_expect(!!(!(imp->state == IMPORTER_STATE_LINE )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->state == IMPORTER_STATE_LINE" ), "../src/basic/journal-importer.c", 82, __PRETTY_FUNCTION__ ); } while (0); | |||
| 83 | assert(imp->offset <= imp->filled)do { if ((__builtin_expect(!!(!(imp->offset <= imp-> filled)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->offset <= imp->filled" ), "../src/basic/journal-importer.c", 83, __PRETTY_FUNCTION__ ); } while (0); | |||
| 84 | assert(imp->filled <= imp->size)do { if ((__builtin_expect(!!(!(imp->filled <= imp-> size)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->filled <= imp->size" ), "../src/basic/journal-importer.c", 84, __PRETTY_FUNCTION__ ); } while (0); | |||
| 85 | assert(!imp->buf || imp->size > 0)do { if ((__builtin_expect(!!(!(!imp->buf || imp->size > 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!imp->buf || imp->size > 0" ), "../src/basic/journal-importer.c", 85, __PRETTY_FUNCTION__ ); } while (0); | |||
| 86 | assert(imp->fd >= 0)do { if ((__builtin_expect(!!(!(imp->fd >= 0)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp->fd >= 0"), "../src/basic/journal-importer.c" , 86, __PRETTY_FUNCTION__); } while (0); | |||
| 87 | ||||
| 88 | for (;;) { | |||
| 89 | if (imp->buf) { | |||
| 90 | size_t start = MAX(imp->scanned, imp->offset)__extension__ ({ const typeof((imp->scanned)) __unique_prefix_A25 = ((imp->scanned)); const typeof((imp->offset)) __unique_prefix_B26 = ((imp->offset)); __unique_prefix_A25 > __unique_prefix_B26 ? __unique_prefix_A25 : __unique_prefix_B26; }); | |||
| 91 | ||||
| 92 | c = memchr(imp->buf + start, '\n', | |||
| 93 | imp->filled - start); | |||
| 94 | if (c != NULL((void*)0)) | |||
| 95 | break; | |||
| 96 | } | |||
| 97 | ||||
| 98 | imp->scanned = imp->filled; | |||
| 99 | if (imp->scanned >= DATA_SIZE_MAX(1024*1024*768u)) { | |||
| 100 | log_error("Entry is bigger than %u bytes.", DATA_SIZE_MAX)({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 100, __func__, "Entry is bigger than %u bytes." , (1024*1024*768u)) : -abs(_e); }); | |||
| 101 | return -E2BIG7; | |||
| 102 | } | |||
| 103 | ||||
| 104 | if (imp->passive_fd) | |||
| 105 | /* we have to wait for some data to come to us */ | |||
| 106 | return -EAGAIN11; | |||
| 107 | ||||
| 108 | /* We know that imp->filled is at most DATA_SIZE_MAX, so if | |||
| 109 | we reallocate it, we'll increase the size at least a bit. */ | |||
| 110 | assert_cc(DATA_SIZE_MAX < ENTRY_SIZE_MAX)GCC diagnostic push
; GCC diagnostic ignored "-Wdeclaration-after-statement" ; struct _assert_struct_27 { char x[((1024*1024*768u) < ( 1024*1024*770u)) ? 0 : -1]; }; GCC diagnostic pop ; | |||
| 111 | if (imp->size - imp->filled < LINE_CHUNK8*1024u && | |||
| 112 | !realloc_buffer(imp, MIN(imp->filled + LINE_CHUNK, ENTRY_SIZE_MAX)__extension__ ({ const typeof((imp->filled + 8*1024u)) __unique_prefix_A28 = ((imp->filled + 8*1024u)); const typeof(((1024*1024*770u ))) __unique_prefix_B29 = (((1024*1024*770u))); __unique_prefix_A28 < __unique_prefix_B29 ? __unique_prefix_A28 : __unique_prefix_B29 ; }))) | |||
| 113 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/basic/journal-importer.c" , 113, __func__); | |||
| 114 | ||||
| 115 | assert(imp->buf)do { if ((__builtin_expect(!!(!(imp->buf)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp->buf"), "../src/basic/journal-importer.c" , 115, __PRETTY_FUNCTION__); } while (0); | |||
| 116 | assert(imp->size - imp->filled >= LINE_CHUNK ||do { if ((__builtin_expect(!!(!(imp->size - imp->filled >= 8*1024u || imp->size == (1024*1024*770u))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp->size - imp->filled >= LINE_CHUNK || imp->size == ENTRY_SIZE_MAX" ), "../src/basic/journal-importer.c", 117, __PRETTY_FUNCTION__ ); } while (0) | |||
| 117 | imp->size == ENTRY_SIZE_MAX)do { if ((__builtin_expect(!!(!(imp->size - imp->filled >= 8*1024u || imp->size == (1024*1024*770u))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp->size - imp->filled >= LINE_CHUNK || imp->size == ENTRY_SIZE_MAX" ), "../src/basic/journal-importer.c", 117, __PRETTY_FUNCTION__ ); } while (0); | |||
| 118 | ||||
| 119 | n = read(imp->fd, | |||
| 120 | imp->buf + imp->filled, | |||
| 121 | imp->size - imp->filled); | |||
| 122 | if (n < 0) { | |||
| 123 | if (errno(*__errno_location ()) != EAGAIN11) | |||
| 124 | log_error_errno(errno, "read(%d, ..., %zu): %m",({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/basic/journal-importer.c", 126, __func__ , "read(%d, ..., %zu): %m", imp->fd, imp->size - imp-> filled) : -abs(_e); }) | |||
| 125 | imp->fd,({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/basic/journal-importer.c", 126, __func__ , "read(%d, ..., %zu): %m", imp->fd, imp->size - imp-> filled) : -abs(_e); }) | |||
| 126 | imp->size - imp->filled)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/basic/journal-importer.c", 126, __func__ , "read(%d, ..., %zu): %m", imp->fd, imp->size - imp-> filled) : -abs(_e); }); | |||
| 127 | return -errno(*__errno_location ()); | |||
| 128 | } else if (n == 0) | |||
| 129 | return 0; | |||
| 130 | ||||
| 131 | imp->filled += n; | |||
| 132 | } | |||
| 133 | ||||
| 134 | *line = imp->buf + imp->offset; | |||
| 135 | *size = c + 1 - imp->buf - imp->offset; | |||
| 136 | imp->offset += *size; | |||
| 137 | ||||
| 138 | return 1; | |||
| 139 | } | |||
| 140 | ||||
| 141 | static int fill_fixed_size(JournalImporter *imp, void **data, size_t size) { | |||
| 142 | ||||
| 143 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 143, __PRETTY_FUNCTION__); } while (0); | |||
| 144 | assert(IN_SET(imp->state, IMPORTER_STATE_DATA_START, IMPORTER_STATE_DATA, IMPORTER_STATE_DATA_FINISH))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){IMPORTER_STATE_DATA_START, IMPORTER_STATE_DATA , IMPORTER_STATE_DATA_FINISH})/sizeof(int)]; switch(imp->state ) { case IMPORTER_STATE_DATA_START: case IMPORTER_STATE_DATA: case IMPORTER_STATE_DATA_FINISH: _found = 1; break; default: break; } _found; }))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD , ("IN_SET(imp->state, IMPORTER_STATE_DATA_START, IMPORTER_STATE_DATA, IMPORTER_STATE_DATA_FINISH)" ), "../src/basic/journal-importer.c", 144, __PRETTY_FUNCTION__ ); } while (0); | |||
| 145 | assert(size <= DATA_SIZE_MAX)do { if ((__builtin_expect(!!(!(size <= (1024*1024*768u))) ,0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("size <= DATA_SIZE_MAX" ), "../src/basic/journal-importer.c", 145, __PRETTY_FUNCTION__ ); } while (0); | |||
| 146 | assert(imp->offset <= imp->filled)do { if ((__builtin_expect(!!(!(imp->offset <= imp-> filled)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->offset <= imp->filled" ), "../src/basic/journal-importer.c", 146, __PRETTY_FUNCTION__ ); } while (0); | |||
| 147 | assert(imp->filled <= imp->size)do { if ((__builtin_expect(!!(!(imp->filled <= imp-> size)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->filled <= imp->size" ), "../src/basic/journal-importer.c", 147, __PRETTY_FUNCTION__ ); } while (0); | |||
| 148 | assert(imp->buf || imp->size == 0)do { if ((__builtin_expect(!!(!(imp->buf || imp->size == 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->buf || imp->size == 0" ), "../src/basic/journal-importer.c", 148, __PRETTY_FUNCTION__ ); } while (0); | |||
| 149 | assert(!imp->buf || imp->size > 0)do { if ((__builtin_expect(!!(!(!imp->buf || imp->size > 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!imp->buf || imp->size > 0" ), "../src/basic/journal-importer.c", 149, __PRETTY_FUNCTION__ ); } while (0); | |||
| 150 | assert(imp->fd >= 0)do { if ((__builtin_expect(!!(!(imp->fd >= 0)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp->fd >= 0"), "../src/basic/journal-importer.c" , 150, __PRETTY_FUNCTION__); } while (0); | |||
| 151 | assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("data"), "../src/basic/journal-importer.c" , 151, __PRETTY_FUNCTION__); } while (0); | |||
| 152 | ||||
| 153 | while (imp->filled - imp->offset < size) { | |||
| 154 | int n; | |||
| 155 | ||||
| 156 | if (imp->passive_fd) | |||
| 157 | /* we have to wait for some data to come to us */ | |||
| 158 | return -EAGAIN11; | |||
| 159 | ||||
| 160 | if (!realloc_buffer(imp, imp->offset + size)) | |||
| 161 | return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/basic/journal-importer.c" , 161, __func__); | |||
| 162 | ||||
| 163 | n = read(imp->fd, imp->buf + imp->filled, | |||
| 164 | imp->size - imp->filled); | |||
| 165 | if (n < 0) { | |||
| 166 | if (errno(*__errno_location ()) != EAGAIN11) | |||
| 167 | log_error_errno(errno, "read(%d, ..., %zu): %m", imp->fd,({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/basic/journal-importer.c", 168, __func__ , "read(%d, ..., %zu): %m", imp->fd, imp->size - imp-> filled) : -abs(_e); }) | |||
| 168 | imp->size - imp->filled)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/basic/journal-importer.c", 168, __func__ , "read(%d, ..., %zu): %m", imp->fd, imp->size - imp-> filled) : -abs(_e); }); | |||
| 169 | return -errno(*__errno_location ()); | |||
| 170 | } else if (n == 0) | |||
| 171 | return 0; | |||
| 172 | ||||
| 173 | imp->filled += n; | |||
| 174 | } | |||
| 175 | ||||
| 176 | *data = imp->buf + imp->offset; | |||
| 177 | imp->offset += size; | |||
| 178 | ||||
| 179 | return 1; | |||
| 180 | } | |||
| 181 | ||||
| 182 | static int get_data_size(JournalImporter *imp) { | |||
| 183 | int r; | |||
| 184 | void *data; | |||
| 185 | ||||
| 186 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 186, __PRETTY_FUNCTION__); } while (0); | |||
| 187 | assert(imp->state == IMPORTER_STATE_DATA_START)do { if ((__builtin_expect(!!(!(imp->state == IMPORTER_STATE_DATA_START )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->state == IMPORTER_STATE_DATA_START" ), "../src/basic/journal-importer.c", 187, __PRETTY_FUNCTION__ ); } while (0); | |||
| 188 | assert(imp->data_size == 0)do { if ((__builtin_expect(!!(!(imp->data_size == 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->data_size == 0" ), "../src/basic/journal-importer.c", 188, __PRETTY_FUNCTION__ ); } while (0); | |||
| 189 | ||||
| 190 | r = fill_fixed_size(imp, &data, sizeof(uint64_t)); | |||
| 191 | if (r <= 0) | |||
| 192 | return r; | |||
| 193 | ||||
| 194 | imp->data_size = unaligned_read_le64(data); | |||
| 195 | if (imp->data_size > DATA_SIZE_MAX(1024*1024*768u)) { | |||
| 196 | log_error("Stream declares field with size %zu > DATA_SIZE_MAX = %u",({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 197, __func__, "Stream declares field with size %zu > DATA_SIZE_MAX = %u" , imp->data_size, (1024*1024*768u)) : -abs(_e); }) | |||
| 197 | imp->data_size, DATA_SIZE_MAX)({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 197, __func__, "Stream declares field with size %zu > DATA_SIZE_MAX = %u" , imp->data_size, (1024*1024*768u)) : -abs(_e); }); | |||
| 198 | return -EINVAL22; | |||
| 199 | } | |||
| 200 | if (imp->data_size == 0) | |||
| 201 | log_warning("Binary field with zero length")({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 201, __func__, "Binary field with zero length" ) : -abs(_e); }); | |||
| 202 | ||||
| 203 | return 1; | |||
| 204 | } | |||
| 205 | ||||
| 206 | static int get_data_data(JournalImporter *imp, void **data) { | |||
| 207 | int r; | |||
| 208 | ||||
| 209 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 209, __PRETTY_FUNCTION__); } while (0); | |||
| 210 | assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("data"), "../src/basic/journal-importer.c" , 210, __PRETTY_FUNCTION__); } while (0); | |||
| 211 | assert(imp->state == IMPORTER_STATE_DATA)do { if ((__builtin_expect(!!(!(imp->state == IMPORTER_STATE_DATA )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->state == IMPORTER_STATE_DATA" ), "../src/basic/journal-importer.c", 211, __PRETTY_FUNCTION__ ); } while (0); | |||
| 212 | ||||
| 213 | r = fill_fixed_size(imp, data, imp->data_size); | |||
| 214 | if (r <= 0) | |||
| 215 | return r; | |||
| 216 | ||||
| 217 | return 1; | |||
| 218 | } | |||
| 219 | ||||
| 220 | static int get_data_newline(JournalImporter *imp) { | |||
| 221 | int r; | |||
| 222 | char *data; | |||
| 223 | ||||
| 224 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 224, __PRETTY_FUNCTION__); } while (0); | |||
| 225 | assert(imp->state == IMPORTER_STATE_DATA_FINISH)do { if ((__builtin_expect(!!(!(imp->state == IMPORTER_STATE_DATA_FINISH )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->state == IMPORTER_STATE_DATA_FINISH" ), "../src/basic/journal-importer.c", 225, __PRETTY_FUNCTION__ ); } while (0); | |||
| 226 | ||||
| 227 | r = fill_fixed_size(imp, (void**) &data, 1); | |||
| 228 | if (r <= 0) | |||
| 229 | return r; | |||
| 230 | ||||
| 231 | assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("data"), "../src/basic/journal-importer.c" , 231, __PRETTY_FUNCTION__); } while (0); | |||
| 232 | if (*data != '\n') { | |||
| 233 | char buf[4]; | |||
| 234 | int l; | |||
| 235 | ||||
| 236 | l = cescape_char(*data, buf); | |||
| 237 | log_error("Expected newline, got '%.*s'", l, buf)({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 237, __func__, "Expected newline, got '%.*s'" , l, buf) : -abs(_e); }); | |||
| 238 | return -EINVAL22; | |||
| 239 | } | |||
| 240 | ||||
| 241 | return 1; | |||
| 242 | } | |||
| 243 | ||||
| 244 | static int process_special_field(JournalImporter *imp, char *line) { | |||
| 245 | const char *value; | |||
| 246 | char buf[CELLESCAPE_DEFAULT_LENGTH64]; | |||
| 247 | int r; | |||
| 248 | ||||
| 249 | assert(line)do { if ((__builtin_expect(!!(!(line)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("line"), "../src/basic/journal-importer.c" , 249, __PRETTY_FUNCTION__); } while (0); | |||
| 250 | ||||
| 251 | value = startswith(line, "__CURSOR="); | |||
| 252 | if (value) | |||
| 253 | /* ignore __CURSOR */ | |||
| 254 | return 1; | |||
| 255 | ||||
| 256 | value = startswith(line, "__REALTIME_TIMESTAMP="); | |||
| 257 | if (value) { | |||
| 258 | uint64_t x; | |||
| 259 | ||||
| 260 | r = safe_atou64(value, &x); | |||
| 261 | if (r < 0) | |||
| 262 | return log_warning_errno(r, "Failed to parse __REALTIME_TIMESTAMP '%s': %m",({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 263, __func__, "Failed to parse __REALTIME_TIMESTAMP '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }) | |||
| 263 | cellescape(buf, sizeof buf, value))({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 263, __func__, "Failed to parse __REALTIME_TIMESTAMP '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }); | |||
| 264 | else if (!VALID_REALTIME(x)) { | |||
| 265 | log_warning("__REALTIME_TIMESTAMP out of range, ignoring: %"PRIu64, x)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 265, __func__, "__REALTIME_TIMESTAMP out of range, ignoring: %" "l" "u", x) : -abs(_e); }); | |||
| 266 | return -ERANGE34; | |||
| 267 | } | |||
| 268 | ||||
| 269 | imp->ts.realtime = x; | |||
| 270 | return 1; | |||
| 271 | } | |||
| 272 | ||||
| 273 | value = startswith(line, "__MONOTONIC_TIMESTAMP="); | |||
| 274 | if (value) { | |||
| 275 | uint64_t x; | |||
| 276 | ||||
| 277 | r = safe_atou64(value, &x); | |||
| 278 | if (r < 0) | |||
| 279 | return log_warning_errno(r, "Failed to parse __MONOTONIC_TIMESTAMP '%s': %m",({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 280, __func__, "Failed to parse __MONOTONIC_TIMESTAMP '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }) | |||
| 280 | cellescape(buf, sizeof buf, value))({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 280, __func__, "Failed to parse __MONOTONIC_TIMESTAMP '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }); | |||
| 281 | else if (!VALID_MONOTONIC(x)) { | |||
| 282 | log_warning("__MONOTONIC_TIMESTAMP out of range, ignoring: %"PRIu64, x)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 282, __func__, "__MONOTONIC_TIMESTAMP out of range, ignoring: %" "l" "u", x) : -abs(_e); }); | |||
| 283 | return -ERANGE34; | |||
| 284 | } | |||
| 285 | ||||
| 286 | imp->ts.monotonic = x; | |||
| 287 | return 1; | |||
| 288 | } | |||
| 289 | ||||
| 290 | /* Just a single underline, but it needs special treatment too. */ | |||
| 291 | value = startswith(line, "_BOOT_ID="); | |||
| 292 | if (value) { | |||
| 293 | r = sd_id128_from_string(value, &imp->boot_id); | |||
| 294 | if (r < 0) | |||
| 295 | return log_warning_errno(r, "Failed to parse _BOOT_ID '%s': %m",({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 296, __func__, "Failed to parse _BOOT_ID '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }) | |||
| 296 | cellescape(buf, sizeof buf, value))({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 296, __func__, "Failed to parse _BOOT_ID '%s': %m" , cellescape(buf, sizeof buf, value)) : -abs(_e); }); | |||
| 297 | ||||
| 298 | /* store the field in the usual fashion too */ | |||
| 299 | return 0; | |||
| 300 | } | |||
| 301 | ||||
| 302 | value = startswith(line, "__"); | |||
| 303 | if (value) { | |||
| 304 | log_notice("Unknown dunder line __%s, ignoring.", cellescape(buf, sizeof buf, value))({ int _level = (((5))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 304, __func__, "Unknown dunder line __%s, ignoring." , cellescape(buf, sizeof buf, value)) : -abs(_e); }); | |||
| 305 | return 1; | |||
| 306 | } | |||
| 307 | ||||
| 308 | /* no dunder */ | |||
| 309 | return 0; | |||
| 310 | } | |||
| 311 | ||||
| 312 | int journal_importer_process_data(JournalImporter *imp) { | |||
| 313 | int r; | |||
| 314 | ||||
| 315 | switch(imp->state) { | |||
| ||||
| 316 | case IMPORTER_STATE_LINE: { | |||
| 317 | char *line, *sep; | |||
| 318 | size_t n = 0; | |||
| 319 | ||||
| 320 | assert(imp->data_size == 0)do { if ((__builtin_expect(!!(!(imp->data_size == 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->data_size == 0" ), "../src/basic/journal-importer.c", 320, __PRETTY_FUNCTION__ ); } while (0); | |||
| 321 | ||||
| 322 | r = get_line(imp, &line, &n); | |||
| 323 | if (r < 0) | |||
| 324 | return r; | |||
| 325 | if (r == 0) { | |||
| 326 | imp->state = IMPORTER_STATE_EOF; | |||
| 327 | return 0; | |||
| 328 | } | |||
| 329 | assert(n > 0)do { if ((__builtin_expect(!!(!(n > 0)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("n > 0"), "../src/basic/journal-importer.c" , 329, __PRETTY_FUNCTION__); } while (0); | |||
| 330 | assert(line[n-1] == '\n')do { if ((__builtin_expect(!!(!(line[n-1] == '\n')),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("line[n-1] == '\\n'"), "../src/basic/journal-importer.c" , 330, __PRETTY_FUNCTION__); } while (0); | |||
| 331 | ||||
| 332 | if (n == 1) { | |||
| 333 | log_trace("Received empty line, event is ready")({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 333, __func__, "Received empty line, event is ready" ) : -abs(_e); }); | |||
| 334 | return 1; | |||
| 335 | } | |||
| 336 | ||||
| 337 | /* MESSAGE=xxx\n | |||
| 338 | or | |||
| 339 | COREDUMP\n | |||
| 340 | LLLLLLLL0011223344...\n | |||
| 341 | */ | |||
| 342 | sep = memchr(line, '=', n); | |||
| 343 | if (sep) { | |||
| 344 | /* chomp newline */ | |||
| 345 | n--; | |||
| 346 | ||||
| 347 | if (!journal_field_valid(line, sep - line, true1)) { | |||
| 348 | char buf[64], *t; | |||
| 349 | ||||
| 350 | t = strndupa(line, sep - line)(__extension__ ({ const char *__old = (line); size_t __len = strnlen (__old, (sep - line)); char *__new = (char *) __builtin_alloca (__len + 1); __new[__len] = '\0'; (char *) memcpy (__new, __old , __len); })); | |||
| 351 | log_debug("Ignoring invalid field: \"%s\"",({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 352, __func__, "Ignoring invalid field: \"%s\"" , cellescape(buf, sizeof buf, t)) : -abs(_e); }) | |||
| 352 | cellescape(buf, sizeof buf, t))({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 352, __func__, "Ignoring invalid field: \"%s\"" , cellescape(buf, sizeof buf, t)) : -abs(_e); }); | |||
| 353 | ||||
| 354 | return 0; | |||
| 355 | } | |||
| 356 | ||||
| 357 | line[n] = '\0'; | |||
| 358 | r = process_special_field(imp, line); | |||
| 359 | if (r != 0) | |||
| 360 | return r < 0 ? r : 0; | |||
| 361 | ||||
| 362 | r = iovw_put(&imp->iovw, line, n); | |||
| 363 | if (r < 0) | |||
| 364 | return r; | |||
| 365 | } else { | |||
| 366 | /* replace \n with = */ | |||
| 367 | line[n-1] = '='; | |||
| 368 | ||||
| 369 | imp->field_len = n; | |||
| 370 | imp->state = IMPORTER_STATE_DATA_START; | |||
| 371 | ||||
| 372 | /* we cannot put the field in iovec until we have all data */ | |||
| 373 | } | |||
| 374 | ||||
| 375 | log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary")({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 375, __func__, "Received: %.*s (%s)" , (int) n, line, sep ? "text" : "binary") : -abs(_e); }); | |||
| 376 | ||||
| 377 | return 0; /* continue */ | |||
| 378 | } | |||
| 379 | ||||
| 380 | case IMPORTER_STATE_DATA_START: | |||
| 381 | assert(imp->data_size == 0)do { if ((__builtin_expect(!!(!(imp->data_size == 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->data_size == 0" ), "../src/basic/journal-importer.c", 381, __PRETTY_FUNCTION__ ); } while (0); | |||
| 382 | ||||
| 383 | r = get_data_size(imp); | |||
| 384 | // log_debug("get_data_size() -> %d", r); | |||
| 385 | if (r < 0) | |||
| 386 | return r; | |||
| 387 | if (r == 0) { | |||
| 388 | imp->state = IMPORTER_STATE_EOF; | |||
| 389 | return 0; | |||
| 390 | } | |||
| 391 | ||||
| 392 | imp->state = imp->data_size > 0 ? | |||
| 393 | IMPORTER_STATE_DATA : IMPORTER_STATE_DATA_FINISH; | |||
| 394 | ||||
| 395 | return 0; /* continue */ | |||
| 396 | ||||
| 397 | case IMPORTER_STATE_DATA: { | |||
| 398 | void *data; | |||
| 399 | char *field; | |||
| 400 | ||||
| 401 | assert(imp->data_size > 0)do { if ((__builtin_expect(!!(!(imp->data_size > 0)),0) )) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->data_size > 0" ), "../src/basic/journal-importer.c", 401, __PRETTY_FUNCTION__ ); } while (0); | |||
| 402 | ||||
| 403 | r = get_data_data(imp, &data); | |||
| 404 | // log_debug("get_data_data() -> %d", r); | |||
| 405 | if (r
| |||
| 406 | return r; | |||
| 407 | if (r
| |||
| 408 | imp->state = IMPORTER_STATE_EOF; | |||
| 409 | return 0; | |||
| 410 | } | |||
| 411 | ||||
| 412 | assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("data"), "../src/basic/journal-importer.c" , 412, __PRETTY_FUNCTION__); } while (0); | |||
| ||||
| 413 | ||||
| 414 | field = (char*) data - sizeof(uint64_t) - imp->field_len; | |||
| 415 | memmove(field + sizeof(uint64_t), field, imp->field_len); | |||
| 416 | ||||
| 417 | r = iovw_put(&imp->iovw, field + sizeof(uint64_t), imp->field_len + imp->data_size); | |||
| 418 | if (r < 0) | |||
| 419 | return r; | |||
| 420 | ||||
| 421 | imp->state = IMPORTER_STATE_DATA_FINISH; | |||
| 422 | ||||
| 423 | return 0; /* continue */ | |||
| 424 | } | |||
| 425 | ||||
| 426 | case IMPORTER_STATE_DATA_FINISH: | |||
| 427 | r = get_data_newline(imp); | |||
| 428 | // log_debug("get_data_newline() -> %d", r); | |||
| 429 | if (r < 0) | |||
| 430 | return r; | |||
| 431 | if (r == 0) { | |||
| 432 | imp->state = IMPORTER_STATE_EOF; | |||
| 433 | return 0; | |||
| 434 | } | |||
| 435 | ||||
| 436 | imp->data_size = 0; | |||
| 437 | imp->state = IMPORTER_STATE_LINE; | |||
| 438 | ||||
| 439 | return 0; /* continue */ | |||
| 440 | default: | |||
| 441 | assert_not_reached("wtf?")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "wtf?"), "../src/basic/journal-importer.c", 441, __PRETTY_FUNCTION__ ); } while (0); | |||
| 442 | } | |||
| 443 | } | |||
| 444 | ||||
| 445 | int journal_importer_push_data(JournalImporter *imp, const char *data, size_t size) { | |||
| 446 | assert(imp)do { if ((__builtin_expect(!!(!(imp)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("imp"), "../src/basic/journal-importer.c" , 446, __PRETTY_FUNCTION__); } while (0); | |||
| 447 | assert(imp->state != IMPORTER_STATE_EOF)do { if ((__builtin_expect(!!(!(imp->state != IMPORTER_STATE_EOF )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("imp->state != IMPORTER_STATE_EOF" ), "../src/basic/journal-importer.c", 447, __PRETTY_FUNCTION__ ); } while (0); | |||
| 448 | ||||
| 449 | if (!realloc_buffer(imp, imp->filled + size)) { | |||
| 450 | log_error("Failed to store received data of size %zu "({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 452, __func__, "Failed to store received data of size %zu " "(in addition to existing %zu bytes with %zu filled): %s", size , imp->size, imp->filled, strerror(12)) : -abs(_e); }) | |||
| 451 | "(in addition to existing %zu bytes with %zu filled): %s",({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 452, __func__, "Failed to store received data of size %zu " "(in addition to existing %zu bytes with %zu filled): %s", size , imp->size, imp->filled, strerror(12)) : -abs(_e); }) | |||
| 452 | size, imp->size, imp->filled, strerror(ENOMEM))({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 452, __func__, "Failed to store received data of size %zu " "(in addition to existing %zu bytes with %zu filled): %s", size , imp->size, imp->filled, strerror(12)) : -abs(_e); }); | |||
| 453 | return -ENOMEM12; | |||
| 454 | } | |||
| 455 | ||||
| 456 | memcpy(imp->buf + imp->filled, data, size); | |||
| 457 | imp->filled += size; | |||
| 458 | ||||
| 459 | return 0; | |||
| 460 | } | |||
| 461 | ||||
| 462 | void journal_importer_drop_iovw(JournalImporter *imp) { | |||
| 463 | size_t remain, target; | |||
| 464 | ||||
| 465 | /* This function drops processed data that along with the iovw that points at it */ | |||
| 466 | ||||
| 467 | iovw_free_contents(&imp->iovw); | |||
| 468 | ||||
| 469 | /* possibly reset buffer position */ | |||
| 470 | remain = imp->filled - imp->offset; | |||
| 471 | ||||
| 472 | if (remain == 0) /* no brainer */ | |||
| 473 | imp->offset = imp->scanned = imp->filled = 0; | |||
| 474 | else if (imp->offset > imp->size - imp->filled && | |||
| 475 | imp->offset > remain) { | |||
| 476 | memcpy(imp->buf, imp->buf + imp->offset, remain); | |||
| 477 | imp->offset = imp->scanned = 0; | |||
| 478 | imp->filled = remain; | |||
| 479 | } | |||
| 480 | ||||
| 481 | target = imp->size; | |||
| 482 | while (target > 16 * LINE_CHUNK8*1024u && imp->filled < target / 2) | |||
| 483 | target /= 2; | |||
| 484 | if (target < imp->size) { | |||
| 485 | char *tmp; | |||
| 486 | ||||
| 487 | tmp = realloc(imp->buf, target); | |||
| 488 | if (!tmp) | |||
| 489 | log_warning("Failed to reallocate buffer to (smaller) size %zu",({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 490, __func__, "Failed to reallocate buffer to (smaller) size %zu" , target) : -abs(_e); }) | |||
| 490 | target)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 490, __func__, "Failed to reallocate buffer to (smaller) size %zu" , target) : -abs(_e); }); | |||
| 491 | else { | |||
| 492 | log_debug("Reallocated buffer from %zu to %zu bytes",({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 493, __func__, "Reallocated buffer from %zu to %zu bytes" , imp->size, target) : -abs(_e); }) | |||
| 493 | imp->size, target)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/basic/journal-importer.c", 493, __func__, "Reallocated buffer from %zu to %zu bytes" , imp->size, target) : -abs(_e); }); | |||
| 494 | imp->buf = tmp; | |||
| 495 | imp->size = target; | |||
| 496 | } | |||
| 497 | } | |||
| 498 | } | |||
| 499 | ||||
| 500 | bool_Bool journal_importer_eof(const JournalImporter *imp) { | |||
| 501 | return imp->state == IMPORTER_STATE_EOF; | |||
| 502 | } |