2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-09-02 23:35:23 +00:00

Return error status when duplicate hostname found instead of bombing.

This commit is contained in:
Ted Lemon
1999-09-16 05:12:38 +00:00
parent 696337081a
commit 92ce3f81d1
3 changed files with 47 additions and 28 deletions

View File

@@ -22,7 +22,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: memory.c,v 1.58 1999/09/16 01:19:52 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n"; "$Id: memory.c,v 1.59 1999/09/16 05:12:33 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@@ -40,7 +40,7 @@ static struct host_decl *dynamic_hosts;
omapi_object_type_t *dhcp_type_host; omapi_object_type_t *dhcp_type_host;
void enter_host (hd, dynamicp, commit) isc_result_t enter_host (hd, dynamicp, commit)
struct host_decl *hd; struct host_decl *hd;
int dynamicp; int dynamicp;
int commit; int commit;
@@ -49,6 +49,30 @@ void enter_host (hd, dynamicp, commit)
struct host_decl *np = (struct host_decl *)0; struct host_decl *np = (struct host_decl *)0;
struct executable_statement *esp; struct executable_statement *esp;
if (!host_name_hash) {
host_name_hash = new_hash ();
if (!host_name_hash)
log_fatal ("Can't allocate host name hash");
} else {
hp = (struct host_decl *)
hash_lookup (host_name_hash,
(unsigned char *)hd -> name,
strlen (hd -> name));
/* If there isn't already a host decl matching this
address, add it to the hash table. */
if (!hp) {
add_hash (host_name_hash,
(unsigned char *)hd -> name,
strlen (hd -> name),
(unsigned char *)hd);
hd -> refcnt++; /* XXX */
} else
/* XXX actually, we have to delete the old one
XXX carefully and replace it. Not done yet. */
return ISC_R_EXISTS;
}
if (dynamicp) { if (dynamicp) {
hd -> flags |= HOST_DECL_DYNAMIC; hd -> flags |= HOST_DECL_DYNAMIC;
hd -> n_dynamic = dynamic_hosts; hd -> n_dynamic = dynamic_hosts;
@@ -148,32 +172,12 @@ void enter_host (hd, dynamicp, commit)
} }
} }
if (!host_name_hash) {
host_name_hash = new_hash ();
if (!host_name_hash)
log_fatal ("Can't allocate host/hw hash");
} else {
hp = (struct host_decl *)
hash_lookup (host_name_hash,
(unsigned char *)hd -> name,
strlen (hd -> name));
/* If there isn't already a host decl matching this
address, add it to the hash table. */
if (!hp) {
add_hash (host_name_hash,
(unsigned char *)hd -> name, strlen (hd -> name),
(unsigned char *)hd);
hd -> refcnt++; /* XXX */
} else
/* XXX actually, we have to delete the old one
XXX carefully and replace it. Not done yet. */
log_fatal ("duplicate hostname: %s!", hd -> name);
}
if (dynamicp && commit) { if (dynamicp && commit) {
write_host (hd); write_host (hd);
commit_leases (); commit_leases ();
} }
return ISC_R_SUCCESS;
} }
void delete_host (hd, commit) void delete_host (hd, commit)

View File

@@ -22,7 +22,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: confpars.c,v 1.81 1999/09/16 00:52:50 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n"; "$Id: confpars.c,v 1.82 1999/09/16 05:12:38 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@@ -901,6 +901,7 @@ void parse_host_declaration (cfile, group)
int declaration = 0; int declaration = 0;
int dynamicp = 0; int dynamicp = 0;
int deleted = 0; int deleted = 0;
isc_result_t status;
token = peek_token (&val, cfile); token = peek_token (&val, cfile);
if (token != LBRACE) { if (token != LBRACE) {
@@ -968,7 +969,9 @@ void parse_host_declaration (cfile, group)
free_group (host -> group, "parse_host_declaration"); free_group (host -> group, "parse_host_declaration");
dfree (host, "parse_host_declaration"); dfree (host, "parse_host_declaration");
} else { } else {
enter_host (host, dynamicp, 0); status = enter_host (host, dynamicp, 0);
if (status != ISC_R_SUCCESS)
parse_warn ("host %s: %s", isc_result_totext (status));
} }
} }

View File

@@ -29,7 +29,7 @@
#ifndef lint #ifndef lint
static char copyright[] = static char copyright[] =
"$Id: omapi.c,v 1.6 1999/09/16 04:53:38 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n"; "$Id: omapi.c,v 1.7 1999/09/16 05:12:38 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */ #endif /* not lint */
#include "dhcpd.h" #include "dhcpd.h"
@@ -298,6 +298,10 @@ isc_result_t dhcp_lease_signal_handler (omapi_object_t *h,
lease = (struct lease *)h; lease = (struct lease *)h;
if (!strcmp (name, "updated")) { if (!strcmp (name, "updated")) {
if (lease -> hardware_addr.hlen == 0 ||
lease -> hardware_addr.htype == 0 ||
lease -> hardware_addr.hlen > 16)
return ISC_R_INVALIDARG;
if (!write_lease (lease)) if (!write_lease (lease))
return ISC_R_IOERROR; return ISC_R_IOERROR;
} }
@@ -828,6 +832,11 @@ isc_result_t dhcp_host_signal_handler (omapi_object_t *h,
host = (struct host_decl *)h; host = (struct host_decl *)h;
if (!strcmp (name, "updated")) { if (!strcmp (name, "updated")) {
if (host -> interface.hlen == 0 ||
host -> interface.htype == 0 ||
host -> interface.hlen > 16)
return ISC_R_INVALIDARG;
if (!host -> name) { if (!host -> name) {
char hnbuf [64]; char hnbuf [64];
sprintf (hnbuf, "nh%08lx%08lx", sprintf (hnbuf, "nh%08lx%08lx",
@@ -837,7 +846,10 @@ isc_result_t dhcp_host_signal_handler (omapi_object_t *h,
return ISC_R_NOMEMORY; return ISC_R_NOMEMORY;
strcpy (host -> name, hnbuf); strcpy (host -> name, hnbuf);
} }
enter_host (host, 1, 1);
status = enter_host (host, 1, 1);
if (status != ISC_R_SUCCESS)
return status;
} }
/* Try to find some inner object that can take the value. */ /* Try to find some inner object that can take the value. */