[CRIU] [PATCH v3 2/2] autofs: use safe xatol() and xatoi() helpers
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Wed Sep 27 12:22:23 MSK 2017
Plus patch replaces atoi(32 bit) to xatol(64 bits) for "pipe_ino" mount
option thus fixing the issue with negative inode number for big values.
v2: fixed uninitialized "err" variable in "parse_options" function
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
criu/autofs.c | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/criu/autofs.c b/criu/autofs.c
index c7e0bbd..8cf5e8e 100644
--- a/criu/autofs.c
+++ b/criu/autofs.c
@@ -149,7 +149,9 @@ static int autofs_find_pipe_read_end(int pgrp, long ino, int *read_fd)
goto out;
}
- fd = atoi(de->d_name);
+ ret = xatoi(de->d_name, &fd);
+ if (ret)
+ goto out;
found = autofs_check_fd_stat(&buf, pgrp, fd, ino, &mode);
if (found < 0)
@@ -223,19 +225,20 @@ static int parse_options(char *options, AutofsEntry *entry, long *pipe_ino)
for (i = 0; i < nr_opts; i++) {
char *opt = opts[i];
+ int err = 0;
if (!strncmp(opt, "fd=", strlen("fd=")))
- entry->fd = atoi(opt + strlen("fd="));
+ err = xatoi(opt + strlen("fd="), &entry->fd);
else if (!strncmp(opt, "pipe_ino=", strlen("pipe_ino=")))
- *pipe_ino = atoi(opt + strlen("pipe_ino="));
+ err = xatol(opt + strlen("pipe_ino="), pipe_ino);
else if (!strncmp(opt, "pgrp=", strlen("pgrp=")))
- entry->pgrp = atoi(opt + strlen("pgrp="));
+ err = xatoi(opt + strlen("pgrp="), &entry->pgrp);
else if (!strncmp(opt, "timeout=", strlen("timeout=")))
- entry->timeout = atoi(opt + strlen("timeout="));
+ err = xatoi(opt + strlen("timeout="), &entry->timeout);
else if (!strncmp(opt, "minproto=", strlen("minproto=")))
- entry->minproto = atoi(opt + strlen("minproto="));
+ err = xatoi(opt + strlen("minproto="), &entry->minproto);
else if (!strncmp(opt, "maxproto=", strlen("maxproto=")))
- entry->maxproto = atoi(opt + strlen("maxproto="));
+ err = xatoi(opt + strlen("maxproto="), &entry->maxproto);
else if (!strcmp(opt, "indirect"))
entry->mode = AUTOFS_MODE_INDIRECT;
else if (!strcmp(opt, "offset"))
@@ -243,9 +246,12 @@ static int parse_options(char *options, AutofsEntry *entry, long *pipe_ino)
else if (!strcmp(opt, "direct"))
entry->mode = AUTOFS_MODE_DIRECT;
else if (!strncmp(opt, "uid=", strlen("uid=")))
- entry->uid = atoi(opt + strlen("uid="));
+ err = xatoi(opt + strlen("uid="), &entry->uid);
else if (!strncmp(opt, "gid=", strlen("gid=")))
- entry->gid = atoi(opt + strlen("gid="));
+ err = xatoi(opt + strlen("gid="), &entry->gid);
+
+ if (err)
+ return -1;
}
for (i = 0; i < nr_opts; i++)
@@ -308,7 +314,9 @@ static int autofs_revisit_options(struct mount_info *pm)
while ((token = strsep(&str, " ")) != NULL) {
if (mnt_id == -1) {
- mnt_id = atoi(token);
+ ret = xatoi(token, &mnt_id);
+ if (ret)
+ goto close_proc;
if (mnt_id != pm->mnt_id)
break;
} else if (strstr(token, "pipe_ino=")) {
More information about the CRIU
mailing list