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

Reply via email to