diff options
author | Thierry Vignaud <tv@mageia.org> | 2013-01-14 20:24:32 +0000 |
---|---|---|
committer | Thierry Vignaud <tv@mageia.org> | 2013-01-14 20:24:32 +0000 |
commit | cd134962064d824cb883c082d563bb7b7325827f (patch) | |
tree | 212a56caca3a5cc819869f0a648109c7c8fb3f76 /usb.c | |
parent | a3d75c7c9d9aac00d72aef6088a9c2cd415bc213 (diff) | |
download | ldetect-cd134962064d824cb883c082d563bb7b7325827f.tar ldetect-cd134962064d824cb883c082d563bb7b7325827f.tar.gz ldetect-cd134962064d824cb883c082d563bb7b7325827f.tar.bz2 ldetect-cd134962064d824cb883c082d563bb7b7325827f.tar.xz ldetect-cd134962064d824cb883c082d563bb7b7325827f.zip |
dynamically resize memory when reaching max devices limit (mga#8320)
Diffstat (limited to 'usb.c')
-rw-r--r-- | usb.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -44,6 +44,7 @@ extern struct pciusb_entries usb_probe(void) { struct pciusb_entries r; struct pciusb_entry *e = NULL; char *vendor_text = NULL, *product_text = NULL; + size_t allocated = MAX_DEVICES; r.nb = 0; names_init("/usr/share/usb.ids"); @@ -63,7 +64,11 @@ extern struct pciusb_entries usb_probe(void) { r.entries = malloc(sizeof(struct pciusb_entry) * MAX_DEVICES); /* for further information on the format parsed by this state machine, * read /usr/share/doc/kernel-doc-X.Y.Z/usb/proc_usb_info.txt */ - for(line = 1; fgets(buf, sizeof(buf) - 1, f) && r.nb < MAX_DEVICES; line++) { + for(line = 1; fgets(buf, sizeof(buf) - 1, f); line++) { + if (r.nb >= allocated) { + allocated = r.nb*2; + r.entries = realloc(r.entries, sizeof(struct pciusb_entry) * allocated); + } switch (buf[0]) { case 'T': { |