* [PATCH] make udf/{file,super}.c check return codes (247)
@ 2001-07-23 21:14 Rasmus Andersen
0 siblings, 0 replies; only message in thread
From: Rasmus Andersen @ 2001-07-23 21:14 UTC (permalink / raw)
To: bfennema, dave; +Cc: linux-kernel
Hi.
The following patch makes fs/udf/{file,super}.c check the
return code of bread and udf_read_tagged. Comments welcome
as I never felt real sure on this. It applies against
246ac5 and 247. These unguarded dereferences were reported
by the Stanford team a while back.
diff -ur linux-247-clean/fs/udf/file.c linux-247/fs/udf/file.c
--- linux-247-clean/fs/udf/file.c Tue Jun 12 04:15:27 2001
+++ linux-247/fs/udf/file.c Mon Jul 23 22:33:39 2001
@@ -50,6 +50,7 @@
struct buffer_head *bh;
int block;
char *kaddr;
+ int ret = 0;
if (!PageLocked(page))
PAGE_BUG(page);
@@ -58,13 +59,18 @@
memset(kaddr, 0, PAGE_CACHE_SIZE);
block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize);
+ if (!bh) {
+ ret = - EIO;
+ goto err_out;
+ }
memcpy(kaddr, bh->b_data + udf_ext0_offset(inode), inode->i_size);
brelse(bh);
flush_dcache_page(page);
SetPageUptodate(page);
+err_out:
kunmap(page);
UnlockPage(page);
- return 0;
+ return ret;
}
static int udf_adinicb_writepage(struct page *page)
@@ -74,6 +80,7 @@
struct buffer_head *bh;
int block;
char *kaddr;
+ int ret = 0;
if (!PageLocked(page))
PAGE_BUG(page);
@@ -81,13 +88,18 @@
kaddr = kmap(page);
block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize);
+ if (!bh) {
+ ret = -EIO;
+ goto err_out;
+ }
memcpy(bh->b_data + udf_ext0_offset(inode), kaddr, inode->i_size);
mark_buffer_dirty(bh);
brelse(bh);
SetPageUptodate(page);
+err_out:
kunmap(page);
UnlockPage(page);
- return 0;
+ return ret;
}
static int udf_adinicb_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
@@ -103,19 +115,25 @@
struct buffer_head *bh;
int block;
char *kaddr = page_address(page);
+ int ret = 0;
block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize);
+ if (!bh) {
+ ret = -EIO;
+ goto err_out;
+ }
memcpy(bh->b_data + udf_file_entry_alloc_offset(inode) + offset,
kaddr + offset, to-offset);
mark_buffer_dirty(bh);
brelse(bh);
SetPageUptodate(page);
- kunmap(page);
/* only one page here */
if (to > inode->i_size)
inode->i_size = to;
- return 0;
+err_out:
+ kunmap(page);
+ return ret;
}
struct address_space_operations udf_adinicb_aops = {
diff -ur linux-247-clean/fs/udf/super.c linux-247/fs/udf/super.c
--- linux-247-clean/fs/udf/super.c Tue Jun 12 04:15:27 2001
+++ linux-247/fs/udf/super.c Mon Jul 23 22:57:49 2001
@@ -1121,6 +1121,8 @@
for (j=vds[i].block+1; j<vds[VDS_POS_TERMINATING_DESC].block; j++)
{
bh2 = udf_read_tagged(sb, j, j, &ident);
+ if (!bh2)
+ break;
gd = (struct GenericDesc *)bh2->b_data;
if (ident == TID_PARTITION_DESC)
udf_load_partdesc(sb, bh2);
@@ -1255,6 +1257,8 @@
pos = udf_block_map(UDF_SB_VAT(sb), 0);
bh = bread(sb->s_dev, pos, sb->s_blocksize);
+ if (!bh)
+ return 1;
UDF_SB_TYPEVIRT(sb,i).s_start_offset =
le16_to_cpu(((struct VirtualAllocationTable20 *)bh->b_data + udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) +
udf_ext0_offset(UDF_SB_VAT(sb));
--
Regards,
Rasmus(rasmus@jaquet.dk)
"Women are like a beer. They look good,
they taste good, and as soon as you've
had one, you want another." -Homer Simpson
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2001-07-23 21:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-07-23 21:14 [PATCH] make udf/{file,super}.c check return codes (247) Rasmus Andersen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).