Fix strlcpy to not truncate in ndhc.
Length check cleanups. Use xmalloc() rather than malloc().
This commit is contained in:
parent
8aa6d9a320
commit
81398c79fb
21
ndhc/dhcpc.c
21
ndhc/dhcpc.c
@ -50,6 +50,7 @@
|
|||||||
#include "chroot.h"
|
#include "chroot.h"
|
||||||
#include "cap.h"
|
#include "cap.h"
|
||||||
#include "strl.h"
|
#include "strl.h"
|
||||||
|
#include "malloc.h"
|
||||||
|
|
||||||
#define VERSION "1.0"
|
#define VERSION "1.0"
|
||||||
|
|
||||||
@ -455,7 +456,7 @@ static int do_work(void)
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *chroot_dir = NULL;
|
char chroot_dir[255];
|
||||||
int c, len;
|
int c, len;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
uid_t uid = 0;
|
uid_t uid = 0;
|
||||||
@ -489,11 +490,11 @@ int main(int argc, char **argv)
|
|||||||
len = strlen(optarg) > 255 ? 255 : strlen(optarg);
|
len = strlen(optarg) > 255 ? 255 : strlen(optarg);
|
||||||
if (client_config.clientid)
|
if (client_config.clientid)
|
||||||
free(client_config.clientid);
|
free(client_config.clientid);
|
||||||
client_config.clientid = malloc(len + 2);
|
client_config.clientid = xmalloc(len + 1);
|
||||||
client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID;
|
client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID;
|
||||||
client_config.clientid[OPT_LEN] = len;
|
client_config.clientid[OPT_LEN] = len;
|
||||||
client_config.clientid[OPT_DATA] = '\0';
|
strlcpy((char *)client_config.clientid + OPT_DATA, optarg,
|
||||||
strlcpy((char *)client_config.clientid + OPT_DATA, optarg, len);
|
len + 1 - (OPT_DATA - OPT_CODE));
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
client_config.foreground = 1;
|
client_config.foreground = 1;
|
||||||
@ -506,10 +507,11 @@ int main(int argc, char **argv)
|
|||||||
len = strlen(optarg) > 255 ? 255 : strlen(optarg);
|
len = strlen(optarg) > 255 ? 255 : strlen(optarg);
|
||||||
if (client_config.hostname)
|
if (client_config.hostname)
|
||||||
free(client_config.hostname);
|
free(client_config.hostname);
|
||||||
client_config.hostname = malloc(len + 2);
|
client_config.hostname = xmalloc(len + 1);
|
||||||
client_config.hostname[OPT_CODE] = DHCP_HOST_NAME;
|
client_config.hostname[OPT_CODE] = DHCP_HOST_NAME;
|
||||||
client_config.hostname[OPT_LEN] = len;
|
client_config.hostname[OPT_LEN] = len;
|
||||||
strlcpy((char*)client_config.hostname + 2, optarg, len);
|
strlcpy((char*)client_config.hostname + OPT_DATA, optarg,
|
||||||
|
len + 1 - (OPT_DATA - OPT_CODE));
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
client_config.interface = optarg;
|
client_config.interface = optarg;
|
||||||
@ -534,10 +536,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
len = strlen(optarg) > 255 ? 255 : strlen(optarg);
|
strlcpy(chroot_dir, optarg, sizeof chroot_dir);
|
||||||
chroot_dir = malloc(len + 2);
|
|
||||||
memset(chroot_dir, '\0', len + 2);
|
|
||||||
strlcpy(chroot_dir, optarg, len);
|
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
printf("ndhc, version " VERSION "\n\n");
|
printf("ndhc, version " VERSION "\n\n");
|
||||||
@ -555,7 +554,7 @@ int main(int argc, char **argv)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
if (!client_config.clientid) {
|
if (!client_config.clientid) {
|
||||||
client_config.clientid = malloc(6 + 3);
|
client_config.clientid = xmalloc(6 + 3);
|
||||||
client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID;
|
client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID;
|
||||||
client_config.clientid[OPT_LEN] = 7;
|
client_config.clientid[OPT_LEN] = 7;
|
||||||
client_config.clientid[OPT_DATA] = 1;
|
client_config.clientid[OPT_DATA] = 1;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "leases.h"
|
#include "leases.h"
|
||||||
|
#include "malloc.h"
|
||||||
|
|
||||||
/* supported options are easily added here */
|
/* supported options are easily added here */
|
||||||
struct dhcp_option options[] = {
|
struct dhcp_option options[] = {
|
||||||
@ -211,8 +211,8 @@ void attach_option(struct option_set **opt_list, struct dhcp_option *option,
|
|||||||
log_line("Attaching option %s to list", option->name);
|
log_line("Attaching option %s to list", option->name);
|
||||||
|
|
||||||
/* make a new option */
|
/* make a new option */
|
||||||
new = malloc(sizeof(struct option_set));
|
new = xmalloc(sizeof(struct option_set));
|
||||||
new->data = malloc(length + 2);
|
new->data = xmalloc(length + 2);
|
||||||
new->data[OPT_CODE] = option->code;
|
new->data[OPT_CODE] = option->code;
|
||||||
new->data[OPT_LEN] = length;
|
new->data[OPT_LEN] = length;
|
||||||
memcpy(new->data + 2, buffer, length);
|
memcpy(new->data + 2, buffer, length);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user