From: Dan Carpenter <dan.carpenter@oracle.com>
To: almaz.alexandrovich@paragon-software.com
Cc: ntfs3@lists.linux.dev
Subject: [bug report] fs/ntfs3: Add file operations and implementation
Date: Tue, 24 Aug 2021 12:02:55 +0300 [thread overview]
Message-ID: <20210824090255.GA18518@kili> (raw)
Hello Konstantin Komarov,
This is a semi-automatic email about new static checker warnings.
The patch 4342306f0f0d: "fs/ntfs3: Add file operations and
implementation" from Aug 13, 2021, leads to the following Smatch
complaint:
fs/ntfs3/namei.c:446 ntfs_rename()
warn: variable dereferenced before check 'old_inode' (see line 312)
fs/ntfs3/namei.c
311
312 if (ntfs_is_meta_file(sbi, old_inode->i_ino)) {
^^^^^^^^^^^^^^^^
Dereference
313 err = -EINVAL;
314 goto out;
315 }
316
317 if (new_inode) {
318 /*target name exists. unlink it*/
319 dget(new_dentry);
320 ni_lock_dir(new_dir_ni);
321 err = ntfs_unlink_inode(new_dir, new_dentry);
322 ni_unlock(new_dir_ni);
323 dput(new_dentry);
324 if (err)
325 goto out;
326 }
327
328 /* allocate PATH_MAX bytes */
329 old_de = __getname();
330 if (!old_de) {
331 err = -ENOMEM;
332 goto out;
333 }
334
335 err = fill_name_de(sbi, old_de, &old_dentry->d_name, NULL);
336 if (err < 0)
337 goto out1;
338
339 old_name = (struct ATTR_FILE_NAME *)(old_de + 1);
340
341 if (is_same) {
342 new_de = old_de;
343 } else {
344 new_de = Add2Ptr(old_de, 1024);
345 err = fill_name_de(sbi, new_de, &new_dentry->d_name, NULL);
346 if (err < 0)
347 goto out1;
348 }
349
350 ni_lock_dir(old_dir_ni);
351 ni_lock(old_ni);
352
353 mi_get_ref(&old_dir_ni->mi, &old_name->home);
354
355 /*get pointer to file_name in mft*/
356 fname = ni_fname_name(old_ni, (struct cpu_str *)&old_name->name_len,
357 &old_name->home, &le);
358 if (!fname) {
359 err = -EINVAL;
360 goto out2;
361 }
362
363 /* Copy fname info from record into new fname */
364 new_name = (struct ATTR_FILE_NAME *)(new_de + 1);
365 memcpy(&new_name->dup, &fname->dup, sizeof(fname->dup));
366
367 name_type = paired_name(fname->type);
368
369 /* remove first name from directory */
370 err = indx_delete_entry(&old_dir_ni->dir, old_dir_ni, old_de + 1,
371 le16_to_cpu(old_de->key_size), sbi);
372 if (err)
373 goto out3;
374
375 /* remove first name from mft */
376 err = ni_remove_attr_le(old_ni, attr_from_name(fname), le);
377 if (err)
378 goto out4;
379
380 le16_add_cpu(&old_ni->mi.mrec->hard_links, -1);
381 old_ni->mi.dirty = true;
382
383 if (name_type != FILE_NAME_POSIX) {
384 /* get paired name */
385 fname = ni_fname_type(old_ni, name_type, &le);
386 if (fname) {
387 /* remove second name from directory */
388 err = indx_delete_entry(&old_dir_ni->dir, old_dir_ni,
389 fname, fname_full_size(fname),
390 sbi);
391 if (err)
392 goto out5;
393
394 /* remove second name from mft */
395 err = ni_remove_attr_le(old_ni, attr_from_name(fname),
396 le);
397 if (err)
398 goto out6;
399
400 le16_add_cpu(&old_ni->mi.mrec->hard_links, -1);
401 old_ni->mi.dirty = true;
402 }
403 }
404
405 /* Add new name */
406 mi_get_ref(&old_ni->mi, &new_de->ref);
407 mi_get_ref(&ntfs_i(new_dir)->mi, &new_name->home);
408
409 new_de_key_size = le16_to_cpu(new_de->key_size);
410
411 /* insert new name in mft */
412 err = ni_insert_resident(old_ni, new_de_key_size, ATTR_NAME, NULL, 0,
413 &attr, NULL);
414 if (err)
415 goto out7;
416
417 attr->res.flags = RESIDENT_FLAG_INDEXED;
418
419 memcpy(Add2Ptr(attr, SIZEOF_RESIDENT), new_name, new_de_key_size);
420
421 le16_add_cpu(&old_ni->mi.mrec->hard_links, 1);
422 old_ni->mi.dirty = true;
423
424 /* insert new name in directory */
425 err = indx_insert_entry(&new_dir_ni->dir, new_dir_ni, new_de, sbi,
426 NULL);
427 if (err)
428 goto out8;
429
430 if (IS_DIRSYNC(new_dir))
431 err = ntfs_sync_inode(old_inode);
432 else
433 mark_inode_dirty(old_inode);
434
435 old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
436 if (IS_DIRSYNC(old_dir))
437 (void)ntfs_sync_inode(old_dir);
438 else
439 mark_inode_dirty(old_dir);
440
441 if (old_dir != new_dir) {
442 new_dir->i_mtime = new_dir->i_ctime = old_dir->i_ctime;
443 mark_inode_dirty(new_dir);
444 }
445
446 if (old_inode) {
^^^^^^^^^
If old_inode can be NULL we are toasted.
447 old_inode->i_ctime = old_dir->i_ctime;
448 mark_inode_dirty(old_inode);
regards,
dan carpenter
next reply other threads:[~2021-08-24 9:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-24 9:02 Dan Carpenter [this message]
2021-08-24 9:32 ` [bug report] fs/ntfs3: Add file operations and implementation Kari Argillander
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210824090255.GA18518@kili \
--to=dan.carpenter@oracle.com \
--cc=almaz.alexandrovich@paragon-software.com \
--cc=ntfs3@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox