pkgsrc/sysutils/xentools45/patches/patch-.._.._ipxe_src_net_fcels.c

124 lines
4.3 KiB
C

$NetBSD: patch-.._.._ipxe_src_net_fcels.c,v 1.1 2015/01/29 21:33:47 joerg Exp $
--- ../../ipxe/src/net/fcels.c.orig 2015-01-25 20:27:57.000000000 +0000
+++ ../../ipxe/src/net/fcels.c
@@ -946,8 +946,11 @@ int fc_els_prli_tx ( struct fc_els *els,
struct fc_els_prli_descriptor *descriptor, void *param ) {
struct {
struct fc_prli_frame frame;
- uint8_t param[descriptor->param_len];
- } __attribute__ (( packed )) prli;
+ uint8_t param[];
+ } __attribute__ (( packed )) *prli;
+ size_t plen = sizeof(*prli) + descriptor->param_len;
+ uint8_t prli_buf[plen];
+ prli = (void *)prli_buf;
struct fc_ulp *ulp;
int rc;
@@ -960,22 +963,22 @@ int fc_els_prli_tx ( struct fc_els *els,
}
/* Build frame for transmission */
- memset ( &prli, 0, sizeof ( prli ) );
- prli.frame.command = fc_els_tx_command ( els, FC_ELS_PRLI );
- prli.frame.page_len =
- ( sizeof ( prli.frame.page ) + sizeof ( prli.param ) );
- prli.frame.len = htons ( sizeof ( prli ) );
- prli.frame.page.type = descriptor->type;
+ memset ( prli, 0, plen );
+ prli->frame.command = fc_els_tx_command ( els, FC_ELS_PRLI );
+ prli->frame.page_len =
+ ( sizeof ( prli->frame.page ) + descriptor->param_len );
+ prli->frame.len = htons ( plen );
+ prli->frame.page.type = descriptor->type;
if ( fc_els_is_request ( els ) ) {
- prli.frame.page.flags |= htons ( FC_PRLI_ESTABLISH );
+ prli->frame.page.flags |= htons ( FC_PRLI_ESTABLISH );
} else if ( fc_link_ok ( &ulp->link ) ) {
- prli.frame.page.flags |= htons ( FC_PRLI_ESTABLISH |
+ prli->frame.page.flags |= htons ( FC_PRLI_ESTABLISH |
FC_PRLI_RESPONSE_SUCCESS );
}
- memcpy ( &prli.param, param, sizeof ( prli.param ) );
+ memcpy ( &prli->param, param, descriptor->param_len );
/* Transmit frame */
- if ( ( rc = fc_els_tx ( els, &prli, sizeof ( prli ) ) ) != 0 )
+ if ( ( rc = fc_els_tx ( els, prli, plen ) ) != 0 )
goto err_tx;
/* Drop temporary reference to ULP */
@@ -1003,13 +1006,14 @@ int fc_els_prli_rx ( struct fc_els *els,
void *data, size_t len ) {
struct {
struct fc_prli_frame frame;
- uint8_t param[descriptor->param_len];
+ uint8_t param[];
} __attribute__ (( packed )) *prli = data;
+ size_t plen = sizeof(*prli) + descriptor->param_len;
struct fc_ulp *ulp;
int rc;
/* Sanity check */
- if ( len < sizeof ( *prli ) ) {
+ if ( len < plen ) {
DBGC ( els, FCELS_FMT " received underlength frame:\n",
FCELS_ARGS ( els ) );
DBGC_HDA ( els, 0, data, len );
@@ -1018,7 +1022,7 @@ int fc_els_prli_rx ( struct fc_els *els,
}
DBGC ( els, FCELS_FMT " has parameters:\n", FCELS_ARGS ( els ) );
- DBGC_HDA ( els, 0, prli->param, sizeof ( prli->param ) );
+ DBGC_HDA ( els, 0, prli->param, descriptor->param_len );
/* Get ULP */
ulp = fc_ulp_get_port_id_type ( els->port, &els->peer_port_id,
@@ -1039,7 +1043,7 @@ int fc_els_prli_rx ( struct fc_els *els,
/* Log in ULP, if applicable */
if ( prli->frame.page.flags & htons ( FC_PRLI_ESTABLISH ) ) {
if ( ( rc = fc_ulp_login ( ulp, prli->param,
- sizeof ( prli->param ),
+ descriptor->param_len,
fc_els_is_request ( els ) ) ) != 0 ){
DBGC ( els, FCELS_FMT " could not log in ULP: %s\n",
FCELS_ARGS ( els ), strerror ( rc ) );
@@ -1089,15 +1093,16 @@ int fc_els_prli_detect ( struct fc_els *
const void *data, size_t len ) {
const struct {
struct fc_prli_frame frame;
- uint8_t param[descriptor->param_len];
+ uint8_t param[];
} __attribute__ (( packed )) *prli = data;
+ size_t plen = sizeof(*prli) + descriptor->param_len;
/* Check for PRLI */
if ( prli->frame.command != FC_ELS_PRLI )
return -EINVAL;
/* Check for sufficient length to contain service parameter page */
- if ( len < sizeof ( *prli ) )
+ if ( len < plen )
return -EINVAL;
/* Check for upper-layer protocol type */
@@ -1252,15 +1257,16 @@ static int fc_els_echo_rx_request ( stru
size_t len ) {
struct {
struct fc_echo_frame_header echo;
- char payload[ len - sizeof ( struct fc_echo_frame_header ) ];
+ char payload[];
} *echo = data;
+ size_t plen = suzeif(*echo) + len - sizeof ( struct fc_echo_frame_header );
int rc;
DBGC ( els, FCELS_FMT "\n", FCELS_ARGS ( els ) );
/* Transmit response */
echo->echo.command = FC_ELS_LS_ACC;
- if ( ( rc = fc_els_tx ( els, echo, sizeof ( *echo ) ) ) != 0 )
+ if ( ( rc = fc_els_tx ( els, echo, plen ) ) != 0 )
return rc;
/* Nothing to do */