aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/dir.c')
-rw-r--r--fs/udf/dir.c13
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}