@@ -215,35 +215,31 @@ static struct inode *parse_longname(const struct inode *parent,
215215 struct ceph_client * cl = ceph_inode_to_client (parent );
216216 struct inode * dir = NULL ;
217217 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 ;
221219 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 );
223224 /* Skip initial '_' */
224- name ++ ;
225- name_end = strrchr (name , '_' );
225+ str ++ ;
226+ name_end = strrchr (str , '_' );
226227 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 );
228229 return ERR_PTR (- EIO );
229230 }
230- * name_len = (name_end - name );
231+ * name_len = (name_end - str );
231232 if (* name_len <= 0 ) {
232233 pr_err_client (cl , "failed to parse long snapshot name\n" );
233234 return ERR_PTR (- EIO );
234235 }
235236
236237 /* 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 ;
242239 ret = kstrtou64 (inode_number , 10 , & vino .ino );
243240 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 );
247243 }
248244
249245 /* And finally the inode */
@@ -254,50 +250,37 @@ static struct inode *parse_longname(const struct inode *parent,
254250 if (IS_ERR (dir ))
255251 doutc (cl , "can't find inode %s (%s)\n" , inode_number , name );
256252 }
257-
258- out :
259- kfree (inode_number );
260253 return dir ;
261254}
262255
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 )
265257{
266258 struct ceph_client * cl = ceph_inode_to_client (parent );
267259 struct inode * dir = parent ;
268- struct qstr iname ;
260+ char * p = buf ;
269261 u32 len ;
270- int name_len ;
271- int elen ;
262+ int name_len = elen ;
272263 int ret ;
273264 u8 * cryptbuf = NULL ;
274265
275- iname .name = d_name -> name ;
276- name_len = d_name -> len ;
277-
278266 /* 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 );
282269 if (IS_ERR (dir ))
283270 return PTR_ERR (dir );
284- iname . name ++ ; /* skip initial '_' */
271+ p ++ ; /* skip initial '_' */
285272 }
286- iname .len = name_len ;
287273
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 ))
291275 goto out ;
292- }
293276
294277 /*
295278 * Convert cleartext d_name to ciphertext. If result is longer than
296279 * CEPH_NOHASH_NAME_MAX, sha256 the remaining bytes
297280 *
298281 * See: fscrypt_setup_filename
299282 */
300- if (!fscrypt_fname_encrypted_size (dir , iname . len , NAME_MAX , & len )) {
283+ if (!fscrypt_fname_encrypted_size (dir , name_len , NAME_MAX , & len )) {
301284 elen = - ENAMETOOLONG ;
302285 goto out ;
303286 }
@@ -310,7 +293,9 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
310293 goto out ;
311294 }
312295
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 );
314299 if (ret ) {
315300 elen = ret ;
316301 goto out ;
@@ -331,18 +316,13 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
331316 }
332317
333318 /* 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 );
336321
337322 /* To understand the 240 limit, see CEPH_NOHASH_NAME_MAX comments */
338323 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 );
346326
347327out :
348328 kfree (cryptbuf );
@@ -355,14 +335,6 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,
355335 return elen ;
356336}
357337
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-
366338/**
367339 * ceph_fname_to_usr - convert a filename for userland presentation
368340 * @fname: ceph_fname to be converted
0 commit comments