commit 62a3e65b6c7a35888c37a2246d9cf2192e35ef4c
Author: Yiannis Pericleous <[EMAIL PROTECTED]>
Date: Mon Mar 26 16:20:54 2007 -0400
error checking on odf_read/write_sb_data
diff --git a/fs/unionfs/odf.c b/fs/unionfs/odf.c
index 3918c4c..4c7dadb 100644
--- a/fs/unionfs/odf.c
+++ b/fs/unionfs/odf.c
@@ -1033,11 +1033,19 @@ int odf_write_sb_data(struct odf_sb_info* osi, struct
unionfs_data *data, struct
/* version */
le32 = (ODF_VERSION_MAJOR<<16) | (ODF_VERSION_MINOR);
le32 = cpu_to_le32(le32);
- file->f_op->write(file, (char*)&le32, sizeof(__le32), &file->f_pos);
+ err = file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
/* number of branches */
le32 = cpu_to_le32(branches);
- file->f_op->write(file, (char*)&le32, sizeof(__le32), &file->f_pos);
+ err = file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
buuid = kmalloc(branches * sizeof(u32), GFP_KERNEL);
uuid = kmalloc(branches * UUID_LEN, GFP_KERNEL);
@@ -1070,17 +1078,46 @@ int odf_write_sb_data(struct odf_sb_info* osi, struct
unionfs_data *data, struct
memcpy(uuid + count * UUID_LEN, uuid + i * UUID_LEN,
UUID_LEN);
buuid[count] = (u32)m;
- /* write */
+ /* write branch ids */
le32 = cpu_to_le32(data[bindex].branch_id);
- file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ err = file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* path length */
le32 = cpu_to_le32(len);
- file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
- file->f_op->write(file, name, strlen(name), &file->f_pos);
+ err = file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* absolute path */
+ err = file->f_op->write(file, name, len, &file->f_pos);
+ if (err != len) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* permissions */
le32 = cpu_to_le32(data[bindex].branchperms);
- file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
- file->f_op->write(file, (char*)uuid + count * UUID_LEN,
UUID_LEN, &file->f_pos);
+ err = file->f_op->write(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* branch uuid */
+ err = file->f_op->write(file, (char*)uuid + count * UUID_LEN,
UUID_LEN, &file->f_pos);
+ if (err != UUID_LEN) {
+ err = -EIO;
+ goto out_close;
+ }
count++;
}
+ err = 0;
out_close:
set_fs(oldfs);
@@ -1145,9 +1182,14 @@ char *odf_read_sb_data(struct odf_sb_info *odf_sb, int
**bid)
set_fs(KERNEL_DS);
/* version */
- file->f_op->read(file, (char*)&le32, sizeof(__le32), &file->f_pos);
- /* check version - dont allow greater than current */
+ err = file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
version = le32_to_cpu(le32);
+
+ /* check version - dont allow greater than current */
if (((version >> 16) > ODF_VERSION_MAJOR) ||
(((version >> 16) == ODF_VERSION_MAJOR) &&
(version & 0x0000FFFF) > ODF_VERSION_MINOR)) {
@@ -1156,7 +1198,11 @@ char *odf_read_sb_data(struct odf_sb_info *odf_sb, int
**bid)
}
/* branch count */
- file->f_op->read(file, (char*)&le32, sizeof(__le32), &file->f_pos);
+ err = file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
count = le32_to_cpu(le32);
if (count <= 0) {
@@ -1172,14 +1218,49 @@ char *odf_read_sb_data(struct odf_sb_info *odf_sb, int
**bid)
i = 0;
while (i < count) {
- file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ /* branch id */
+ err = file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
(*bid)[i] = le32_to_cpu(le32);
- file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+
+ /* path length */
+ err = file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
len = le32_to_cpu(le32);
- file->f_op->read(file, ptr, len, &file->f_pos);
- file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (len <= 0) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* path, read it to the options string */
+ err = file->f_op->read(file, ptr, len, &file->f_pos);
+ if (err != sizeof(len)) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* permissions*/
+ err = file->f_op->read(file, (char*)&le32, sizeof(__le32),
&file->f_pos);
+ if (err != sizeof(__le32)) {
+ err = -EIO;
+ goto out_close;
+ }
perms = le32_to_cpu(le32);
+
+ /* branch uuid*/
file->f_op->read(file, (char*)uuid, UUID_LEN, &file->f_pos);
+ if (err != UUID_LEN) {
+ err = -EIO;
+ goto out_close;
+ }
+
+ /* add the branch permissions to the options string */
ptr+=len;
if (perms == MAY_READ)
sprintf(ptr,"=ro:");
@@ -1188,6 +1269,7 @@ char *odf_read_sb_data(struct odf_sb_info *odf_sb, int
**bid)
ptr+=strlen(ptr);
i++;
}
+ err = 0;
set_fs(oldfs);
filp_close(file,NULL);
goto out;
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs