2009-07-13 13:50:17

by Abhishek Kulkarni

[permalink] [raw]
Subject: [PATCH] [net/9p] Possible regression in p9_client_stat

Fix a possible regression with p9_client_stat where it can try to kfree an ERR_PTR
after an erroneous p9pdu_readf. Also remove an unnecessary data buffer increment
in p9_client_read.

Signed-off-by: Abhishek Kulkarni <[email protected]>
---
:100644 100644 dd43a82... cc25e63... M net/9p/client.c
net/9p/client.c | 7 ++-----
1 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/net/9p/client.c b/net/9p/client.c
index dd43a82..cc25e63 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -1098,7 +1098,6 @@ p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset,

if (data) {
memmove(data, dataptr, count);
- data += count;
}

if (udata) {
@@ -1192,9 +1191,9 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)

err = p9pdu_readf(req->rc, clnt->dotu, "wS", &ignored, ret);
if (err) {
- ret = ERR_PTR(err);
p9pdu_dump(1, req->rc);
- goto free_and_error;
+ p9_free_req(clnt, req);
+ goto error;
}

P9_DPRINTK(P9_DEBUG_9P,
@@ -1211,8 +1210,6 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)
p9_free_req(clnt, req);
return ret;

-free_and_error:
- p9_free_req(clnt, req);
error:
kfree(ret);
return ERR_PTR(err);
--
1.6.0.4


2009-07-13 13:50:21

by Abhishek Kulkarni

[permalink] [raw]
Subject: [PATCH] [net/9p]: default 9p transport module fix

The default 9p transport module is not chosen unless an option parameter (any)
is passed to mount, which thus returns a ENOPROTOSUPPORT. This fix moves the
check out of parse_opts into p9_client_create.

Signed-off-by: Abhishek Kulkarni <[email protected]>
---
:100644 100644 cc25e63... 787ccdd... M net/9p/client.c
net/9p/client.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/9p/client.c b/net/9p/client.c
index cc25e63..787ccdd 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -117,9 +117,6 @@ static int parse_opts(char *opts, struct p9_client *clnt)
}
}

- if (!clnt->trans_mod)
- clnt->trans_mod = v9fs_get_default_trans();
-
kfree(options);
return ret;
}
@@ -689,6 +686,9 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
if (err < 0)
goto error;

+ if (!clnt->trans_mod)
+ clnt->trans_mod = v9fs_get_default_trans();
+
if (clnt->trans_mod == NULL) {
err = -EPROTONOSUPPORT;
P9_DPRINTK(P9_DEBUG_ERROR,
--
1.6.0.4

2009-07-14 18:29:24

by Eric Van Hensbergen

[permalink] [raw]
Subject: Re: [PATCH] [net/9p]: default 9p transport module fix

applied v9fs-devel

On Mon, Jul 13, 2009 at 8:49 AM, Abhishek Kulkarni<[email protected]> wrote:
> The default 9p transport module is not chosen unless an option parameter (any)
> is passed to mount, which thus returns a ENOPROTOSUPPORT. This fix moves the
> check out of parse_opts into p9_client_create.
>
> Signed-off-by: Abhishek Kulkarni <[email protected]>
> ---
> :100644 100644 cc25e63... 787ccdd... M ?net/9p/client.c
> ?net/9p/client.c | ? ?6 +++---
> ?1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/net/9p/client.c b/net/9p/client.c
> index cc25e63..787ccdd 100644
> --- a/net/9p/client.c
> +++ b/net/9p/client.c
> @@ -117,9 +117,6 @@ static int parse_opts(char *opts, struct p9_client *clnt)
> ? ? ? ? ? ? ? ?}
> ? ? ? ?}
>
> - ? ? ? if (!clnt->trans_mod)
> - ? ? ? ? ? ? ? clnt->trans_mod = v9fs_get_default_trans();
> -
> ? ? ? ?kfree(options);
> ? ? ? ?return ret;
> ?}
> @@ -689,6 +686,9 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
> ? ? ? ?if (err < 0)
> ? ? ? ? ? ? ? ?goto error;
>
> + ? ? ? if (!clnt->trans_mod)
> + ? ? ? ? ? ? ? clnt->trans_mod = v9fs_get_default_trans();
> +
> ? ? ? ?if (clnt->trans_mod == NULL) {
> ? ? ? ? ? ? ? ?err = -EPROTONOSUPPORT;
> ? ? ? ? ? ? ? ?P9_DPRINTK(P9_DEBUG_ERROR,
> --
> 1.6.0.4
>
>

2009-07-14 18:30:00

by Eric Van Hensbergen

[permalink] [raw]
Subject: Re: [PATCH] [net/9p] Possible regression in p9_client_stat

applied v9fs-devel

On Mon, Jul 13, 2009 at 8:49 AM, Abhishek Kulkarni<[email protected]> wrote:
> Fix a possible regression with p9_client_stat where it can try to kfree an ERR_PTR
> after an erroneous p9pdu_readf. Also remove an unnecessary data buffer increment
> in p9_client_read.
>
> Signed-off-by: Abhishek Kulkarni <[email protected]>
> ---
> :100644 100644 dd43a82... cc25e63... M ?net/9p/client.c
> ?net/9p/client.c | ? ?7 ++-----
> ?1 files changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/net/9p/client.c b/net/9p/client.c
> index dd43a82..cc25e63 100644
> --- a/net/9p/client.c
> +++ b/net/9p/client.c
> @@ -1098,7 +1098,6 @@ p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset,
>
> ? ? ? ?if (data) {
> ? ? ? ? ? ? ? ?memmove(data, dataptr, count);
> - ? ? ? ? ? ? ? data += count;
> ? ? ? ?}
>
> ? ? ? ?if (udata) {
> @@ -1192,9 +1191,9 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)
>
> ? ? ? ?err = p9pdu_readf(req->rc, clnt->dotu, "wS", &ignored, ret);
> ? ? ? ?if (err) {
> - ? ? ? ? ? ? ? ret = ERR_PTR(err);
> ? ? ? ? ? ? ? ?p9pdu_dump(1, req->rc);
> - ? ? ? ? ? ? ? goto free_and_error;
> + ? ? ? ? ? ? ? p9_free_req(clnt, req);
> + ? ? ? ? ? ? ? goto error;
> ? ? ? ?}
>
> ? ? ? ?P9_DPRINTK(P9_DEBUG_9P,
> @@ -1211,8 +1210,6 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)
> ? ? ? ?p9_free_req(clnt, req);
> ? ? ? ?return ret;
>
> -free_and_error:
> - ? ? ? p9_free_req(clnt, req);
> ?error:
> ? ? ? ?kfree(ret);
> ? ? ? ?return ERR_PTR(err);
> --
> 1.6.0.4
>
>