]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Manage: fix check after dereference issue
authorMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Thu, 29 Feb 2024 11:52:07 +0000 (12:52 +0100)
committerMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Mon, 11 Mar 2024 10:06:34 +0000 (11:06 +0100)
The code dereferences dev_st earlier without checking, it gives SAST
problem.

dev_st is needed for attempt_re_add(), but it is executed only if
dv->disposition != 'S', so move disposition check up.

tst is a must to reach this place, dup_super() have to return valid
pointer, all it needs to check is if load_super() returns superblock.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Manage.c

index 30302ac833f2f872144bb2497016e0c929c34e7a..77b79cf57554593b719e98959343f4ac71586513 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -794,25 +794,23 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
                 * simply re-add it.
                 */
 
-               if (array->not_persistent == 0) {
+               if (array->not_persistent == 0 && dv->disposition != 'S') {
+                       int rv = 0;
+
                        dev_st = dup_super(tst);
                        dev_st->ss->load_super(dev_st, tfd, NULL);
-                       if (dev_st->sb && dv->disposition != 'S') {
-                               int rv;
 
-                               rv = attempt_re_add(fd, tfd, dv, dev_st, tst,
-                                                   rdev, update, devname,
-                                                   verbose, array);
-                               dev_st->ss->free_super(dev_st);
-                               if (rv) {
-                                       free(dev_st);
-                                       return rv;
-                               }
-                       }
-                       if (dev_st) {
+                       if (dev_st->sb) {
+                               rv = attempt_re_add(fd, tfd, dv, dev_st, tst, rdev, update,
+                                                   devname, verbose, array);
+
                                dev_st->ss->free_super(dev_st);
-                               free(dev_st);
                        }
+
+                       free(dev_st);
+
+                       if (rv)
+                               return rv;
                }
                if (dv->disposition == 'M') {
                        if (verbose > 0)