diff options
Diffstat (limited to 'fs/udf/dir.c')
-rw-r--r-- | fs/udf/dir.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/udf/dir.c b/fs/udf/dir.c index 541d9c65014d..b51b371b874a 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c | |||
@@ -45,7 +45,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx) | |||
45 | int block, iblock; | 45 | int block, iblock; |
46 | loff_t nf_pos; | 46 | loff_t nf_pos; |
47 | int flen; | 47 | int flen; |
48 | unsigned char *fname = NULL; | 48 | unsigned char *fname = NULL, *copy_name = NULL; |
49 | unsigned char *nameptr; | 49 | unsigned char *nameptr; |
50 | uint16_t liu; | 50 | uint16_t liu; |
51 | uint8_t lfi; | 51 | uint8_t lfi; |
@@ -143,7 +143,15 @@ static int udf_readdir(struct file *file, struct dir_context *ctx) | |||
143 | if (poffset >= lfi) { | 143 | if (poffset >= lfi) { |
144 | nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); | 144 | nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); |
145 | } else { | 145 | } else { |
146 | nameptr = fname; | 146 | if (!copy_name) { |
147 | copy_name = kmalloc(UDF_NAME_LEN, | ||
148 | GFP_NOFS); | ||
149 | if (!copy_name) { | ||
150 | ret = -ENOMEM; | ||
151 | goto out; | ||
152 | } | ||
153 | } | ||
154 | nameptr = copy_name; | ||
147 | memcpy(nameptr, fi->fileIdent + liu, | 155 | memcpy(nameptr, fi->fileIdent + liu, |
148 | lfi - poffset); | 156 | lfi - poffset); |
149 | memcpy(nameptr + lfi - poffset, | 157 | memcpy(nameptr + lfi - poffset, |
@@ -185,6 +193,7 @@ out: | |||
185 | brelse(fibh.sbh); | 193 | brelse(fibh.sbh); |
186 | brelse(epos.bh); | 194 | brelse(epos.bh); |
187 | kfree(fname); | 195 | kfree(fname); |
196 | kfree(copy_name); | ||
188 | 197 | ||
189 | return ret; | 198 | return ret; |
190 | } | 199 | } |