mirror of https://github.com/ipxe/ipxe.git
[xen] Avoid infinite loop on allocation failure in xenstore_response()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/331/head
parent
85d179f2c6
commit
614d99eba1
|
@ -68,14 +68,14 @@ static void xenstore_send ( struct xen_hypervisor *xen, const void *data,
|
||||||
XENSTORE_RING_IDX cons;
|
XENSTORE_RING_IDX cons;
|
||||||
XENSTORE_RING_IDX idx;
|
XENSTORE_RING_IDX idx;
|
||||||
const char *bytes = data;
|
const char *bytes = data;
|
||||||
size_t offset = 0;
|
size_t offset;
|
||||||
size_t fill;
|
size_t fill;
|
||||||
|
|
||||||
DBGCP ( intf, "XENSTORE raw request:\n" );
|
DBGCP ( intf, "XENSTORE raw request:\n" );
|
||||||
DBGCP_HDA ( intf, MASK_XENSTORE_IDX ( prod ), data, len );
|
DBGCP_HDA ( intf, MASK_XENSTORE_IDX ( prod ), data, len );
|
||||||
|
|
||||||
/* Write one byte at a time */
|
/* Write one byte at a time */
|
||||||
while ( offset < len ) {
|
for ( offset = 0 ; offset < len ; offset++ ) {
|
||||||
|
|
||||||
/* Wait for space to become available */
|
/* Wait for space to become available */
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
|
@ -90,7 +90,7 @@ static void xenstore_send ( struct xen_hypervisor *xen, const void *data,
|
||||||
|
|
||||||
/* Write byte */
|
/* Write byte */
|
||||||
idx = MASK_XENSTORE_IDX ( prod++ );
|
idx = MASK_XENSTORE_IDX ( prod++ );
|
||||||
writeb ( bytes[offset++], &intf->req[idx] );
|
writeb ( bytes[offset], &intf->req[idx] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update producer counter */
|
/* Update producer counter */
|
||||||
|
@ -125,13 +125,13 @@ static void xenstore_recv ( struct xen_hypervisor *xen, void *data,
|
||||||
XENSTORE_RING_IDX prod;
|
XENSTORE_RING_IDX prod;
|
||||||
XENSTORE_RING_IDX idx;
|
XENSTORE_RING_IDX idx;
|
||||||
char *bytes = data;
|
char *bytes = data;
|
||||||
size_t offset = 0;
|
size_t offset;
|
||||||
size_t fill;
|
size_t fill;
|
||||||
|
|
||||||
DBGCP ( intf, "XENSTORE raw response:\n" );
|
DBGCP ( intf, "XENSTORE raw response:\n" );
|
||||||
|
|
||||||
/* Read one byte at a time */
|
/* Read one byte at a time */
|
||||||
while ( offset < len ) {
|
for ( offset = 0 ; offset < len ; offset++ ) {
|
||||||
|
|
||||||
/* Wait for data to be ready */
|
/* Wait for data to be ready */
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
|
@ -147,7 +147,7 @@ static void xenstore_recv ( struct xen_hypervisor *xen, void *data,
|
||||||
/* Read byte */
|
/* Read byte */
|
||||||
idx = MASK_XENSTORE_IDX ( cons++ );
|
idx = MASK_XENSTORE_IDX ( cons++ );
|
||||||
if ( data )
|
if ( data )
|
||||||
bytes[offset++] = readb ( &intf->rsp[idx] );
|
bytes[offset] = readb ( &intf->rsp[idx] );
|
||||||
}
|
}
|
||||||
if ( data )
|
if ( data )
|
||||||
DBGCP_HDA ( intf, MASK_XENSTORE_IDX ( cons - len ), data, len );
|
DBGCP_HDA ( intf, MASK_XENSTORE_IDX ( cons - len ), data, len );
|
||||||
|
|
Loading…
Reference in New Issue