Joel Granados Moreno <[email protected]> writes:
> diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
> index 4a8c9e7..35ef1a5 100644
> --- a/libparted/arch/linux.c
> +++ b/libparted/arch/linux.c
> @@ -279,6 +279,9 @@ struct blkdev_ioctl_param {
>                  || (M) == SCSI_CDROM_MAJOR                              \
>                  || ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR))
>
> +/* Maximum number of partitions supported by linux. */
> +#define MAX_NUM_PARTS                16
> +
>  static char* _device_get_part_path (PedDevice* dev, int num);
>  static int _partition_is_mounted_by_path (const char* path);
>
> @@ -2261,45 +2264,91 @@ _blkpg_remove_partition (PedDisk* disk, int n)
>                                      BLKPG_DEL_PARTITION);
>  }
>
> +/*
> + * The number of partitions that a device can have depends on the kernel.
> + * If we don't find this value in /sys/block/DEV/range, we will use our own
> + * value.
> + */
> +static int
> +_device_get_partition_range(PedDevice* dev)
> +{
> +     int             range;
> +     char    path[512];
> +     FILE*   fd;
> +
> +     if(snprintf(path, sizeof(path), "/sys/block/%s/range", dev->path) < 0)
> +             return MAX_NUM_PARTS;
> +
> +     fd = fopen(path, "r");
> +     if(!fd)
> +             return MAX_NUM_PARTS;
> +
> +     if(fscanf(fd, "%d", range) == EOF)
> +             return MAX_NUM_PARTS;
> +
> +     return range;

Oops.  you need a "&" before "range" above.
Did this compile?  With gcc's -Wformat?

Also, don't leak that stream+file descriptor.
E.g.,

    bool ok = fscanf (fp, "%d", &range) == 1;
    fclose (fp);
    return ok ? range : MAX_NUM_PARTS;

Also, while parsing via *scanf is not robust, if you do use it,
the code must not accept random invalid input by setting "range" to 0.
Hence the modified test "== 1" above.

Also, "fd" is normally as an integer file descriptor variable.
Please use something else, e.g., "fp" instead.

I'll look at the rest once you've adjusted.

_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel

Reply via email to