int flags = O_CREAT | O_EXCL | O_WRONLY;
int mode = 0644;
int fd;
+ int n;
- snprintf(tmp, sizeof(tmp), "%s.%i.%lli.%lli", itr->name, getpid(),
+ n = snprintf(tmp, sizeof(tmp), "%s.%i.%lli.%lli", itr->name, getpid(),
(long long)tv.tv_usec, (long long)tv.tv_sec);
+ if (n >= (int)sizeof(tmp)) {
+ ERR("bad filename: %s.%i.%lli.%lli: path too long\n",
+ itr->name, getpid(), (long long)tv.tv_usec,
+ (long long)tv.tv_sec);
+ continue;
+ }
fd = openat(dfd, tmp, flags, mode);
if (fd < 0) {
ERR("openat(%s, %s, %o, %o): %m\n",
cfg.dirnamelen = snprintf(cfg.dirname, PATH_MAX,
"%s%s/%s",
root ?: "", module_directory, cfg.kversion);
+ if (cfg.dirnamelen >= PATH_MAX) {
+ ERR("Bad directory %s" MODULE_DIRECTORY
+ "/%s: path too long\n", root ?: "", cfg.kversion);
+ goto cmdline_failed;
+ }
cfg.outdirnamelen = snprintf(cfg.outdirname, PATH_MAX,
"%s%s/%s",
out_root ?: (root ?: ""), module_directory, cfg.kversion);
+ if (cfg.outdirnamelen >= PATH_MAX) {
+ ERR("Bad directory %s" MODULE_DIRECTORY
+ "/%s: path too long\n", out_root ?: (root ?: ""),
+ cfg.kversion);
+ goto cmdline_failed;
+ }
if (optind == argc)
all = 1;
if (root != NULL || kversion != NULL) {
struct utsname u;
+ int n;
if (root == NULL)
root = "";
if (kversion == NULL) {
}
kversion = u.release;
}
- snprintf(dirname_buf, sizeof(dirname_buf), "%s" MODULE_DIRECTORY "/%s",
- root, kversion);
+
+ n = snprintf(dirname_buf, sizeof(dirname_buf),
+ "%s" MODULE_DIRECTORY "/%s", root, kversion);
+ if (n >= (int)sizeof(dirname_buf)) {
+ ERR("bad directory %s" MODULE_DIRECTORY
+ "/%s: path too long\n", root, kversion);
+ return EXIT_FAILURE;
+ }
dirname = dirname_buf;
}
if (root != NULL || kversion != NULL) {
struct utsname u;
+ int n;
if (root == NULL)
root = "";
if (kversion == NULL) {
}
kversion = u.release;
}
- snprintf(dirname_buf, sizeof(dirname_buf),
- "%s" MODULE_DIRECTORY "/%s", root,
- kversion);
+ n = snprintf(dirname_buf, sizeof(dirname_buf),
+ "%s" MODULE_DIRECTORY "/%s", root, kversion);
+ if (n >= (int)sizeof(dirname_buf)) {
+ ERR("bad directory %s" MODULE_DIRECTORY
+ "/%s: path too long\n", root, kversion);
+ err = -1;
+ goto done;
+ }
dirname = dirname_buf;
}
goto finish;
}
- snprintf(modules, sizeof(modules), MODULE_DIRECTORY "/%s/modules.devname", kernel.release);
+ r = snprintf(modules, sizeof(modules), MODULE_DIRECTORY "/%s/modules.devname", kernel.release);
+ if (r >= (int)sizeof(modules)) {
+ fprintf(stderr, "Error: could not open " MODULE_DIRECTORY "/%s/modules.devname - path too long\n",
+ kernel.release);
+ ret = EXIT_FAILURE;
+ goto finish;
+ }
in = fopen(modules, "re");
if (in == NULL) {
if (errno == ENOENT) {