]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
Generate valid JSON if partition table is empty
authorAdriaan de Groot <groot@kde.org>
Mon, 24 Aug 2020 21:30:35 +0000 (23:30 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 13 Nov 2020 10:53:31 +0000 (11:53 +0100)
When the partition table is present **but** empty, the existing code would output fields followed by a `,` , on the assumption that the list of partitions would follow. But if the list of partitions is empty, it is skipped, leading to output like this:

```
{
  "partitiontable": {
      "label":"gpt",
      "id":"1F9E80D9-DD78-024F-94A3-B61EC82B18C8",
      "device":"/dev/sdb",
      "unit":"sectors",
      "firstlba":2048,
      "lastlba":30949342,
      "sectorsize":512,
  }
}
```

Note the `512,` on the *sectorsize* line.

This is invalid JSON for some parsers, which choke on it.

Avoid this, by checking when outputting the last separator: if there's no table, or there is a table but it is empty, then just put a newline, otherwise use the old path of comma-newline and assume there's going to be a list of partitions after.

libfdisk/src/script.c

index 789581776525d5ca878a4389193f7c3b3907993e..56bac651da10ad71ee90af8c1d93c74135428699 100644 (file)
@@ -600,7 +600,7 @@ static int write_file_json(struct fdisk_script *dp, FILE *f)
                else
                        fputs(fi->data, f);
 
-               if (!dp->table && fi == list_last_entry(&dp->headers, struct fdisk_scriptheader, headers))
+               if ((fi == list_last_entry(&dp->headers, struct fdisk_scriptheader, headers)) && (!dp->table || fdisk_table_is_empty(dp->table)))
                        fputc('\n', f);
                else
                        fputs(",\n", f);