X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Ffile.c;h=02b187231716e318964dc77681637d000ad2a35a;hp=81d91a9f6c6341511238d03439cdd8be46ed9ac3;hb=caa5b9fc39eab729963d70d9910b6319a866fae4;hpb=9a83909ef3d17b0ea205d32b6aa07ac6bea7260c diff --git a/second/file.c b/second/file.c index 81d91a9..02b1872 100644 --- a/second/file.c +++ b/second/file.c @@ -88,7 +88,7 @@ static char * is_valid_ipv4_str(char *str) /* - * Copy the string from source to dest till newline or comma(,) is seen + * Copy the string from source to dest until the end of string or comma is seen * in the source. * Move source and dest pointers respectively. * Returns pointer to the start of the string that has just been copied. @@ -104,9 +104,9 @@ scopy(char **dest, char **source) while (**source != ',' && **source != '\0') *(*dest)++ = *(*source)++; if (**source != '\0') - *(*source)++; + (void)*(*source)++; **dest = '\0'; - *(*dest)++; + (void)*(*dest)++; return ret; } @@ -163,9 +163,14 @@ extract_ipv4_args(char *imagepath, struct boot_fspec_t *result) args++; /* If comma(,) is not immediately followed by ':' then go past the , */ /* - * read the arguments in order: siaddr,filename,ciaddr,giaddr, + * read the arguments in order: vtag,siaddr,filename,ciaddr,giaddr, * bootp-retries,tftp-retries,addl_prameters */ + if ((tmp = strstr(imagepath, "vtag=")) != NULL) { + result->vtag = scopy(&str, &tmp); + args = tmp; + } + result->siaddr = is_valid_ipv4_str(scopy(&str, &args)); result->file = scopy(&str, &args); result->ciaddr = is_valid_ipv4_str(scopy(&str, &args)); @@ -186,7 +191,6 @@ enum dhcp_options { DHCP_PAD = 0, DHCP_NETMASK = 1, DHCP_ROUTERS = 3, - DHCP_DNS = 6, DHCP_END = 255, }; @@ -218,13 +222,18 @@ extract_vendor_options(struct bootp_packet *packet, struct boot_fspec_t *result) * it's malformed. :( */ while (options[i] != DHCP_END) { __u8 tag = options[i++], len; - __u32 value; + __u32 value = 0; if (tag == DHCP_PAD) continue; len = options[i++]; - memcpy(&value, &options[i], len); + /* Clamp the maxium length of the memcpy() to the right size for + * value. */ + if (len > sizeof(value)) + memcpy(&value, &options[i], sizeof(value)); + else + memcpy(&value, &options[i], len); #if DEBUG { @@ -261,10 +270,8 @@ extract_vendor_options(struct bootp_packet *packet, struct boot_fspec_t *result) /* * Check netinfo for ipv4 parameters and add them to the fspec iff the * fspec has no existing value. - * - * Returns 1 on success, 0 on failure. */ -static int +static void extract_netinfo_args(struct boot_fspec_t *result) { struct bootp_packet *packet; @@ -272,7 +279,7 @@ extract_netinfo_args(struct boot_fspec_t *result) /* Check to see if we can get the [scyg]iaddr fields from netinfo */ packet = prom_get_netinfo(); if (!packet) - return 0; + return; DEBUG_F("We have a boot packet\n"); DEBUG_F(" siaddr = <%x>\n", packet->siaddr); @@ -304,8 +311,6 @@ extract_netinfo_args(struct boot_fspec_t *result) result->giaddr = ipv4_to_str(packet->siaddr); DEBUG_F("Forcing giaddr to siaddr <%s>\n", result->giaddr); } - - return 1; } /* @@ -331,6 +336,9 @@ extract_ipv6_args(char *imagepath, struct boot_fspec_t *result) if ((tmp = strstr(imagepath, "dhcpv6=")) != NULL) result->dhcpv6 = scopy(&str, &tmp); + if ((tmp = strstr(imagepath, "vtag=")) != NULL) + result->vtag = scopy(&str, &tmp); + if ((tmp = strstr(imagepath, "ciaddr=")) != NULL) result->ciaddr = scopy(&str, &tmp); @@ -370,7 +378,7 @@ extract_netboot_args(char *imagepath, struct boot_fspec_t *result) ret = extract_ipv6_args(imagepath, result); else ret = extract_ipv4_args(imagepath, result); - ret |= extract_netinfo_args(result); + extract_netinfo_args(result); DEBUG_F("ipv6 = <%d>\n", result->is_ipv6); DEBUG_F("siaddr = <%s>\n", result->siaddr); @@ -675,6 +683,9 @@ int open_file(struct boot_fspec_t* spec, struct boot_file_t* file) case FILE_DEVICE_BLOCK: DEBUG_F("device is a block device\n"); return file_block_open(file, spec, spec->part); + case FILE_DEVICE_ISCSI: + DEBUG_F("device is a iSCSI device\n"); + return file_block_open(file, spec, spec->part); case FILE_DEVICE_NET: DEBUG_F("device is a network device\n"); return file_net_open(file, spec);