Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

address hfs on-disk corruption robustness review comments

Address Roman's review comments for the previously sent on-disk
corruption hfs robustness patch.

- use 0 as a failure value, rather than making a new macro HFS_BAD_KEYLEN,
and use a switch statement instead of if's.

- Add new fail: target to __hfs_brec_find to skip assignments using bad
values when exiting with a failure.

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Eric Sandeen and committed by
Linus Torvalds
55581d01 7c28cbae

+25 -18
+6 -5
fs/hfs/bfind.c
··· 52 52 rec = (e + b) / 2; 53 53 len = hfs_brec_lenoff(bnode, rec, &off); 54 54 keylen = hfs_brec_keylen(bnode, rec); 55 - if (keylen == HFS_BAD_KEYLEN) { 55 + if (keylen == 0) { 56 56 res = -EINVAL; 57 - goto done; 57 + goto fail; 58 58 } 59 59 hfs_bnode_read(bnode, fd->key, off, keylen); 60 60 cmpval = bnode->tree->keycmp(fd->key, fd->search_key); ··· 71 71 if (rec != e && e >= 0) { 72 72 len = hfs_brec_lenoff(bnode, e, &off); 73 73 keylen = hfs_brec_keylen(bnode, e); 74 - if (keylen == HFS_BAD_KEYLEN) { 74 + if (keylen == 0) { 75 75 res = -EINVAL; 76 - goto done; 76 + goto fail; 77 77 } 78 78 hfs_bnode_read(bnode, fd->key, off, keylen); 79 79 } ··· 83 83 fd->keylength = keylen; 84 84 fd->entryoffset = off + keylen; 85 85 fd->entrylength = len - keylen; 86 + fail: 86 87 return res; 87 88 } 88 89 ··· 207 206 208 207 len = hfs_brec_lenoff(bnode, fd->record, &off); 209 208 keylen = hfs_brec_keylen(bnode, fd->record); 210 - if (keylen == HFS_BAD_KEYLEN) { 209 + if (keylen == 0) { 211 210 res = -EINVAL; 212 211 goto out; 213 212 }
+2 -2
fs/hfs/brec.c
··· 49 49 if (retval > node->tree->max_key_len + 2) { 50 50 printk(KERN_ERR "hfs: keylen %d too large\n", 51 51 retval); 52 - retval = HFS_BAD_KEYLEN; 52 + retval = 0; 53 53 } 54 54 } else { 55 55 retval = (hfs_bnode_read_u8(node, recoff) | 1) + 1; 56 56 if (retval > node->tree->max_key_len + 1) { 57 57 printk(KERN_ERR "hfs: keylen %d too large\n", 58 58 retval); 59 - retval = HFS_BAD_KEYLEN; 59 + retval = 0; 60 60 } 61 61 } 62 62 }
+17 -9
fs/hfs/btree.c
··· 81 81 goto fail_page; 82 82 if (!tree->node_count) 83 83 goto fail_page; 84 - if ((id == HFS_EXT_CNID) && (tree->max_key_len != HFS_MAX_EXT_KEYLEN)) { 85 - printk(KERN_ERR "hfs: invalid extent max_key_len %d\n", 86 - tree->max_key_len); 87 - goto fail_page; 88 - } 89 - if ((id == HFS_CAT_CNID) && (tree->max_key_len != HFS_MAX_CAT_KEYLEN)) { 90 - printk(KERN_ERR "hfs: invalid catalog max_key_len %d\n", 91 - tree->max_key_len); 92 - goto fail_page; 84 + switch (id) { 85 + case HFS_EXT_CNID: 86 + if (tree->max_key_len != HFS_MAX_EXT_KEYLEN) { 87 + printk(KERN_ERR "hfs: invalid extent max_key_len %d\n", 88 + tree->max_key_len); 89 + goto fail_page; 90 + } 91 + break; 92 + case HFS_CAT_CNID: 93 + if (tree->max_key_len != HFS_MAX_CAT_KEYLEN) { 94 + printk(KERN_ERR "hfs: invalid catalog max_key_len %d\n", 95 + tree->max_key_len); 96 + goto fail_page; 97 + } 98 + break; 99 + default: 100 + BUG(); 93 101 } 94 102 95 103 tree->node_size_shift = ffs(size) - 1;
-2
fs/hfs/hfs.h
··· 28 28 #define HFS_MAX_NAMELEN 128 29 29 #define HFS_MAX_VALENCE 32767U 30 30 31 - #define HFS_BAD_KEYLEN 0xFF 32 - 33 31 /* Meanings of the drAtrb field of the MDB, 34 32 * Reference: _Inside Macintosh: Files_ p. 2-61 35 33 */