*/
typedef int (*service_reader_t)(struct logger *server, struct reader *reader);
+#define LARGEST_STRUCT(a, b) (sizeof(struct a) > sizeof(struct b) ? sizeof(struct a) : sizeof(struct b))
struct writer {
struct fd_entity fd_entity;
struct log_buffer* buf_ptr;
unsigned readed;
service_writer_t service_writer;
service_socket_t service_socket;
- char buffer[LOG_MAX_SIZE];
+ char buffer[LOG_MAX_PAYLOAD_SIZE + LARGEST_STRUCT(android_logger_entry, pipe_logger_entry)];
};
+#undef LARGEST_STRUCT
/**
* @brief Service reader
int dumpcount;
struct timespec last_read_time;
int partial_log_size;
- char partial_log[LOG_MAX_SIZE];
+ char partial_log[sizeof(struct logger_entry_with_msg)];
service_reader_t service_reader;
};
assert(reader->buf_ptr);
int r, ret = 0;
- struct logger_entry* ple;
- char tmp[LOG_MAX_SIZE];
+ struct logger_entry_with_msg lem;
char * tag;
unsigned from = reader->current;
log_entry entry;
}
while (from != reader->buf_ptr->tail && (!reader->dumpcount || (reader->bytes_to_read > 0))) {
- typeof(ple->len) length;
+ typeof(lem.header.len) length;
copy_from_buffer(&length, from, sizeof length, reader->buf_ptr);
- copy_from_buffer(tmp, from, length, reader->buf_ptr);
- ple = (struct logger_entry*)tmp;
+ copy_from_buffer(&lem, from, length, reader->buf_ptr);
- from += ple->len;
+ from += lem.header.len;
from %= reader->buf_ptr->size;
if (reader->dumpcount) {
- if (reader->bytes_to_read > ple->len)
- reader->bytes_to_read -= ple->len;
+ if (reader->bytes_to_read > lem.header.len)
+ reader->bytes_to_read -= lem.header.len;
else
reader->bytes_to_read = 0;
}
if (plaintext) {
- logfile_write_with_rotation(ple, &reader->file);
+ logfile_write_with_rotation(&lem.header, &reader->file);
continue;
}
- tag = ple->msg + 1;
+ tag = lem.msg + 1;
if (!strlen(tag))
continue;
- if (log_process_log_buffer(ple, &entry) || !log_should_print_line(reader->file.format, &entry))
+ if (log_process_log_buffer(&lem.header, &entry) || !log_should_print_line(reader->file.format, &entry))
continue;
- r = write(reader->file.path ? reader->file.fd : reader->fd_entity.fd, ple, ple->len);
+ r = write(reader->file.path ? reader->file.fd : reader->fd_entity.fd, &lem, lem.header.len);
if (r < 0) {
if (errno == EPIPE)
ret = 1;
}
reader->file.size += r;
- if (r < ple->len) {
- reader->partial_log_size = ple->len - r;
- memcpy(reader->partial_log, ple + r, reader->partial_log_size);
+ if (r < lem.header.len) {
+ reader->partial_log_size = lem.header.len - r;
+ memcpy(reader->partial_log, ((char *)&lem) + r, reader->partial_log_size);
goto cleanup;
} else if (logfile_rotate_needed(&reader->file) > 0) {
logfile_do_rotate(&reader->file);
{
assert(reader);
- static char buffer[LOG_MAX_SIZE + 1];
struct logger_entry_with_msg entry;
+ static char buffer[sizeof entry + 1];
buffer[sizeof buffer - 1] = '\0';
/* The devices for both KMSG and Android Logger only return one log per read().
assert(event);
if (event->events & EPOLLIN)
- r = read(wr->fd_entity.fd, wr->buffer + wr->readed, LOG_MAX_SIZE - wr->readed);
+ r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
if ((r == 0 || r == -1) && event->events & EPOLLHUP)
return -EINVAL;
if (r <= 0)
return r;
- r = read(wr->fd_entity.fd, wr->buffer + wr->readed, LOG_MAX_SIZE - wr->readed);
+ r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
} while (r > 0 || ((wr->readed >= sizeof(msg->length) && wr->readed >= msg->length)));
return (r >= 0 || errno == EAGAIN) ? 0 : r;
static int service_writer_pipe(struct logger *server, struct writer *wr, struct epoll_event *event)
{
if (event->events & EPOLLIN) {
- int r = read(wr->fd_entity.fd, wr->buffer + wr->readed, LOG_MAX_SIZE - wr->readed);
+ int r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
if (r == -1 && errno == EAGAIN)
return 0;
struct pipe_logger_entry *const ple = (struct pipe_logger_entry *const)wr->buffer;
while ((wr->readed >= sizeof(ple->len)) && (ple->len <= wr->readed)) {
- if (ple->len < sizeof(struct pipe_logger_entry) || ple->len > LOG_MAX_SIZE)
+ const int payload_size = ple->len - sizeof *ple;
+ if (payload_size < 0 || payload_size > LOG_MAX_PAYLOAD_SIZE)
return -EINVAL;
struct logger_entry_with_msg lem;
add_recv_timestamp(&lem.header);
buffer_append(&lem.header, wr->buf_ptr);
wr->readed -= ple->len;
- memmove(wr->buffer, wr->buffer + ple->len, LOG_MAX_SIZE - ple->len);
+ memmove(wr->buffer, wr->buffer + ple->len, sizeof wr->buffer - ple->len);
}
} else if (event->events & EPOLLHUP)
return -EBADF;
if (!(event->events & EPOLLIN))
return 0;
- int r = read(wr->fd_entity.fd, wr->buffer, LOG_MAX_SIZE - 1);
+ int r = read(wr->fd_entity.fd, wr->buffer, sizeof wr->buffer - 1);
if (r == -1 && (errno == EAGAIN || errno == EPIPE))
return 0;
if (!(event->events & EPOLLIN))
return 0;
- int r = read(wr->fd_entity.fd, wr->buffer, LOG_MAX_SIZE - 1);
+ int r = read(wr->fd_entity.fd, wr->buffer, sizeof wr->buffer - 1);
if (r == -1 && (errno == EAGAIN || errno == EPIPE))
return 0;
wr->buffer[r] = '\0';
- char buffer[LOG_MAX_SIZE];
- if (parse_syslog_datagram(wr->buffer, r + 1, (struct logger_entry *) buffer)) {
+ struct logger_entry_with_msg lem;
+ if (parse_syslog_datagram(wr->buffer, r + 1, &lem.header)) {
/* don't return parse error as writers are removed then */
return 0;
}
- struct logger_entry * entry = (struct logger_entry*) buffer;
- add_recv_timestamp(entry);
- buffer_append(entry, wr->buf_ptr);
+ add_recv_timestamp(&lem.header);
+ buffer_append(&lem.header, wr->buf_ptr);
return 0;
}
assert(tag);
assert(prio >= DLOG_VERBOSE);
assert(prio < DLOG_PRIO_MAX);
- assert(strlen(tag) + strlen(msg) + sizeof(struct pipe_logger_entry) + 2 < LOG_MAX_SIZE);
+ assert(1 /* priority */ + strlen(tag) + 1 /* NULL delimiter */ + strlen(msg) + 1 /* NULL terminator */ <= LOG_MAX_PAYLOAD_SIZE);
struct pipe_logger_entry *ple = (struct pipe_logger_entry *) buf;
struct timespec ts;
*/
int parse_kmsg_message(char * buffer, int buffer_size)
{
- static char buffer_temp[LOG_MAX_SIZE];
+ static char buffer_temp[LOG_MAX_PAYLOAD_SIZE];
struct logger_entry le;
unsigned long long timestamp;
char * tag_begin, * pri_begin, * msg_begin;
prio = strtol(pri_begin, NULL, 10);
struct logger_entry * buf_le = (struct logger_entry *) buffer;
- buf_le->len = 1 + snprintf(buffer_temp, LOG_MAX_SIZE - 1, "%c%s", prio, tag_begin);
- buf_le->len += 1 + snprintf(buffer_temp + buf_le->len, LOG_MAX_SIZE - 1 - buf_le->len, "%s", msg_begin);
+ buf_le->len = 1 + snprintf(buffer_temp, sizeof buffer_temp - 1, "%c%s", prio, tag_begin);
+ buf_le->len += 1 + snprintf(buffer_temp + buf_le->len, sizeof buffer_temp - 1 - buf_le->len, "%s", msg_begin);
memcpy(buf_le->msg, buffer_temp, buf_le->len);
buf_le->len += sizeof(struct logger_entry);
void parse_androidlogger_message(struct android_logger_entry *ale, struct logger_entry *le, size_t dgram_size)
{
const size_t payload_size = dgram_size - sizeof *ale;
+ assert(payload_size <= LOG_MAX_PAYLOAD_SIZE);
le->len = sizeof *le + payload_size;
le->pid = ale->pid;