diff options
Diffstat (limited to 'fs/jffs2/readinode.c')
-rw-r--r-- | fs/jffs2/readinode.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index dc0437e8476..1ea349fff68 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c | |||
@@ -1266,19 +1266,25 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
1266 | /* Symlink's inode data is the target path. Read it and | 1266 | /* Symlink's inode data is the target path. Read it and |
1267 | * keep in RAM to facilitate quick follow symlink | 1267 | * keep in RAM to facilitate quick follow symlink |
1268 | * operation. */ | 1268 | * operation. */ |
1269 | f->target = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL); | 1269 | uint32_t csize = je32_to_cpu(latest_node->csize); |
1270 | if (csize > JFFS2_MAX_NAME_LEN) { | ||
1271 | mutex_unlock(&f->sem); | ||
1272 | jffs2_do_clear_inode(c, f); | ||
1273 | return -ENAMETOOLONG; | ||
1274 | } | ||
1275 | f->target = kmalloc(csize + 1, GFP_KERNEL); | ||
1270 | if (!f->target) { | 1276 | if (!f->target) { |
1271 | JFFS2_ERROR("can't allocate %d bytes of memory for the symlink target path cache\n", je32_to_cpu(latest_node->csize)); | 1277 | JFFS2_ERROR("can't allocate %u bytes of memory for the symlink target path cache\n", csize); |
1272 | mutex_unlock(&f->sem); | 1278 | mutex_unlock(&f->sem); |
1273 | jffs2_do_clear_inode(c, f); | 1279 | jffs2_do_clear_inode(c, f); |
1274 | return -ENOMEM; | 1280 | return -ENOMEM; |
1275 | } | 1281 | } |
1276 | 1282 | ||
1277 | ret = jffs2_flash_read(c, ref_offset(rii.latest_ref) + sizeof(*latest_node), | 1283 | ret = jffs2_flash_read(c, ref_offset(rii.latest_ref) + sizeof(*latest_node), |
1278 | je32_to_cpu(latest_node->csize), &retlen, (char *)f->target); | 1284 | csize, &retlen, (char *)f->target); |
1279 | 1285 | ||
1280 | if (ret || retlen != je32_to_cpu(latest_node->csize)) { | 1286 | if (ret || retlen != csize) { |
1281 | if (retlen != je32_to_cpu(latest_node->csize)) | 1287 | if (retlen != csize) |
1282 | ret = -EIO; | 1288 | ret = -EIO; |
1283 | kfree(f->target); | 1289 | kfree(f->target); |
1284 | f->target = NULL; | 1290 | f->target = NULL; |
@@ -1287,7 +1293,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
1287 | return ret; | 1293 | return ret; |
1288 | } | 1294 | } |
1289 | 1295 | ||
1290 | f->target[je32_to_cpu(latest_node->csize)] = '\0'; | 1296 | f->target[csize] = '\0'; |
1291 | dbg_readinode("symlink's target '%s' cached\n", f->target); | 1297 | dbg_readinode("symlink's target '%s' cached\n", f->target); |
1292 | } | 1298 | } |
1293 | 1299 | ||
@@ -1415,6 +1421,7 @@ int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *i | |||
1415 | mutex_unlock(&f->sem); | 1421 | mutex_unlock(&f->sem); |
1416 | jffs2_do_clear_inode(c, f); | 1422 | jffs2_do_clear_inode(c, f); |
1417 | } | 1423 | } |
1424 | jffs2_xattr_do_crccheck_inode(c, ic); | ||
1418 | kfree (f); | 1425 | kfree (f); |
1419 | return ret; | 1426 | return ret; |
1420 | } | 1427 | } |