Skip to content

Commit

Permalink
[PATCH] ncpfs: ensure we free wdog_pid on parse_option or fill_inode …
Browse files Browse the repository at this point in the history
…failure

This took a little refactoring but now errors are handled cleanly.  When
this code used pid_t values this wasn't necessary because you can't
leak a pid_t.

Thanks to Peter Vandrovec for spotting this.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Peter Vandrovec <vandrove@vc.cvut.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Eric W. Biederman authored and Linus Torvalds committed Dec 13, 2006
1 parent 2154227 commit 1de2412
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions fs/ncpfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ static int ncp_parse_options(struct ncp_mount_data_kernel *data, char *options)
char *optarg;
unsigned long optint;
int version = 0;
int ret;

data->flags = 0;
data->int_flags = 0;
Expand All @@ -343,8 +344,9 @@ static int ncp_parse_options(struct ncp_mount_data_kernel *data, char *options)
data->mounted_vol[0] = 0;

while ((optval = ncp_getopt("ncpfs", &options, ncp_opts, NULL, &optarg, &optint)) != 0) {
if (optval < 0)
return optval;
ret = optval;
if (ret < 0)
goto err;
switch (optval) {
case 'u':
data->uid = optint;
Expand Down Expand Up @@ -380,18 +382,21 @@ static int ncp_parse_options(struct ncp_mount_data_kernel *data, char *options)
data->info_fd = optint;
break;
case 'v':
if (optint < NCP_MOUNT_VERSION_V4) {
return -ECHRNG;
}
if (optint > NCP_MOUNT_VERSION_V5) {
return -ECHRNG;
}
ret = -ECHRNG;
if (optint < NCP_MOUNT_VERSION_V4)
goto err;
if (optint > NCP_MOUNT_VERSION_V5)
goto err;
version = optint;
break;

}
}
return 0;
err:
put_pid(data->wdog_pid);
data->wdog_pid = NULL;
return ret;
}

static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
Expand All @@ -409,6 +414,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
#endif
struct ncp_entry_info finfo;

data.wdog_pid = NULL;
server = kzalloc(sizeof(struct ncp_server), GFP_KERNEL);
if (!server)
return -ENOMEM;
Expand Down Expand Up @@ -679,6 +685,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
*/
fput(ncp_filp);
out:
put_pid(data.wdog_pid);
sb->s_fs_info = NULL;
kfree(server);
return error;
Expand Down

0 comments on commit 1de2412

Please sign in to comment.