Crash and size problem with systemd-repart

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I'm experimenting with the new tool systemd-repart and I think I have found a bug.

Here is a simple repart.d file:

    bash-5.0# cat /usr/lib/repart.d/70-home.conf
    [Partition]
    Type=home
    SizeMinBytes=16M
    SizeMaxBytes=32M

If the disk is empty, systemd-repart ends with a segfault: https://github.com/systemd/systemd/issues/15608

So a create a new partition on the disk:

    bash-5.0# parted /dev/sdb
    (parted) print
    Model: ATA VBOX HARDDISK (scsi)
    Disk /dev/sdb: 32.2GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:

    Number  Start   End    Size   File system  Name     Flags
     1      1049kB  322MB  321MB               primary

And I run systemd-repart:

    bash-5.0# systemd-repart /dev/sdb --dry-run=no
    TYPE          LABEL   UUID FILE              NODE SIZE       PADDING
    home          home    af89e705-7395-4f23-8261-2f7229fc506b 70-home.conf /dev/sdb2 -> 306.0M  -> 0B     linux-generic primary fe7a74f4-8827-4233-94ac-0adbf8e3704d -            /dev/sdb1 306.0M     29.6G -> 29.4G
S = 612.0M S = 29.4G

X---------------------------------------------------------------------------------------------------------------------------XX
     `- primary |
`- 70-home.conf

    Applying changes.
    Storage does not support discarding, not discarding data in new partition 1.
    Successfully wiped file system signatures from partition 1.
    Storage does not support discarding, not discarding gap at beginning of disk.
    Creating new partition 1.
    Writing new partition table.
    Telling kernel to reread partition table.
    All done.

As you can see, there is a problem with the partition's size: 300MB instead of 32MB max.

Parted confirm:

    Number  Start   End     Size   File system  Name     Flags
     1      1049kB  322MB   321MB               primary
     2      31.9GB  32.2GB  321MB               home

I think the problem is here in src/partition/repart.c:

          /* What? Even still some space left (maybe because there was no preceding partition, or it had   a
           * size limit), then let's donate it to whoever wants it. */
          if (span > 0) {
                  Partition *p;

                  LIST_FOREACH(partitions, p, context->partitions) {
                          uint64_t m, xsz;

                          if (p->allocated_to_area != a)
                                  continue;

                          if (PARTITION_IS_FOREIGN(p))
                                  continue;

                          assert(p->new_size != UINT64_MAX);
                          m = p->new_size + span;

                          xsz = partition_max_size(a->after);
                          if (xsz != UINT64_MAX && m > xsz)
                                  m = xsz;

                          span = charge_size(span, m - p->new_size);
                          p->new_size = m;

                          if (span == 0)
                                  break;
                  }
          }


The problem is in line "xsz = partition_max_size(a->after);"

xsz is the max size of "a->after" instead current partition (so "p").

Am I right? I'll make a PR if yes.

Regards,

--
Emmanuel Garette
 Ingénieur en informatique libre
Cadoles (http://www.cadoles.com)
 Experts EOLE, Envole et logiciels libres

begin:vcard
fn:Emmanuel Garette
n:Garette;Emmanuel
org:Cadoles
email;internet:egarette@xxxxxxxxxxx
title;quoted-printable:Ing=C3=A9nieur logiciels libre
tel;work:03 73 27 02 86
tel;fax:09 72 29 61 11
url:http://www.cadoles.com/
version:2.1
end:vcard

_______________________________________________
systemd-devel mailing list
systemd-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/systemd-devel

[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux