Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 441054aa authored by Tom Cherry's avatar Tom Cherry
Browse files

Remove old logger_entry_v* formats

logger_entry and logger_entry_v2 were used for the kernel logger,
which we have long since deprecated.  logger_entry_v3 is the same as
logger_entry_v4 without a uid field, so it is trivially removable,
especially since we're now always providing uids in log messages.

liblog and logd already get updated in sync with each other, so we
have no reason for backwards compatibility with their format.

Test: build, unit tests
Change-Id: I27c90609f28c8d826e5614fdb3fe59bde22b5042
parent 896fb9e5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -595,7 +595,7 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned
      }
      AndroidLogEntry e;
      char buf[512];
      if (android_log_processBinaryLogBuffer(&log_entry.entry_v1, &e, g_eventTagMap, buf,
      if (android_log_processBinaryLogBuffer(&log_entry.entry, &e, g_eventTagMap, buf,
                                             sizeof(buf)) == 0) {
        _LOG(log, logtype::LOGS, "%s.%03d %5d %5d %c %-8.*s: %s\n", timeBuf,
             log_entry.entry.nsec / 1000000, log_entry.entry.pid, log_entry.entry.tid, 'I',
+4 −59
Original line number Diff line number Diff line
@@ -50,53 +50,9 @@ extern "C" {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wzero-length-array"
/*
 * The userspace structure for version 1 of the logger_entry ABI.
 */
struct logger_entry {
  uint16_t len;      /* length of the payload */
  uint16_t __pad; /* no matter what, we get 2 bytes of padding */
  int32_t pid;    /* generating process's pid */
  int32_t tid;    /* generating process's tid */
  int32_t sec;    /* seconds since Epoch */
  int32_t nsec;   /* nanoseconds */
  char msg[0]; /* the entry's payload */
};

/*
 * The userspace structure for version 2 of the logger_entry ABI.
 */
struct logger_entry_v2 {
  uint16_t len;      /* length of the payload */
  uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */
  int32_t pid;       /* generating process's pid */
  int32_t tid;       /* generating process's tid */
  int32_t sec;       /* seconds since Epoch */
  int32_t nsec;      /* nanoseconds */
  uint32_t euid;     /* effective UID of logger */
  char msg[0]; /* the entry's payload */
} __attribute__((__packed__));

/*
 * The userspace structure for version 3 of the logger_entry ABI.
 */
struct logger_entry_v3 {
  uint16_t len;      /* length of the payload */
  uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */
  int32_t pid;       /* generating process's pid */
  int32_t tid;       /* generating process's tid */
  int32_t sec;       /* seconds since Epoch */
  int32_t nsec;      /* nanoseconds */
  uint32_t lid;      /* log id of the payload */
  char msg[0]; /* the entry's payload */
} __attribute__((__packed__));

/*
 * The userspace structure for version 4 of the logger_entry ABI.
 */
struct logger_entry_v4 {
  uint16_t len;      /* length of the payload */
  uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */
  uint16_t hdr_size; /* sizeof(struct logger_entry) */
  int32_t pid;       /* generating process's pid */
  uint32_t tid;      /* generating process's tid */
  uint32_t sec;      /* seconds since Epoch */
@@ -124,11 +80,7 @@ struct logger_entry_v4 {
struct log_msg {
  union {
    unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
    struct logger_entry_v4 entry;
    struct logger_entry_v4 entry_v4;
    struct logger_entry_v3 entry_v3;
    struct logger_entry_v2 entry_v2;
    struct logger_entry entry_v1;
    struct logger_entry entry;
  } __attribute__((aligned(4)));
#ifdef __cplusplus
  /* Matching log_time operators */
@@ -162,19 +114,12 @@ struct log_msg {
  }
  char* msg() {
    unsigned short hdr_size = entry.hdr_size;
    if (!hdr_size) {
      hdr_size = sizeof(entry_v1);
    }
    if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) {
    if (hdr_size != sizeof(entry)) {
      return nullptr;
    }
    return reinterpret_cast<char*>(buf) + hdr_size;
  }
  unsigned int len() {
    return (entry.hdr_size ? entry.hdr_size
                           : static_cast<uint16_t>(sizeof(entry_v1))) +
           entry.len;
  }
  unsigned int len() { return entry.hdr_size + entry.len; }
#endif
};

+9 −17
Original line number Diff line number Diff line
@@ -273,34 +273,26 @@ static int android_transport_read(struct android_log_logger_list* logger_list,
                                  struct log_msg* log_msg) {
  int ret = (*transp->transport->read)(logger_list, transp, log_msg);

  if (ret < 0) {
    return ret;
  }

  if (ret > (int)sizeof(*log_msg)) {
    ret = sizeof(*log_msg);
  }

  transp->ret = ret;

  /* propagate errors, or make sure len & hdr_size members visible */
  if (ret < (int)(sizeof(log_msg->entry.len) + sizeof(log_msg->entry.hdr_size))) {
    if (ret >= (int)sizeof(log_msg->entry.len)) {
      log_msg->entry.len = 0;
    }
    return ret;
  if (ret < static_cast<int>(sizeof(log_msg->entry))) {
    return -EINVAL;
  }

  /* hdr_size correction (logger_entry -> logger_entry_v2+ conversion) */
  if (log_msg->entry_v2.hdr_size == 0) {
    log_msg->entry_v2.hdr_size = sizeof(struct logger_entry);
  }
  if ((log_msg->entry_v2.hdr_size < sizeof(log_msg->entry_v1)) ||
      (log_msg->entry_v2.hdr_size > sizeof(log_msg->entry))) {
  if (log_msg->entry.hdr_size != sizeof(log_msg->entry)) {
    return -EINVAL;
  }

  /* len validation */
  if (ret <= log_msg->entry_v2.hdr_size) {
    log_msg->entry.len = 0;
  } else {
    log_msg->entry.len = ret - log_msg->entry_v2.hdr_size;
  if (log_msg->entry.len > ret - log_msg->entry.hdr_size) {
    return -EINVAL;
  }

  return ret;
+12 −33
Original line number Diff line number Diff line
@@ -532,18 +532,12 @@ int android_log_processLogBuffer(struct logger_entry* buf, AndroidLogEntry* entr

  int i;
  char* msg = buf->msg;
  struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf;
  if (buf2->hdr_size) {
    if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) ||
        (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) {
  if (buf->hdr_size != sizeof(struct logger_entry)) {
    fprintf(stderr, "+++ LOG: entry illegal hdr_size\n");
    return -1;
  }
    msg = ((char*)buf2) + buf2->hdr_size;
    if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) {
      entry->uid = ((struct logger_entry_v4*)buf)->uid;
    }
  }
  entry->uid = buf->uid;

  for (i = 1; i < buf->len; i++) {
    if (msg[i] == '\0') {
      if (msgStart == -1) {
@@ -993,27 +987,15 @@ int android_log_processBinaryLogBuffer(
  entry->pid = buf->pid;
  entry->tid = buf->tid;

  /*
   * Pull the tag out, fill in some additional details based on incoming
   * buffer version (v3 adds lid, v4 adds uid).
   */
  eventData = (const unsigned char*)buf->msg;
  struct logger_entry_v2* buf2 = (struct logger_entry_v2*)buf;
  if (buf2->hdr_size) {
    if ((buf2->hdr_size < sizeof(((struct log_msg*)NULL)->entry_v1)) ||
        (buf2->hdr_size > sizeof(((struct log_msg*)NULL)->entry))) {
  if (buf->hdr_size != sizeof(struct logger_entry)) {
    fprintf(stderr, "+++ LOG: entry illegal hdr_size\n");
    return -1;
  }
    eventData = ((unsigned char*)buf2) + buf2->hdr_size;
    if ((buf2->hdr_size >= sizeof(struct logger_entry_v3)) &&
        (((struct logger_entry_v3*)buf)->lid == LOG_ID_SECURITY)) {
  if (buf->lid == LOG_ID_SECURITY) {
    entry->priority = ANDROID_LOG_WARN;
  }
    if (buf2->hdr_size >= sizeof(struct logger_entry_v4)) {
      entry->uid = ((struct logger_entry_v4*)buf)->uid;
    }
  }
  entry->uid = buf->uid;
  inCount = buf->len;
  if (inCount < sizeof(android_event_header_t)) return -1;
  auto* event_header = reinterpret_cast<const android_event_header_t*>(eventData);
@@ -1069,9 +1051,6 @@ int android_log_processBinaryLogBuffer(
  if ((result == 1) && fmtStr) {
    /* We overflowed :-(, let's repaint the line w/o format dressings */
    eventData = (const unsigned char*)buf->msg;
    if (buf2->hdr_size) {
      eventData = ((unsigned char*)buf2) + buf2->hdr_size;
    }
    eventData += 4;
    outBuf = messageBuf;
    outRemaining = messageBufLen - 1;
+14 −14
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ static int pmsgRead(struct android_log_logger_list* logger_list,
          ((logger_list->start.tv_sec != buf.l.realtime.tv_sec) ||
           (logger_list->start.tv_nsec <= buf.l.realtime.tv_nsec)))) &&
        (!logger_list->pid || (logger_list->pid == buf.p.pid))) {
      char* msg = log_msg->entry_v4.msg;
      char* msg = log_msg->entry.msg;
      *msg = buf.prio;
      fd = atomic_load(&transp->context.fd);
      if (fd <= 0) {
@@ -158,16 +158,16 @@ static int pmsgRead(struct android_log_logger_list* logger_list,
        return -EIO;
      }

      log_msg->entry_v4.len = buf.p.len - sizeof(buf) + sizeof(buf.prio);
      log_msg->entry_v4.hdr_size = sizeof(log_msg->entry_v4);
      log_msg->entry_v4.pid = buf.p.pid;
      log_msg->entry_v4.tid = buf.l.tid;
      log_msg->entry_v4.sec = buf.l.realtime.tv_sec;
      log_msg->entry_v4.nsec = buf.l.realtime.tv_nsec;
      log_msg->entry_v4.lid = buf.l.id;
      log_msg->entry_v4.uid = buf.p.uid;
      log_msg->entry.len = buf.p.len - sizeof(buf) + sizeof(buf.prio);
      log_msg->entry.hdr_size = sizeof(log_msg->entry);
      log_msg->entry.pid = buf.p.pid;
      log_msg->entry.tid = buf.l.tid;
      log_msg->entry.sec = buf.l.realtime.tv_sec;
      log_msg->entry.nsec = buf.l.realtime.tv_nsec;
      log_msg->entry.lid = buf.l.id;
      log_msg->entry.uid = buf.p.uid;

      return ret + sizeof(buf.prio) + log_msg->entry_v4.hdr_size;
      return ret + sizeof(buf.prio) + log_msg->entry.hdr_size;
    }

    fd = atomic_load(&transp->context.fd);
@@ -215,7 +215,7 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
  struct android_log_transport_context transp;
  struct content {
    struct listnode node;
    struct logger_entry_v4 entry;
    struct logger_entry entry;
  } * content;
  struct names {
    struct listnode node;
@@ -269,12 +269,12 @@ ssize_t __android_log_pmsg_file_read(log_id_t logId, char prio, const char* pref
  /* Read the file content */
  while (pmsgRead(&logger_list, &transp, &transp.logMsg) > 0) {
    const char* cp;
    size_t hdr_size = transp.logMsg.entry.hdr_size ? transp.logMsg.entry.hdr_size
                                                   : sizeof(transp.logMsg.entry_v1);
    size_t hdr_size = transp.logMsg.entry.hdr_size;

    char* msg = (char*)&transp.logMsg + hdr_size;
    const char* split = NULL;

    if ((hdr_size < sizeof(transp.logMsg.entry_v1)) || (hdr_size > sizeof(transp.logMsg.entry))) {
    if (hdr_size != sizeof(transp.logMsg.entry)) {
      continue;
    }
    /* Check for invalid sequence number */
Loading