static const char *
path_vcreate(const char *path, va_list ap)
{
- if (prefixlen)
- vsnprintf(pathbuf + prefixlen,
- sizeof(pathbuf) - prefixlen, path, ap);
- else
- vsnprintf(pathbuf, sizeof(pathbuf), path, ap);
+ int rc = vsnprintf(
+ pathbuf + prefixlen, sizeof(pathbuf) - prefixlen, path, ap);
+
+ if (rc < 0)
+ return NULL;
+ if ((size_t)rc >= sizeof(pathbuf)) {
+ errno = ENAMETOOLONG;
+ return NULL;
+ }
return pathbuf;
}
{
FILE *f;
const char *p = path_vcreate(path, ap);
+ if (!p)
+ goto err;
f = fopen(p, mode);
- if (!f && exit_on_error)
- err(EXIT_FAILURE, _("cannot open %s"), p);
+ if (!f)
+ goto err;
+
return f;
+err:
+ if (exit_on_error)
+ err(EXIT_FAILURE, _("cannot open %s"), p ? p : "path");
+ return NULL;
}
static int
{
int fd;
const char *p = path_vcreate(path, ap);
+ if (!p)
+ goto err;
fd = open(p, flags);
if (fd == -1)
- err(EXIT_FAILURE, _("cannot open %s"), p);
+ goto err;
+
return fd;
+err:
+ err(EXIT_FAILURE, _("cannot open %s"), p ? p : "path");
}
FILE *
p = path_vcreate(path, ap);
va_end(ap);
- return access(p, F_OK) == 0;
+ return p && access(p, F_OK) == 0;
}
#ifdef HAVE_CPU_SET_T