rem: char *p = buf + offset + 1;
add: char *p = strdupa(buf + offset + 1);
context: extern int pciusb_find_modules(struct pciusb_entries entries, const char *fpciusbtable, int no_subid) {  fh f;  char buf[2048];  int line;  char *share_path = getenv("SHARE_PATH");  char *fname;  if (!share_path || !*share_path) share_path = "/usr/share";  fname = alloca(strlen(share_path) + sizeof("/ldetect-lst/") + strlen(fpciusbtable));   sprintf(fname, "%s/ldetect-lst/%s", share_path, fpciusbtable);  f = fh_open(fname);  for (line = 1; fgets(buf, sizeof(buf) - 1, f.f); line++) {    unsigned short vendor, device, subvendor, subdevice;    int offset, i;    int nb = sscanf(buf, "0x%hx\t0x%hx\t0x%hx\t0x%hx\t%n", &vendor, &device, &subvendor, &subdevice, &offset);    if (nb != 4) {      nb = sscanf(buf, "0x%hx\t0x%hx\t%n", &vendor, &device, &offset);      if (nb != 2) {	if (buf[0] != '#') fprintf(stderr, "%s %d: bad line\n", fpciusbtable, line);	continue;      }    }    for (i = 0; i < entries.nb; i++) {      struct pciusb_entry *e = &entries.entries[i];      if (vendor == e->vendor && device == e->device) {	if (nb == 4 && e->subvendor == 0xffff && e->subdevice == 0xffff && !no_subid) {	  pciusb_free(entries);	  fh_close(f);	  return 0; /* leave, let the caller call again with subids */	}	if ((nb != 4 || (subvendor == e->subvendor && subdevice == e->subdevice)) && !e->module) {	  char *p = buf + offset + 1;	  char *q = strchr(p, '\t');	  if (q) {	    q[-1] = 0;	    q[strlen(q)-2] = 0;	    ifree(e->module); ifree(e->text);	    e->module = strcmp(p, "unknown") ? strdup(p) : NULL;	    e->text = strdup(q+2);	  }	}      }          }  }  fh_close(f);  return 1;}