2002-02-01 17:45:57

by Eduardo Pereira Habkost

[permalink] [raw]
Subject: [PATCH] Fixes supermount Oopses when mount options are not given

The following patch fixes two Oopses on supermount.
The first one happens when the dev= option is not given to supermount, iput()
is called after dput(), but iput() is already called by dput().
The other one happens when the fs= option is not given. subfs_mount() doesn't
check if sbi->s_type is NULL.

Regards,

--
Eduardo Pereira Habkost <[email protected]>
http://www.boto.f2s.com
04BE D2EF 5A56 E446 D424 4785 71A4 49EB AC35 9568
----

# ------------------------
diff -urN kernel-2.4.17/linux/fs/supermount/super.c kernel-2.4.17-supermountok/linux/fs/supermount/super.c
--- kernel-2.4.17/linux/fs/supermount/super.c Fri Feb 1 14:10:39 2002
+++ kernel-2.4.17-supermountok/linux/fs/supermount/super.c Fri Feb 1 11:56:36 2002
@@ -276,7 +276,7 @@
char **type = types_in_order;


- if (strcmp(sbi->s_type, "auto"))
+ if (sbi->s_type && strcmp(sbi->s_type, "auto"))
return subfs_real_mount2 (sb, sbi->s_type);

while (*type && retval) {
diff -urN kernel-2.4.17/linux/fs/supermount/super_operations.c kernel-2.4.17-supermountok/linux/fs/supermount/super_operations.c
--- kernel-2.4.17/linux/fs/supermount/super_operations.c Fri Feb 1 14:10:39 2002
+++ kernel-2.4.17-supermountok/linux/fs/supermount/super_operations.c Fri Feb 1 11:56:36 2002
@@ -279,10 +279,12 @@
return s;
fail_parsing:
s->s_dev = 0;
- dput (root);
fail_allocating_root:
supermount_debug ("get root dentry failed");
- iput (root_inode);
+ if(root)
+ dput (root);
+ else
+ iput (root_inode);
free_sbi (sbi);
fail_no_memory:
return NULL;


Attachments:
(No filename) (1.50 kB)
(No filename) (232.00 B)
Download all attachments

2002-02-01 17:51:17

by Juan Quintela

[permalink] [raw]
Subject: Re: [PATCH] Fixes supermount Oopses when mount options are not given

>>>>> "eduardo" == Eduardo Pereira Habkost <[email protected]> writes:

eduardo> The following patch fixes two Oopses on supermount.
eduardo> The first one happens when the dev= option is not given to supermount, iput()
eduardo> is called after dput(), but iput() is already called by dput().
eduardo> The other one happens when the fs= option is not given. subfs_mount() doesn't
eduardo> check if sbi->s_type is NULL.

eduardo> Regards,

eduardo> --
eduardo> Eduardo Pereira Habkost <[email protected]>
eduardo> http://www.boto.f2s.com
eduardo> 04BE D2EF 5A56 E446 D424 4785 71A4 49EB AC35 9568
eduardo> ----

eduardo> # ------------------------
eduardo> diff -urN kernel-2.4.17/linux/fs/supermount/super.c kernel-2.4.17-supermountok/linux/fs/supermount/super.c
eduardo> --- kernel-2.4.17/linux/fs/supermount/super.c Fri Feb 1 14:10:39 2002
eduardo> +++ kernel-2.4.17-supermountok/linux/fs/supermount/super.c Fri Feb 1 11:56:36 2002
eduardo> @@ -276,7 +276,7 @@
eduardo> char **type = types_in_order;


eduardo> - if (strcmp(sbi->s_type, "auto"))
eduardo> + if (sbi->s_type && strcmp(sbi->s_type, "auto"))
eduardo> return subfs_real_mount2 (sb, sbi->s_type);

eduardo> while (*type && retval) {
eduardo> diff -urN kernel-2.4.17/linux/fs/supermount/super_operations.c kernel-2.4.17-supermountok/linux/fs/supermount/super_operations.c
eduardo> --- kernel-2.4.17/linux/fs/supermount/super_operations.c Fri Feb 1 14:10:39 2002
eduardo> +++ kernel-2.4.17-supermountok/linux/fs/supermount/super_operations.c Fri Feb 1 11:56:36 2002
eduardo> @@ -279,10 +279,12 @@
eduardo> return s;
eduardo> fail_parsing:
s-> s_dev = 0;
eduardo> - dput (root);
eduardo> fail_allocating_root:
eduardo> supermount_debug ("get root dentry failed");
eduardo> - iput (root_inode);
eduardo> + if(root)
eduardo> + dput (root);
eduardo> + else
eduardo> + iput (root_inode);
eduardo> free_sbi (sbi);
eduardo> fail_no_memory:
eduardo> return NULL;

THanks a lot.

Later, Juan.

--
In theory, practice and theory are the same, but in practice they
are different -- Larry McVoy