mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-22 09:57:20 +00:00
[master] Fixed relative file name crash
Merges in rt46957
This commit is contained in:
parent
d394b602d4
commit
db4e4aa2e4
7
RELNOTES
7
RELNOTES
@ -103,6 +103,13 @@ by Eric Young (eay@cryptsoft.com).
|
|||||||
cannot rely on the results of executable statements.
|
cannot rely on the results of executable statements.
|
||||||
[ISC-Bugs #45451]
|
[ISC-Bugs #45451]
|
||||||
|
|
||||||
|
- Fixed a bug which causes dhcpd and dhclient to crash on certain
|
||||||
|
systems when given relative path names for lease or pid files on
|
||||||
|
the command line. Affected systems are those on which the C library
|
||||||
|
function, realpath() does not support a second parameter value of
|
||||||
|
NULL (see manpages for realpath(3)).
|
||||||
|
[ISC-Bugs #46957]
|
||||||
|
|
||||||
Changes since 4.4.0a1 (New Features)
|
Changes since 4.4.0a1 (New Features)
|
||||||
|
|
||||||
- Added experimental support for relay port (draft-ietf-dhc-relay-port-10.txt)
|
- Added experimental support for relay port (draft-ietf-dhc-relay-port-10.txt)
|
||||||
|
@ -639,17 +639,11 @@ main(int argc, char **argv) {
|
|||||||
* to be reopened after chdir() has been called
|
* to be reopened after chdir() has been called
|
||||||
*/
|
*/
|
||||||
if (path_dhclient_db[0] != '/') {
|
if (path_dhclient_db[0] != '/') {
|
||||||
const char *old_path = path_dhclient_db;
|
path_dhclient_db = absolute_path(path_dhclient_db);
|
||||||
path_dhclient_db = realpath(path_dhclient_db, NULL);
|
|
||||||
if (path_dhclient_db == NULL)
|
|
||||||
log_fatal("Failed to get realpath for %s: %s", old_path, strerror(errno));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path_dhclient_script[0] != '/') {
|
if (path_dhclient_script[0] != '/') {
|
||||||
const char *old_path = path_dhclient_script;
|
path_dhclient_script = absolute_path(path_dhclient_script);
|
||||||
path_dhclient_script = realpath(path_dhclient_script, NULL);
|
|
||||||
if (path_dhclient_script == NULL)
|
|
||||||
log_fatal("Failed to get realpath for %s: %s", old_path, strerror(errno));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Turn data structures into printable text. */
|
Turn data structures into printable text. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC")
|
* Copyright (c) 2004-2018 by Internet Systems Consortium, Inc. ("ISC")
|
||||||
* Copyright (c) 1995-2003 by Internet Software Consortium
|
* Copyright (c) 1995-2003 by Internet Software Consortium
|
||||||
*
|
*
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
@ -132,7 +132,7 @@ char *print_base64 (const unsigned char *buf, unsigned len,
|
|||||||
b = dmalloc (bl + 1, file, line);
|
b = dmalloc (bl + 1, file, line);
|
||||||
if (!b)
|
if (!b)
|
||||||
return (char *)0;
|
return (char *)0;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
s = b;
|
s = b;
|
||||||
while (i != len) {
|
while (i != len) {
|
||||||
@ -199,15 +199,15 @@ void print_lease (lease)
|
|||||||
|
|
||||||
log_debug (" Lease %s",
|
log_debug (" Lease %s",
|
||||||
piaddr (lease -> ip_addr));
|
piaddr (lease -> ip_addr));
|
||||||
|
|
||||||
t = gmtime (&lease -> starts);
|
t = gmtime (&lease -> starts);
|
||||||
strftime (tbuf, sizeof tbuf, "%Y/%m/%d %H:%M:%S", t);
|
strftime (tbuf, sizeof tbuf, "%Y/%m/%d %H:%M:%S", t);
|
||||||
log_debug (" start %s", tbuf);
|
log_debug (" start %s", tbuf);
|
||||||
|
|
||||||
t = gmtime (&lease -> ends);
|
t = gmtime (&lease -> ends);
|
||||||
strftime (tbuf, sizeof tbuf, "%Y/%m/%d %H:%M:%S", t);
|
strftime (tbuf, sizeof tbuf, "%Y/%m/%d %H:%M:%S", t);
|
||||||
log_debug (" end %s", tbuf);
|
log_debug (" end %s", tbuf);
|
||||||
|
|
||||||
if (lease -> hardware_addr.hlen)
|
if (lease -> hardware_addr.hlen)
|
||||||
log_debug (" hardware addr = %s",
|
log_debug (" hardware addr = %s",
|
||||||
print_hw_addr (lease -> hardware_addr.hbuf [0],
|
print_hw_addr (lease -> hardware_addr.hbuf [0],
|
||||||
@ -215,7 +215,7 @@ void print_lease (lease)
|
|||||||
&lease -> hardware_addr.hbuf [1]));
|
&lease -> hardware_addr.hbuf [1]));
|
||||||
log_debug (" host %s ",
|
log_debug (" host %s ",
|
||||||
lease -> host ? lease -> host -> name : "<none>");
|
lease -> host ? lease -> host -> name : "<none>");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (DEBUG_PACKET)
|
#if defined (DEBUG_PACKET)
|
||||||
void dump_packet_option (struct option_cache *oc,
|
void dump_packet_option (struct option_cache *oc,
|
||||||
@ -301,7 +301,7 @@ void dump_raw (buf, len)
|
|||||||
/*
|
/*
|
||||||
1 2 3 4 5 6 7
|
1 2 3 4 5 6 7
|
||||||
01234567890123456789012345678901234567890123456789012345678901234567890123
|
01234567890123456789012345678901234567890123456789012345678901234567890123
|
||||||
280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .................
|
280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .................
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memset(lbuf, ' ', 79);
|
memset(lbuf, ' ', 79);
|
||||||
@ -446,7 +446,7 @@ void print_hex_or_string (len, data, limit, buf)
|
|||||||
/*
|
/*
|
||||||
* print a string as either hex or text
|
* print a string as either hex or text
|
||||||
* using static buffers to hold the output
|
* using static buffers to hold the output
|
||||||
*
|
*
|
||||||
* len - length of data
|
* len - length of data
|
||||||
* data - input data
|
* data - input data
|
||||||
* limit - length of buf
|
* limit - length of buf
|
||||||
@ -499,7 +499,7 @@ char *print_dotted_quads (len, data)
|
|||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
s = &dq_buf [0];
|
s = &dq_buf [0];
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
/* %Audit% Loop bounds checks to 21 bytes. %2004.06.17,Safe%
|
/* %Audit% Loop bounds checks to 21 bytes. %2004.06.17,Safe%
|
||||||
@ -554,7 +554,7 @@ static unsigned print_subexpression (expr, buf, len)
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case expr_match:
|
case expr_match:
|
||||||
if (len > 7) {
|
if (len > 7) {
|
||||||
strcpy (buf, "(match)");
|
strcpy (buf, "(match)");
|
||||||
@ -772,7 +772,7 @@ static unsigned print_subexpression (expr, buf, len)
|
|||||||
case expr_binary_xor:
|
case expr_binary_xor:
|
||||||
s = "^";
|
s = "^";
|
||||||
goto binop;
|
goto binop;
|
||||||
|
|
||||||
case expr_not:
|
case expr_not:
|
||||||
if (len > 6) {
|
if (len > 6) {
|
||||||
rv = 5;
|
rv = 5;
|
||||||
@ -1179,7 +1179,7 @@ void print_expression (name, expr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int token_print_indent_concat (FILE *file, int col, int indent,
|
int token_print_indent_concat (FILE *file, int col, int indent,
|
||||||
const char *prefix,
|
const char *prefix,
|
||||||
const char *suffix, ...)
|
const char *suffix, ...)
|
||||||
{
|
{
|
||||||
va_list list;
|
va_list list;
|
||||||
@ -1209,7 +1209,7 @@ int token_print_indent_concat (FILE *file, int col, int indent,
|
|||||||
s = va_arg (list, char *);
|
s = va_arg (list, char *);
|
||||||
}
|
}
|
||||||
va_end (list);
|
va_end (list);
|
||||||
|
|
||||||
col = token_print_indent (file, col, indent,
|
col = token_print_indent (file, col, indent,
|
||||||
prefix, suffix, t);
|
prefix, suffix, t);
|
||||||
dfree (t, MDL);
|
dfree (t, MDL);
|
||||||
@ -1439,3 +1439,43 @@ char *format_lease_id(const unsigned char *s, unsigned len,
|
|||||||
}
|
}
|
||||||
return (idstr);
|
return (idstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a relative path name to an absolute path name
|
||||||
|
*
|
||||||
|
* Not all versions of realpath() support NULL for
|
||||||
|
* the second parameter and PATH_MAX isn't defined
|
||||||
|
* on all systems. For the latter, we'll make what
|
||||||
|
* ought to be a big enough buffer and let it fly.
|
||||||
|
* If passed an absolute path it should return it
|
||||||
|
* an allocated buffer.
|
||||||
|
*/
|
||||||
|
char *absolute_path(const char *orgpath) {
|
||||||
|
char *abspath = NULL;
|
||||||
|
if (orgpath) {
|
||||||
|
#ifdef PATH_MAX
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
#else
|
||||||
|
char buf[2048];
|
||||||
|
int len;
|
||||||
|
#endif
|
||||||
|
errno = 0;
|
||||||
|
if (realpath(orgpath, buf) == NULL) {
|
||||||
|
const char* errmsg = strerror(errno);
|
||||||
|
log_fatal("Failed to get realpath for %s: %s",
|
||||||
|
orgpath, errmsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dup the result into an allocated buffer */
|
||||||
|
abspath = dmalloc(strlen(buf) + 1, MDL);
|
||||||
|
if (abspath == NULL) {
|
||||||
|
log_fatal("No memory for filename:%s\n",
|
||||||
|
buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy (abspath, buf, strlen(buf));
|
||||||
|
abspath[strlen(buf)] = 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (abspath);
|
||||||
|
}
|
||||||
|
@ -2635,6 +2635,7 @@ char *buf_to_hex (const unsigned char *s, unsigned len,
|
|||||||
const char *file, int line);
|
const char *file, int line);
|
||||||
char *format_lease_id(const unsigned char *s, unsigned len, int format,
|
char *format_lease_id(const unsigned char *s, unsigned len, int format,
|
||||||
const char *file, int line);
|
const char *file, int line);
|
||||||
|
char *absolute_path(const char *orgpath);
|
||||||
/* socket.c */
|
/* socket.c */
|
||||||
#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
|
#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
|
||||||
|| defined (USE_SOCKET_FALLBACK)
|
|| defined (USE_SOCKET_FALLBACK)
|
||||||
|
@ -607,11 +607,7 @@ main(int argc, char **argv) {
|
|||||||
* to be reopened after chdir() has been called
|
* to be reopened after chdir() has been called
|
||||||
*/
|
*/
|
||||||
if (have_dhcpd_db && path_dhcpd_db[0] != '/') {
|
if (have_dhcpd_db && path_dhcpd_db[0] != '/') {
|
||||||
const char *path = path_dhcpd_db;
|
path_dhcpd_db = absolute_path(path_dhcpd_db);
|
||||||
path_dhcpd_db = realpath(path_dhcpd_db, NULL);
|
|
||||||
if (path_dhcpd_db == NULL)
|
|
||||||
log_fatal("Failed to get realpath for %s: %s", path,
|
|
||||||
strerror(errno));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user