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

Commit 36b39a97 authored by Colin Cross's avatar Colin Cross Committed by Gerrit Code Review
Browse files

Merge "init: Fix get_hardware_name() to cope with long /proc/cpuinfo output"

parents 4a280e3d 229dc35f
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -405,7 +405,9 @@ void open_devnull_stdio(void)

void get_hardware_name(char *hardware, unsigned int *revision)
{
    char data[1024];
    const char *cpuinfo = "/proc/cpuinfo";
    char *data = NULL;
    size_t len = 0, limit = 1024;
    int fd, n;
    char *x, *hw, *rev;

@@ -413,14 +415,32 @@ void get_hardware_name(char *hardware, unsigned int *revision)
    if (hardware[0])
        return;

    fd = open("/proc/cpuinfo", O_RDONLY);
    fd = open(cpuinfo, O_RDONLY);
    if (fd < 0) return;

    n = read(fd, data, 1023);
    close(fd);
    if (n < 0) return;
    for (;;) {
        x = realloc(data, limit);
        if (!x) {
            ERROR("Failed to allocate memory to read %s\n", cpuinfo);
            goto done;
        }
        data = x;

        n = read(fd, data + len, limit - len);
        if (n < 0) {
            ERROR("Failed reading %s: %s (%d)\n", cpuinfo, strerror(errno), errno);
            goto done;
        }
        len += n;

        if (len < limit)
            break;

        /* We filled the buffer, so increase size and loop to read more */
        limit *= 2;
    }

    data[n] = 0;
    data[len] = 0;
    hw = strstr(data, "\nHardware");
    rev = strstr(data, "\nRevision");

@@ -445,6 +465,10 @@ void get_hardware_name(char *hardware, unsigned int *revision)
            *revision = strtoul(x + 2, 0, 16);
        }
    }

done:
    close(fd);
    free(data);
}

void import_kernel_cmdline(int in_qemu,