summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Golle <daniel@makrotopia.org>2021-05-12 23:35:46 +0100
committerDaniel Golle <daniel@makrotopia.org>2021-05-16 00:28:11 +0100
commitbd7cc8dd12481167d5a3b289c19ca9ccd8effa7c (patch)
tree7a89f3e7164848620d0466733ca2ba1c0a28c4cf
parentb5397a142d3ac35daeb526b1df82ccbf64bff741 (diff)
downloadfstools-bd7cc8dd12481167d5a3b289c19ca9ccd8effa7c.tar.gz
block: use dynamically allocated target string
Dynamically allocate string buffer for target mountpoint if needed in order to avoid the static buffer overflowing for long (device mapper) paths. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
-rw-r--r--block.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/block.c b/block.c
index c6d93d1..a613fd7 100644
--- a/block.c
+++ b/block.c
@@ -994,7 +994,7 @@ static int mount_device(struct probe_info *pr, int type)
{
struct mount *m;
struct stat st;
- char _target[32];
+ char *_target = NULL;
char *target;
char *device;
char *mp;
@@ -1053,16 +1053,22 @@ static int mount_device(struct probe_info *pr, int type)
}
if (m->autofs) {
- snprintf(_target, sizeof(_target), "/tmp/run/blockd/%s", device);
+ if (asprintf(&_target, "/tmp/run/blockd/%s", device) == -1)
+ exit(ENOMEM);
+
target = _target;
} else if (m->target) {
target = m->target;
} else {
- snprintf(_target, sizeof(_target), "/mnt/%s", device);
+ if (asprintf(&_target, "/mnt/%s", device) == -1)
+ exit(ENOMEM);
+
target = _target;
}
} else if (anon_mount) {
- snprintf(_target, sizeof(_target), "/mnt/%s", device);
+ if (asprintf(&_target, "/mnt/%s", device) == -1)
+ exit(ENOMEM);
+
target = _target;
} else {
/* No reason to mount this device */
@@ -1082,9 +1088,16 @@ static int mount_device(struct probe_info *pr, int type)
if (err) {
ULOG_ERR("mounting %s (%s) as %s failed (%d) - %m\n",
pr->dev, pr->type, target, errno);
+
+ if (_target)
+ free(_target);
+
return err;
}
+ if (_target)
+ free(_target);
+
handle_swapfiles(true);
if (type != TYPE_AUTOFS)