Page MenuHomeFreeBSD

D19728.diff
No OneTemporary

D19728.diff

Index: head/lib/libutil/pidfile.c
===================================================================
--- head/lib/libutil/pidfile.c
+++ head/lib/libutil/pidfile.c
@@ -100,8 +100,9 @@
}
struct pidfh *
-pidfile_open(const char *path, mode_t mode, pid_t *pidptr)
+pidfile_open(const char *pathp, mode_t mode, pid_t *pidptr)
{
+ char path[MAXPATHLEN];
struct pidfh *pfh;
struct stat sb;
int error, fd, dirfd, dirlen, filenamelen, count;
@@ -112,19 +113,22 @@
if (pfh == NULL)
return (NULL);
- if (path == NULL) {
+ if (pathp == NULL) {
dirlen = snprintf(pfh->pf_dir, sizeof(pfh->pf_dir),
"/var/run/");
filenamelen = snprintf(pfh->pf_filename,
sizeof(pfh->pf_filename), "%s.pid", getprogname());
} else {
- dirlen = snprintf(pfh->pf_dir, sizeof(pfh->pf_dir),
- "%s", path);
- filenamelen = snprintf(pfh->pf_filename,
- sizeof(pfh->pf_filename), "%s", path);
-
- dirname(pfh->pf_dir);
- basename(pfh->pf_filename);
+ if (strlcpy(path, pathp, sizeof(path)) >= sizeof(path)) {
+ free(pfh);
+ errno = ENAMETOOLONG;
+ return (NULL);
+ }
+ dirlen = strlcpy(pfh->pf_dir, dirname(path),
+ sizeof(pfh->pf_dir));
+ (void)strlcpy(path, pathp, sizeof(path));
+ filenamelen = strlcpy(pfh->pf_filename, basename(path),
+ sizeof(pfh->pf_filename));
}
if (dirlen >= (int)sizeof(pfh->pf_dir) ||
Index: head/lib/libutil/tests/pidfile_test.c
===================================================================
--- head/lib/libutil/tests/pidfile_test.c
+++ head/lib/libutil/tests/pidfile_test.c
@@ -263,6 +263,40 @@
return (result);
}
+/*
+ * Make sure we handle relative pidfile paths correctly.
+ */
+static const char *
+test_pidfile_relative(void)
+{
+ char path[PATH_MAX], pid[32], tmpdir[PATH_MAX];
+ struct pidfh *pfh;
+ int fd;
+
+ (void)snprintf(tmpdir, sizeof(tmpdir), "%s.XXXXXX", __func__);
+ if (mkdtemp(tmpdir) == NULL)
+ return (strerror(errno));
+ (void)snprintf(path, sizeof(path), "%s/pidfile", tmpdir);
+
+ pfh = pidfile_open(path, 0600, NULL);
+ if (pfh == NULL)
+ return (strerror(errno));
+ if (pidfile_write(pfh) != 0)
+ return (strerror(errno));
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ return (strerror(errno));
+ if (read(fd, pid, sizeof(pid)) < 0)
+ return (strerror(errno));
+ if (atoi(pid) != getpid())
+ return ("pid mismatch");
+ if (close(fd) != 0)
+ return (strerror(errno));
+ if (pidfile_close(pfh) != 0)
+ return (strerror(errno));
+ return (NULL);
+}
+
static struct test {
const char *name;
const char *(*func)(void);
@@ -271,6 +305,7 @@
{ "pidfile_self", test_pidfile_self },
{ "pidfile_contested", test_pidfile_contested },
{ "pidfile_inherited", test_pidfile_inherited },
+ { "pidfile_relative", test_pidfile_relative },
};
int

File Metadata

Mime Type
text/plain
Expires
Sun, Jan 12, 7:10 AM (19 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15763285
Default Alt Text
D19728.diff (2 KB)

Event Timeline