Commit a2d4e44b485222a8972ea9e555b148148c655bb9

Authored by ths
1 parent 3bcb80f1

Fix PCI config space overflow, by Herbert Xu.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2238 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 16 additions and 8 deletions
hw/pci.c
... ... @@ -242,16 +242,23 @@ uint32_t pci_default_read_config(PCIDevice *d,
242 242 uint32_t address, int len)
243 243 {
244 244 uint32_t val;
  245 +
245 246 switch(len) {
246   - case 1:
247   - val = d->config[address];
248   - break;
249   - case 2:
250   - val = le16_to_cpu(*(uint16_t *)(d->config + address));
251   - break;
252 247 default:
253 248 case 4:
254   - val = le32_to_cpu(*(uint32_t *)(d->config + address));
  249 + if (address <= 0xfc) {
  250 + val = le32_to_cpu(*(uint32_t *)(d->config + address));
  251 + break;
  252 + }
  253 + /* fall through */
  254 + case 2:
  255 + if (address <= 0xfe) {
  256 + val = le16_to_cpu(*(uint16_t *)(d->config + address));
  257 + break;
  258 + }
  259 + /* fall through */
  260 + case 1:
  261 + val = d->config[address];
255 262 break;
256 263 }
257 264 return val;
... ... @@ -341,7 +348,8 @@ void pci_default_write_config(PCIDevice *d,
341 348 if (can_write) {
342 349 d->config[addr] = val;
343 350 }
344   - addr++;
  351 + if (++addr > 0xff)
  352 + break;
345 353 val >>= 8;
346 354 }
347 355  
... ...