diff options
| author | Kulikov Vasiliy <segooon@gmail.com> | 2010-08-10 21:02:04 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-11 11:59:06 -0400 |
| commit | 89596f20bb5f0f32c37abd337d995080e04519c8 (patch) | |
| tree | a4e0c01a5c8fa779229c6277aa7f836a1c09f2cf /drivers/message | |
| parent | d929dc2bfd8a58c34f1df0680018fa8ea5caa907 (diff) | |
i2o: check return code from put_user()
Check return value of put_user() and return -EFAULT if it failed.
Original comment "We did a get user...so assuming mem is ok...is this
bad?" is incorrect because memory can be read only.
Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/message')
| -rw-r--r-- | drivers/message/i2o/i2o_config.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c index 4dd39a03082a..068ba0785bb4 100644 --- a/drivers/message/i2o/i2o_config.c +++ b/drivers/message/i2o/i2o_config.c | |||
| @@ -111,9 +111,9 @@ static int i2o_cfg_gethrt(unsigned long arg) | |||
| 111 | 111 | ||
| 112 | len = 8 + ((hrt->entry_len * hrt->num_entries) << 2); | 112 | len = 8 + ((hrt->entry_len * hrt->num_entries) << 2); |
| 113 | 113 | ||
| 114 | /* We did a get user...so assuming mem is ok...is this bad? */ | 114 | if (put_user(len, kcmd.reslen)) |
| 115 | put_user(len, kcmd.reslen); | 115 | ret = -EFAULT; |
| 116 | if (len > reslen) | 116 | else if (len > reslen) |
| 117 | ret = -ENOBUFS; | 117 | ret = -ENOBUFS; |
| 118 | else if (copy_to_user(kcmd.resbuf, (void *)hrt, len)) | 118 | else if (copy_to_user(kcmd.resbuf, (void *)hrt, len)) |
| 119 | ret = -EFAULT; | 119 | ret = -EFAULT; |
| @@ -147,8 +147,9 @@ static int i2o_cfg_getlct(unsigned long arg) | |||
| 147 | lct = (i2o_lct *) c->lct; | 147 | lct = (i2o_lct *) c->lct; |
| 148 | 148 | ||
| 149 | len = (unsigned int)lct->table_size << 2; | 149 | len = (unsigned int)lct->table_size << 2; |
| 150 | put_user(len, kcmd.reslen); | 150 | if (put_user(len, kcmd.reslen)) |
| 151 | if (len > reslen) | 151 | ret = -EFAULT; |
| 152 | else if (len > reslen) | ||
| 152 | ret = -ENOBUFS; | 153 | ret = -ENOBUFS; |
| 153 | else if (copy_to_user(kcmd.resbuf, lct, len)) | 154 | else if (copy_to_user(kcmd.resbuf, lct, len)) |
| 154 | ret = -EFAULT; | 155 | ret = -EFAULT; |
| @@ -208,8 +209,9 @@ static int i2o_cfg_parms(unsigned long arg, unsigned int type) | |||
| 208 | return -EAGAIN; | 209 | return -EAGAIN; |
| 209 | } | 210 | } |
| 210 | 211 | ||
| 211 | put_user(len, kcmd.reslen); | 212 | if (put_user(len, kcmd.reslen)) |
| 212 | if (len > reslen) | 213 | ret = -EFAULT; |
| 214 | else if (len > reslen) | ||
| 213 | ret = -ENOBUFS; | 215 | ret = -ENOBUFS; |
| 214 | else if (copy_to_user(kcmd.resbuf, res, len)) | 216 | else if (copy_to_user(kcmd.resbuf, res, len)) |
| 215 | ret = -EFAULT; | 217 | ret = -EFAULT; |
