summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/net/linkaddr.c52
-rw-r--r--lib/libc/tests/stdio/printbasic_test.c4
-rw-r--r--lib/libfetch/common.c173
-rw-r--r--lib/libfetch/common.h1
-rw-r--r--lib/libfetch/ftp.c4
-rw-r--r--lib/libmagic/config.h6
-rw-r--r--lib/libvmmapi/vmmapi.c11
-rw-r--r--lib/msun/arm/Symbol.map5
8 files changed, 171 insertions, 85 deletions
diff --git a/lib/libc/net/linkaddr.c b/lib/libc/net/linkaddr.c
index 5be6e74..fec220a 100644
--- a/lib/libc/net/linkaddr.c
+++ b/lib/libc/net/linkaddr.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/socket.h>
+#include <net/if.h>
#include <net/if_dl.h>
#include <string.h>
@@ -125,31 +126,46 @@ link_ntoa(sdl)
const struct sockaddr_dl *sdl;
{
static char obuf[64];
- char *out = obuf;
- int i;
- u_char *in = (u_char *)LLADDR(sdl);
- u_char *inlim = in + sdl->sdl_alen;
- int firsttime = 1;
+ _Static_assert(sizeof(obuf) >= IFNAMSIZ + 20, "obuf is too small");
+ char *out;
+ const u_char *in, *inlim;
+ int namelen, i, rem;
- if (sdl->sdl_nlen) {
- bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
- out += sdl->sdl_nlen;
- if (sdl->sdl_alen)
+ namelen = (sdl->sdl_nlen <= IFNAMSIZ) ? sdl->sdl_nlen : IFNAMSIZ;
+
+ out = obuf;
+ rem = sizeof(obuf);
+ if (namelen > 0) {
+ bcopy(sdl->sdl_data, out, namelen);
+ out += namelen;
+ rem -= namelen;
+ if (sdl->sdl_alen > 0) {
*out++ = ':';
+ rem--;
+ }
}
- while (in < inlim) {
- if (firsttime)
- firsttime = 0;
- else
+
+ in = (const u_char *)sdl->sdl_data + sdl->sdl_nlen;
+ inlim = in + sdl->sdl_alen;
+
+ while (in < inlim && rem > 1) {
+ if (in != (const u_char *)sdl->sdl_data + sdl->sdl_nlen) {
*out++ = '.';
+ rem--;
+ }
i = *in++;
if (i > 0xf) {
- out[1] = hexlist[i & 0xf];
- i >>= 4;
- out[0] = hexlist[i];
- out += 2;
- } else
+ if (rem < 3)
+ break;
+ *out++ = hexlist[i >> 4];
+ *out++ = hexlist[i & 0xf];
+ rem -= 2;
+ } else {
+ if (rem < 2)
+ break;
*out++ = hexlist[i];
+ rem--;
+ }
}
*out = 0;
return (obuf);
diff --git a/lib/libc/tests/stdio/printbasic_test.c b/lib/libc/tests/stdio/printbasic_test.c
index bebb734..7f7c6cb 100644
--- a/lib/libc/tests/stdio/printbasic_test.c
+++ b/lib/libc/tests/stdio/printbasic_test.c
@@ -124,10 +124,10 @@ ATF_TC_BODY(int_within_limits, tc)
testfmt(S_ULONGMAX, "%lu", ULONG_MAX);
testfmt("-1", "%lld", (long long)-1);
- testfmt(S_ULONGMAX, "%lu", ULLONG_MAX);
+ testfmt(S_ULLONGMAX, "%llu", ULLONG_MAX);
testfmt("-1", "%d", -1);
- testfmt(S_UINT32MAX, "%lu", UINT32_MAX);
+ testfmt(S_UINT32MAX, "%u", UINT32_MAX);
testfmt("-1", "%hd", -1);
testfmt("65535", "%hu", USHRT_MAX);
diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c
index 6ae9926..304c289 100644
--- a/lib/libfetch/common.c
+++ b/lib/libfetch/common.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2014 Dag-Erling Smørgrav
+ * Copyright (c) 1998-2016 Dag-Erling Smørgrav
* Copyright (c) 2013 Michael Gmelin <freebsd@grem.de>
* All rights reserved.
*
@@ -241,27 +241,79 @@ fetch_ref(conn_t *conn)
/*
+ * Resolve an address
+ */
+struct addrinfo *
+fetch_resolve(const char *addr, int port, int af)
+{
+ char hbuf[256], sbuf[8];
+ struct addrinfo hints, *res;
+ const char *sep, *host, *service;
+ int err, len;
+
+ /* split address if necessary */
+ err = EAI_SYSTEM;
+ if ((sep = strchr(addr, ':')) != NULL) {
+ len = snprintf(hbuf, sizeof(hbuf),
+ "%.*s", (int)(sep - addr), addr);
+ if (len < 0)
+ return (NULL);
+ if (len >= (int)sizeof(hbuf)) {
+ errno = ENAMETOOLONG;
+ fetch_syserr();
+ return (NULL);
+ }
+ host = hbuf;
+ service = sep + 1;
+ } else if (port != 0) {
+ if (port < 1 || port > 65535) {
+ errno = EINVAL;
+ fetch_syserr();
+ return (NULL);
+ }
+ if (snprintf(sbuf, sizeof(sbuf), "%d", port) < 0) {
+ fetch_syserr();
+ return (NULL);
+ }
+ host = addr;
+ service = sbuf;
+ } else {
+ host = addr;
+ service = NULL;
+ }
+
+ /* resolve */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = af;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_ADDRCONFIG;
+ if ((err = getaddrinfo(host, service, &hints, &res)) != 0) {
+ netdb_seterr(err);
+ return (NULL);
+ }
+ return (res);
+}
+
+
+
+/*
* Bind a socket to a specific local address
*/
int
fetch_bind(int sd, int af, const char *addr)
{
- struct addrinfo hints, *res, *res0;
+ struct addrinfo *cliai, *ai;
int err;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = af;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = 0;
- if ((err = getaddrinfo(addr, NULL, &hints, &res0)) != 0)
+ if ((cliai = fetch_resolve(addr, 0, af)) == NULL)
return (-1);
- for (res = res0; res; res = res->ai_next)
- if (bind(sd, res->ai_addr, res->ai_addrlen) == 0) {
- freeaddrinfo(res0);
- return (0);
- }
- freeaddrinfo(res0);
- return (-1);
+ for (ai = cliai; ai != NULL; ai = ai->ai_next)
+ if ((err = bind(sd, ai->ai_addr, ai->ai_addrlen)) == 0)
+ break;
+ if (err != 0)
+ fetch_syserr();
+ freeaddrinfo(cliai);
+ return (err == 0 ? 0 : -1);
}
@@ -271,59 +323,76 @@ fetch_bind(int sd, int af, const char *addr)
conn_t *
fetch_connect(const char *host, int port, int af, int verbose)
{
- conn_t *conn;
- char pbuf[10];
+ struct addrinfo *cais = NULL, *sais = NULL, *cai, *sai;
const char *bindaddr;
- struct addrinfo hints, *res, *res0;
- int sd, err;
+ conn_t *conn = NULL;
+ int err = 0, sd = -1;
DEBUG(fprintf(stderr, "---> %s:%d\n", host, port));
+ /* resolve server address */
if (verbose)
- fetch_info("looking up %s", host);
+ fetch_info("resolving server address: %s:%d", host, port);
+ if ((sais = fetch_resolve(host, port, af)) == NULL)
+ goto fail;
- /* look up host name and set up socket address structure */
- snprintf(pbuf, sizeof(pbuf), "%d", port);
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = af;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = 0;
- if ((err = getaddrinfo(host, pbuf, &hints, &res0)) != 0) {
- netdb_seterr(err);
- return (NULL);
- }
+ /* resolve client address */
bindaddr = getenv("FETCH_BIND_ADDRESS");
+ if (bindaddr != NULL && *bindaddr != '\0') {
+ if (verbose)
+ fetch_info("resolving client address: %s", bindaddr);
+ if ((cais = fetch_resolve(bindaddr, 0, af)) == NULL)
+ goto fail;
+ }
- if (verbose)
- fetch_info("connecting to %s:%d", host, port);
-
- /* try to connect */
- for (sd = -1, res = res0; res; sd = -1, res = res->ai_next) {
- if ((sd = socket(res->ai_family, res->ai_socktype,
- res->ai_protocol)) == -1)
- continue;
- if (bindaddr != NULL && *bindaddr != '\0' &&
- fetch_bind(sd, res->ai_family, bindaddr) != 0) {
- fetch_info("failed to bind to '%s'", bindaddr);
- close(sd);
- continue;
+ /* try each server address in turn */
+ for (err = 0, sai = sais; sai != NULL; sai = sai->ai_next) {
+ /* open socket */
+ if ((sd = socket(sai->ai_family, SOCK_STREAM, 0)) < 0)
+ goto syserr;
+ /* attempt to bind to client address */
+ for (err = 0, cai = cais; cai != NULL; cai = cai->ai_next) {
+ if (cai->ai_family != sai->ai_family)
+ continue;
+ if ((err = bind(sd, cai->ai_addr, cai->ai_addrlen)) == 0)
+ break;
}
- if (connect(sd, res->ai_addr, res->ai_addrlen) == 0 &&
- fcntl(sd, F_SETFL, O_NONBLOCK) == 0)
+ if (err != 0) {
+ if (verbose)
+ fetch_info("failed to bind to %s", bindaddr);
+ goto syserr;
+ }
+ /* attempt to connect to server address */
+ if ((err = connect(sd, sai->ai_addr, sai->ai_addrlen)) == 0)
break;
+ /* clean up before next attempt */
close(sd);
+ sd = -1;
}
- freeaddrinfo(res0);
- if (sd == -1) {
- fetch_syserr();
- return (NULL);
+ if (err != 0) {
+ if (verbose)
+ fetch_info("failed to connect to %s:%s", host, port);
+ goto syserr;
}
- if ((conn = fetch_reopen(sd)) == NULL) {
- fetch_syserr();
- close(sd);
- }
+ if ((conn = fetch_reopen(sd)) == NULL)
+ goto syserr;
+ if (cais != NULL)
+ freeaddrinfo(cais);
+ if (sais != NULL)
+ freeaddrinfo(sais);
return (conn);
+syserr:
+ fetch_syserr();
+ goto fail;
+fail:
+ if (sd >= 0)
+ close(sd);
+ if (cais != NULL)
+ freeaddrinfo(cais);
+ if (sais != NULL)
+ freeaddrinfo(sais);
+ return (NULL);
}
#ifdef WITH_SSL
diff --git a/lib/libfetch/common.h b/lib/libfetch/common.h
index 41c10d2..e881c88 100644
--- a/lib/libfetch/common.h
+++ b/lib/libfetch/common.h
@@ -76,6 +76,7 @@ void fetch_syserr(void);
void fetch_info(const char *, ...);
int fetch_default_port(const char *);
int fetch_default_proxy_port(const char *);
+struct addrinfo *fetch_resolve(const char *, int, int);
int fetch_bind(int, int, const char *);
conn_t *fetch_connect(const char *, int, int, int);
conn_t *fetch_reopen(int);
diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
index 4e650b9..1a43b56 100644
--- a/lib/libfetch/ftp.c
+++ b/lib/libfetch/ftp.c
@@ -768,8 +768,8 @@ ftp_transfer(conn_t *conn, const char *oper, const char *file,
fetch_info("opening data connection");
bindaddr = getenv("FETCH_BIND_ADDRESS");
if (bindaddr != NULL && *bindaddr != '\0' &&
- fetch_bind(sd, sa.ss_family, bindaddr) != 0)
- goto sysouch;
+ (e = fetch_bind(sd, sa.ss_family, bindaddr)) != 0)
+ goto ouch;
if (connect(sd, (struct sockaddr *)&sa, sa.ss_len) == -1)
goto sysouch;
diff --git a/lib/libmagic/config.h b/lib/libmagic/config.h
index 5997612..03d5897 100644
--- a/lib/libmagic/config.h
+++ b/lib/libmagic/config.h
@@ -293,7 +293,7 @@
#define PACKAGE_NAME "file"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "file 5.28"
+#define PACKAGE_STRING "file 5.29"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "file"
@@ -302,7 +302,7 @@
#define PACKAGE_URL ""
/* Define to the version of this package. */
-#define PACKAGE_VERSION "5.28"
+#define PACKAGE_VERSION "5.29"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
@@ -333,7 +333,7 @@
/* Version number of package */
-#define VERSION "5.28"
+#define VERSION "5.29"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
diff --git a/lib/libvmmapi/vmmapi.c b/lib/libvmmapi/vmmapi.c
index fb8eb78..33a3b44 100644
--- a/lib/libvmmapi/vmmapi.c
+++ b/lib/libvmmapi/vmmapi.c
@@ -427,13 +427,18 @@ vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len)
{
if (ctx->lowmem > 0) {
- if (gaddr < ctx->lowmem && gaddr + len <= ctx->lowmem)
+ if (gaddr < ctx->lowmem && len <= ctx->lowmem &&
+ gaddr + len <= ctx->lowmem)
return (ctx->baseaddr + gaddr);
}
if (ctx->highmem > 0) {
- if (gaddr >= 4*GB && gaddr + len <= 4*GB + ctx->highmem)
- return (ctx->baseaddr + gaddr);
+ if (gaddr >= 4*GB) {
+ if (gaddr < 4*GB + ctx->highmem &&
+ len <= ctx->highmem &&
+ gaddr + len <= 4*GB + ctx->highmem)
+ return (ctx->baseaddr + gaddr);
+ }
}
return (NULL);
diff --git a/lib/msun/arm/Symbol.map b/lib/msun/arm/Symbol.map
index 081294c..40fbc54 100644
--- a/lib/msun/arm/Symbol.map
+++ b/lib/msun/arm/Symbol.map
@@ -5,13 +5,8 @@ FBSD_1.0 {
};
FBSD_1.3 {
- feclearexcept;
- fegetexceptflag;
fesetexceptflag;
feraiseexcept;
- fetestexcept;
- fegetround;
- fesetround;
fegetenv;
feholdexcept;
feupdateenv;
OpenPOWER on IntegriCloud