summaryrefslogtreecommitdiffstats
path: root/misc-utils/blkid.c
diff options
context:
space:
mode:
authorKarel Zak2014-11-27 13:39:35 +0100
committerKarel Zak2014-11-27 13:39:35 +0100
commit89e90ae7b2826110ea28c1c0eb8e7c56c3907bdc (patch)
tree1cd3e59664c5d32df7b51cff76b2bb7ce270334d /misc-utils/blkid.c
parentinclude/carefulputc: encode also ' and $ in fputs_quoted() output (diff)
downloadkernel-qcow2-util-linux-89e90ae7b2826110ea28c1c0eb8e7c56c3907bdc.tar.gz
kernel-qcow2-util-linux-89e90ae7b2826110ea28c1c0eb8e7c56c3907bdc.tar.xz
kernel-qcow2-util-linux-89e90ae7b2826110ea28c1c0eb8e7c56c3907bdc.zip
libblkid: care about unsafe chars in cache
The high-level libblkid API uses /run/blkid/blkid.tab cache to store probing results. The cache format is <device NAME="value" ...>devname</device> and unfortunately the cache code does not escape quotation marks: # mkfs.ext4 -L 'AAA"BBB' # cat /run/blkid/blkid.tab ... <device ... LABEL="AAA"BBB" ...>/dev/sdb1</device> such string is later incorrectly parsed and blkid(8) returns nonsenses. And for use-cases like # eval $(blkid -o export /dev/sdb1) it's also insecure. Note that mount, udevd and blkid -p are based on low-level libblkid API, it bypass the cache and directly read data from the devices. The current udevd upstream does not depend on blkid(8) output at all, it's directly linked with the library and all unsafe chars are encoded by \x<hex> notation. # mkfs.ext4 -L 'X"`/tmp/foo` "' /dev/sdb1 # udevadm info --export-db | grep LABEL ... E: ID_FS_LABEL=X__/tmp/foo___ E: ID_FS_LABEL_ENC=X\x22\x60\x2ftmp\x2ffoo\x60\x20\x22 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/blkid.c')
-rw-r--r--misc-utils/blkid.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index a6ca660c6..1bd864656 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -306,7 +306,7 @@ static void print_value(int output, int num, const char *devname,
printf("DEVNAME=%s\n", devname);
fputs(name, stdout);
fputs("=", stdout);
- safe_print(value, valsz, NULL);
+ safe_print(value, valsz, " \\\"'$`<>");
fputs("\n", stdout);
} else {
@@ -315,7 +315,7 @@ static void print_value(int output, int num, const char *devname,
fputs(" ", stdout);
fputs(name, stdout);
fputs("=\"", stdout);
- safe_print(value, valsz, "\"");
+ safe_print(value, valsz, "\"\\");
fputs("\"", stdout);
}
}