summaryrefslogtreecommitdiffstats
path: root/usb.c
diff options
context:
space:
mode:
authorThierry Vignaud <tv@mageia.org>2013-01-14 20:24:32 +0000
committerThierry Vignaud <tv@mageia.org>2013-01-14 20:24:32 +0000
commitcd134962064d824cb883c082d563bb7b7325827f (patch)
tree212a56caca3a5cc819869f0a648109c7c8fb3f76 /usb.c
parenta3d75c7c9d9aac00d72aef6088a9c2cd415bc213 (diff)
downloadldetect-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.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/usb.c b/usb.c
index c275a89..6a52fe9 100644
--- a/usb.c
+++ b/usb.c
@@ -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': {