diff options
| author | Phillip Lougher <phillip@squashfs.org.uk> | 2011-12-28 22:50:20 -0500 |
|---|---|---|
| committer | Phillip Lougher <phillip@squashfs.org.uk> | 2011-12-29 20:20:14 -0500 |
| commit | e552a596687bf0e1802c744a7bb113afbd2bf4d4 (patch) | |
| tree | 3080861e7587446872ed1886c2b2d031680a1b04 /fs/squashfs | |
| parent | 5f0a6e2d503896062f641639dacfe5055c2f593b (diff) | |
Squashfs: add missing block release on error condition
squashfs_read_metadata forgets to release the cache block if
an error has occurred.
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Diffstat (limited to 'fs/squashfs')
| -rw-r--r-- | fs/squashfs/cache.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index f744be98cd5a..ea6e798e548b 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c | |||
| @@ -332,17 +332,20 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer, | |||
| 332 | u64 *block, int *offset, int length) | 332 | u64 *block, int *offset, int length) |
| 333 | { | 333 | { |
| 334 | struct squashfs_sb_info *msblk = sb->s_fs_info; | 334 | struct squashfs_sb_info *msblk = sb->s_fs_info; |
| 335 | int bytes, copied = length; | 335 | int bytes, res = length; |
| 336 | struct squashfs_cache_entry *entry; | 336 | struct squashfs_cache_entry *entry; |
| 337 | 337 | ||
| 338 | TRACE("Entered squashfs_read_metadata [%llx:%x]\n", *block, *offset); | 338 | TRACE("Entered squashfs_read_metadata [%llx:%x]\n", *block, *offset); |
| 339 | 339 | ||
| 340 | while (length) { | 340 | while (length) { |
| 341 | entry = squashfs_cache_get(sb, msblk->block_cache, *block, 0); | 341 | entry = squashfs_cache_get(sb, msblk->block_cache, *block, 0); |
| 342 | if (entry->error) | 342 | if (entry->error) { |
| 343 | return entry->error; | 343 | res = entry->error; |
| 344 | else if (*offset >= entry->length) | 344 | goto error; |
| 345 | return -EIO; | 345 | } else if (*offset >= entry->length) { |
| 346 | res = -EIO; | ||
| 347 | goto error; | ||
| 348 | } | ||
| 346 | 349 | ||
| 347 | bytes = squashfs_copy_data(buffer, entry, *offset, length); | 350 | bytes = squashfs_copy_data(buffer, entry, *offset, length); |
| 348 | if (buffer) | 351 | if (buffer) |
| @@ -358,7 +361,11 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer, | |||
| 358 | squashfs_cache_put(entry); | 361 | squashfs_cache_put(entry); |
| 359 | } | 362 | } |
| 360 | 363 | ||
| 361 | return copied; | 364 | return res; |
| 365 | |||
| 366 | error: | ||
| 367 | squashfs_cache_put(entry); | ||
| 368 | return res; | ||
| 362 | } | 369 | } |
| 363 | 370 | ||
| 364 | 371 | ||
