summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorsjg <sjg@FreeBSD.org>2013-09-05 20:18:59 +0000
committersjg <sjg@FreeBSD.org>2013-09-05 20:18:59 +0000
commit62bb1062226d3ce6a2350808256a25508978352d (patch)
tree22b131dceb13c3df96da594fbaadb693504797c7 /libexec
parent72ab90509b3a51ab361bf710338f2ef44a4e360d (diff)
parent04932445481c2cb89ff69a83b961bdef3d64757e (diff)
downloadFreeBSD-src-62bb1062226d3ce6a2350808256a25508978352d.zip
FreeBSD-src-62bb1062226d3ce6a2350808256a25508978352d.tar.gz
Merge from head
Diffstat (limited to 'libexec')
-rw-r--r--libexec/atrun/atrun.c6
-rw-r--r--libexec/bootpd/bootptab.52
-rw-r--r--libexec/rtld-elf/rtld.c149
3 files changed, 82 insertions, 75 deletions
diff --git a/libexec/atrun/atrun.c b/libexec/atrun/atrun.c
index 8b0315e..594107e 100644
--- a/libexec/atrun/atrun.c
+++ b/libexec/atrun/atrun.c
@@ -31,6 +31,7 @@ static const char rcsid[] =
/* System Headers */
#include <sys/fcntl.h>
+#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef __FreeBSD__
@@ -197,7 +198,7 @@ run_file(const char *filename, uid_t uid, gid_t gid)
PRIV_END
if (stream == NULL)
- perr("cannot open input file");
+ perr("cannot open input file %s", filename);
if ((fd_in = dup(fileno(stream))) <0)
perr("error duplicating input file descriptor");
@@ -521,6 +522,9 @@ main(int argc, char *argv[])
if ((spool = opendir(".")) == NULL)
perr("cannot read %s", ATJOB_DIR);
+ if (flock(dirfd(spool), LOCK_EX) == -1)
+ perr("cannot lock %s", ATJOB_DIR);
+
now = time(NULL);
run_batch = 0;
batch_uid = (uid_t) -1;
diff --git a/libexec/bootpd/bootptab.5 b/libexec/bootpd/bootptab.5
index bfc535c..0ba2b69 100644
--- a/libexec/bootpd/bootptab.5
+++ b/libexec/bootpd/bootptab.5
@@ -421,7 +421,7 @@ mtoliver:ht=1:ha=00DD00FE1600:tc=.default:
.Ed
.Sh FILES
.Bl -tag -width /etc/bootptab -compact
-.It /etc/bootptab
+.It Pa /etc/bootptab
.El
.Sh "SEE ALSO"
.Xr bootpd 8 ,
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index bb790dd..2da990c 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -145,9 +145,8 @@ static void unlink_object(Obj_Entry *);
static void unload_object(Obj_Entry *);
static void unref_dag(Obj_Entry *);
static void ref_dag(Obj_Entry *);
-static int origin_subst_one(char **, const char *, const char *,
- const char *, char *);
-static char *origin_subst(const char *, const char *);
+static char *origin_subst_one(char *, const char *, const char *, bool);
+static char *origin_subst(char *, const char *);
static void preinit_main(void);
static int rtld_verify_versions(const Objlist *);
static int rtld_verify_object_versions(Obj_Entry *);
@@ -748,79 +747,81 @@ basename(const char *name)
static struct utsname uts;
-static int
-origin_subst_one(char **res, const char *real, const char *kw, const char *subst,
- char *may_free)
+static char *
+origin_subst_one(char *real, const char *kw, const char *subst,
+ bool may_free)
{
- const char *p, *p1;
- char *res1;
- int subst_len;
- int kw_len;
-
- res1 = *res = NULL;
- p = real;
- subst_len = kw_len = 0;
- for (;;) {
- p1 = strstr(p, kw);
- if (p1 != NULL) {
- if (subst_len == 0) {
- subst_len = strlen(subst);
- kw_len = strlen(kw);
- }
- if (*res == NULL) {
- *res = xmalloc(PATH_MAX);
- res1 = *res;
- }
- if ((res1 - *res) + subst_len + (p1 - p) >= PATH_MAX) {
- _rtld_error("Substitution of %s in %s cannot be performed",
- kw, real);
- if (may_free != NULL)
- free(may_free);
- free(res);
- return (false);
- }
- memcpy(res1, p, p1 - p);
- res1 += p1 - p;
- memcpy(res1, subst, subst_len);
- res1 += subst_len;
- p = p1 + kw_len;
- } else {
- if (*res == NULL) {
- if (may_free != NULL)
- *res = may_free;
- else
- *res = xstrdup(real);
- return (true);
- }
- *res1 = '\0';
- if (may_free != NULL)
- free(may_free);
- if (strlcat(res1, p, PATH_MAX - (res1 - *res)) >= PATH_MAX) {
- free(res);
- return (false);
- }
- return (true);
- }
- }
+ char *p, *p1, *res, *resp;
+ int subst_len, kw_len, subst_count, old_len, new_len;
+
+ kw_len = strlen(kw);
+
+ /*
+ * First, count the number of the keyword occurences, to
+ * preallocate the final string.
+ */
+ for (p = real, subst_count = 0;; p = p1 + kw_len, subst_count++) {
+ p1 = strstr(p, kw);
+ if (p1 == NULL)
+ break;
+ }
+
+ /*
+ * If the keyword is not found, just return.
+ */
+ if (subst_count == 0)
+ return (may_free ? real : xstrdup(real));
+
+ /*
+ * There is indeed something to substitute. Calculate the
+ * length of the resulting string, and allocate it.
+ */
+ subst_len = strlen(subst);
+ old_len = strlen(real);
+ new_len = old_len + (subst_len - kw_len) * subst_count;
+ res = xmalloc(new_len + 1);
+
+ /*
+ * Now, execute the substitution loop.
+ */
+ for (p = real, resp = res, *resp = '\0';;) {
+ p1 = strstr(p, kw);
+ if (p1 != NULL) {
+ /* Copy the prefix before keyword. */
+ memcpy(resp, p, p1 - p);
+ resp += p1 - p;
+ /* Keyword replacement. */
+ memcpy(resp, subst, subst_len);
+ resp += subst_len;
+ *resp = '\0';
+ p = p1 + kw_len;
+ } else
+ break;
+ }
+
+ /* Copy to the end of string and finish. */
+ strcat(resp, p);
+ if (may_free)
+ free(real);
+ return (res);
}
static char *
-origin_subst(const char *real, const char *origin_path)
+origin_subst(char *real, const char *origin_path)
{
- char *res1, *res2, *res3, *res4;
+ char *res1, *res2, *res3, *res4;
- if (uts.sysname[0] == '\0') {
- if (uname(&uts) != 0) {
- _rtld_error("utsname failed: %d", errno);
- return (NULL);
+ if (uts.sysname[0] == '\0') {
+ if (uname(&uts) != 0) {
+ _rtld_error("utsname failed: %d", errno);
+ return (NULL);
+ }
}
- }
- if (!origin_subst_one(&res1, real, "$ORIGIN", origin_path, NULL) ||
- !origin_subst_one(&res2, res1, "$OSNAME", uts.sysname, res1) ||
- !origin_subst_one(&res3, res2, "$OSREL", uts.release, res2) ||
- !origin_subst_one(&res4, res3, "$PLATFORM", uts.machine, res3))
- return (NULL);
- return (res4);
+ res1 = origin_subst_one(real, "$ORIGIN", origin_path, false);
+ res2 = origin_subst_one(res1, "$OSNAME", uts.sysname, true);
+ res3 = origin_subst_one(res2, "$OSREL", uts.release, true);
+ res4 = origin_subst_one(res3, "$PLATFORM", uts.machine, true);
+ return (res4);
}
static void
@@ -1438,10 +1439,12 @@ find_library(const char *xname, const Obj_Entry *refobj)
xname);
return NULL;
}
- if (objgiven && refobj->z_origin)
- return origin_subst(xname, refobj->origin_path);
- else
- return xstrdup(xname);
+ if (objgiven && refobj->z_origin) {
+ return (origin_subst(__DECONST(char *, xname),
+ refobj->origin_path));
+ } else {
+ return (xstrdup(xname));
+ }
}
if (libmap_disable || !objgiven ||
OpenPOWER on IntegriCloud