@@ -215,35 +215,31 @@ static struct inode *parse_longname(const struct inode *parent,
215
215
struct ceph_client * cl = ceph_inode_to_client (parent );
216
216
struct inode * dir = NULL ;
217
217
struct ceph_vino vino = { .snap = CEPH_NOSNAP };
218
- char * inode_number ;
219
- char * name_end ;
220
- int orig_len = * name_len ;
218
+ char * name_end , * inode_number ;
221
219
int ret = - EIO ;
222
-
220
+ /* NUL-terminate */
221
+ char * str __free (kfree ) = kmemdup_nul (name , * name_len , GFP_KERNEL );
222
+ if (!str )
223
+ return ERR_PTR (- ENOMEM );
223
224
/* Skip initial '_' */
224
- name ++ ;
225
- name_end = strrchr (name , '_' );
225
+ str ++ ;
226
+ name_end = strrchr (str , '_' );
226
227
if (!name_end ) {
227
- doutc (cl , "failed to parse long snapshot name: %s\n" , name );
228
+ doutc (cl , "failed to parse long snapshot name: %s\n" , str );
228
229
return ERR_PTR (- EIO );
229
230
}
230
- * name_len = (name_end - name );
231
+ * name_len = (name_end - str );
231
232
if (* name_len <= 0 ) {
232
233
pr_err_client (cl , "failed to parse long snapshot name\n" );
233
234
return ERR_PTR (- EIO );
234
235
}
235
236
236
237
/* Get the inode number */
237
- inode_number = kmemdup_nul (name_end + 1 ,
238
- orig_len - * name_len - 2 ,
239
- GFP_KERNEL );
240
- if (!inode_number )
241
- return ERR_PTR (- ENOMEM );
238
+ inode_number = name_end + 1 ;
242
239
ret = kstrtou64 (inode_number , 10 , & vino .ino );
243
240
if (ret ) {
244
- doutc (cl , "failed to parse inode number: %s\n" , name );
245
- dir = ERR_PTR (ret );
246
- goto out ;
241
+ doutc (cl , "failed to parse inode number: %s\n" , str );
242
+ return ERR_PTR (ret );
247
243
}
248
244
249
245
/* And finally the inode */
@@ -254,50 +250,37 @@ static struct inode *parse_longname(const struct inode *parent,
254
250
if (IS_ERR (dir ))
255
251
doutc (cl , "can't find inode %s (%s)\n" , inode_number , name );
256
252
}
257
-
258
- out :
259
- kfree (inode_number );
260
253
return dir ;
261
254
}
262
255
263
- int ceph_encode_encrypted_dname (struct inode * parent , struct qstr * d_name ,
264
- char * buf )
256
+ int ceph_encode_encrypted_dname (struct inode * parent , char * buf , int elen )
265
257
{
266
258
struct ceph_client * cl = ceph_inode_to_client (parent );
267
259
struct inode * dir = parent ;
268
- struct qstr iname ;
260
+ char * p = buf ;
269
261
u32 len ;
270
- int name_len ;
271
- int elen ;
262
+ int name_len = elen ;
272
263
int ret ;
273
264
u8 * cryptbuf = NULL ;
274
265
275
- iname .name = d_name -> name ;
276
- name_len = d_name -> len ;
277
-
278
266
/* Handle the special case of snapshot names that start with '_' */
279
- if ((ceph_snap (dir ) == CEPH_SNAPDIR ) && (name_len > 0 ) &&
280
- (iname .name [0 ] == '_' )) {
281
- dir = parse_longname (parent , iname .name , & name_len );
267
+ if (ceph_snap (dir ) == CEPH_SNAPDIR && * p == '_' ) {
268
+ dir = parse_longname (parent , p , & name_len );
282
269
if (IS_ERR (dir ))
283
270
return PTR_ERR (dir );
284
- iname . name ++ ; /* skip initial '_' */
271
+ p ++ ; /* skip initial '_' */
285
272
}
286
- iname .len = name_len ;
287
273
288
- if (!fscrypt_has_encryption_key (dir )) {
289
- memcpy (buf , d_name -> name , d_name -> len );
290
- elen = d_name -> len ;
274
+ if (!fscrypt_has_encryption_key (dir ))
291
275
goto out ;
292
- }
293
276
294
277
/*
295
278
* Convert cleartext d_name to ciphertext. If result is longer than
296
279
* CEPH_NOHASH_NAME_MAX, sha256 the remaining bytes
297
280
*
298
281
* See: fscrypt_setup_filename
299
282
*/
300
- if (!fscrypt_fname_encrypted_size (dir , iname . len , NAME_MAX , & len )) {
283
+ if (!fscrypt_fname_encrypted_size (dir , name_len , NAME_MAX , & len )) {
301
284
elen = - ENAMETOOLONG ;
302
285
goto out ;
303
286
}
@@ -310,7 +293,9 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
310
293
goto out ;
311
294
}
312
295
313
- ret = fscrypt_fname_encrypt (dir , & iname , cryptbuf , len );
296
+ ret = fscrypt_fname_encrypt (dir ,
297
+ & (struct qstr )QSTR_INIT (p , name_len ),
298
+ cryptbuf , len );
314
299
if (ret ) {
315
300
elen = ret ;
316
301
goto out ;
@@ -331,18 +316,13 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
331
316
}
332
317
333
318
/* base64 encode the encrypted name */
334
- elen = ceph_base64_encode (cryptbuf , len , buf );
335
- doutc (cl , "base64-encoded ciphertext name = %.*s\n" , elen , buf );
319
+ elen = ceph_base64_encode (cryptbuf , len , p );
320
+ doutc (cl , "base64-encoded ciphertext name = %.*s\n" , elen , p );
336
321
337
322
/* To understand the 240 limit, see CEPH_NOHASH_NAME_MAX comments */
338
323
WARN_ON (elen > 240 );
339
- if ((elen > 0 ) && (dir != parent )) {
340
- char tmp_buf [NAME_MAX ];
341
-
342
- elen = snprintf (tmp_buf , sizeof (tmp_buf ), "_%.*s_%ld" ,
343
- elen , buf , dir -> i_ino );
344
- memcpy (buf , tmp_buf , elen );
345
- }
324
+ if (dir != parent ) // leading _ is already there; append _<inum>
325
+ elen += 1 + sprintf (p + elen , "_%ld" , dir -> i_ino );
346
326
347
327
out :
348
328
kfree (cryptbuf );
@@ -355,14 +335,6 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
355
335
return elen ;
356
336
}
357
337
358
- int ceph_encode_encrypted_fname (struct inode * parent , struct dentry * dentry ,
359
- char * buf )
360
- {
361
- WARN_ON_ONCE (!fscrypt_has_encryption_key (parent ));
362
-
363
- return ceph_encode_encrypted_dname (parent , & dentry -> d_name , buf );
364
- }
365
-
366
338
/**
367
339
* ceph_fname_to_usr - convert a filename for userland presentation
368
340
* @fname: ceph_fname to be converted
0 commit comments