diff options
author | Colin Cross <ccross@android.com> | 2013-09-18 21:38:33 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-09-18 21:38:33 +0000 |
commit | 36b39a97f3fc5790538e2e69429043b78ba486e4 (patch) | |
tree | c4a6835e6dfb998999cf24a57e0f0775494860e7 /init | |
parent | 4a280e3dbe002bb5419ec010f89cdc158244e435 (diff) | |
parent | 229dc35f699f144e5e3ccd8062bba8f6e650cfdc (diff) | |
download | system_core-36b39a97f3fc5790538e2e69429043b78ba486e4.zip system_core-36b39a97f3fc5790538e2e69429043b78ba486e4.tar.gz system_core-36b39a97f3fc5790538e2e69429043b78ba486e4.tar.bz2 |
Merge "init: Fix get_hardware_name() to cope with long /proc/cpuinfo output"
Diffstat (limited to 'init')
-rw-r--r-- | init/util.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/init/util.c b/init/util.c index 078b99b..9aaa77d 100644 --- a/init/util.c +++ b/init/util.c @@ -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, |