chiark / gitweb /
umount: unescape path from /proc/self/mountinfo first, then check against api mount...
authorLennart Poettering <lennart@poettering.net>
Wed, 13 Oct 2010 22:41:57 +0000 (00:41 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Oct 2010 22:41:57 +0000 (00:41 +0200)
src/umount.c

index 468eb715d65bb142bc81cbb3fae07dfb8247fa0e..79fbba73244e8b33d3d58620583e90f3132ba86e 100644 (file)
@@ -38,6 +38,7 @@ typedef struct MountPoint {
         LIST_FIELDS (struct MountPoint, mount_point);
 } MountPoint;
 
+/* Takes over possession of path */
 static MountPoint *mount_point_alloc(char *path) {
         MountPoint *mp;
 
@@ -98,23 +99,26 @@ static int mount_points_list_get(MountPoint **mount_point_list_head) {
                         continue;
                 }
 
-                if (mount_point_is_api(path)) {
-                        free(path);
-                        continue;
-                }
+                p = cunescape(path);
+                free(path);
 
-                if (!(p = cunescape(path))) {
+                if (!p) {
                         r = -ENOMEM;
                         goto finish;
                 }
 
+                if (mount_point_is_api(p)) {
+                        free(p);
+                        continue;
+                }
+
                 if (!(mp = mount_point_alloc(p))) {
+                        free(p);
                         r = -ENOMEM;
                         goto finish;
                 }
-                LIST_PREPEND(MountPoint, mount_point, *mount_point_list_head, mp);
 
-                free(path);
+                LIST_PREPEND(MountPoint, mount_point, *mount_point_list_head, mp);
         }
 
         r = 0;
@@ -122,8 +126,6 @@ static int mount_points_list_get(MountPoint **mount_point_list_head) {
 finish:
         fclose(proc_self_mountinfo);
 
-        free(path);
-
         return r;
 }