-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJWV8L6AAoJEO8Ells5jWIR3AsH/2TKLFPXXLaGYGx1Npds00NS mhdQ2lnFz5P1F+BBr2xNwTTzf6MIGwbsLSK6ntHZvJ5Tdsy3XhpvUoKHVzQfJabZ S1CveKl6UzbtZurvsa3tkyXcBHENCii2FZN+gAlPN74Qhd8D64Srg9sfwLXZJ+lU ApJxtH1UJgRlgjhHt0kq06e4zcpv6IbLx4ZwQMyZYY4UfK4P817/B37dcWwk0zeg hABs3w1YztKlWdteEp6TdI70/by3P+wLT9CwF8EzrbJ+5sfi/YAxBPYse4qOzT+B tYAe6I8Kh5JtPKjtKAHqb8YL60scYxDuPx/mwzfptZMTRqdbxEo5PPmrQI1ZLgo= =JGeE -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Fri 27 Nov 2015 02:42:02 GMT using RSA key ID 398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: tap-win32: disable broken async write path tap-win32: skip unexpected nodes during registry enumeration eepro100: Prevent two endless loops Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
714487515d
@ -774,6 +774,11 @@ static void tx_command(EEPRO100State *s)
|
||||
#if 0
|
||||
uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6);
|
||||
#endif
|
||||
if (tx_buffer_size == 0) {
|
||||
/* Prevent an endless loop. */
|
||||
logout("loop in %s:%u\n", __FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
tbd_address += 8;
|
||||
TRACE(RXTX, logout
|
||||
("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
|
||||
@ -855,6 +860,10 @@ static void set_multicast_list(EEPRO100State *s)
|
||||
|
||||
static void action_command(EEPRO100State *s)
|
||||
{
|
||||
/* The loop below won't stop if it gets special handcrafted data.
|
||||
Therefore we limit the number of iterations. */
|
||||
unsigned max_loop_count = 16;
|
||||
|
||||
for (;;) {
|
||||
bool bit_el;
|
||||
bool bit_s;
|
||||
@ -870,6 +879,13 @@ static void action_command(EEPRO100State *s)
|
||||
#if 0
|
||||
bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
|
||||
#endif
|
||||
|
||||
if (max_loop_count-- == 0) {
|
||||
/* Prevent an endless loop. */
|
||||
logout("loop in %s:%u\n", __FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
|
||||
s->cu_offset = s->tx.link;
|
||||
TRACE(OTHER,
|
||||
logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
|
||||
|
@ -77,7 +77,12 @@
|
||||
|
||||
//#define DEBUG_TAP_WIN32
|
||||
|
||||
#define TUN_ASYNCHRONOUS_WRITES 1
|
||||
/* FIXME: The asynch write path appears to be broken at
|
||||
* present. WriteFile() ignores the lpNumberOfBytesWritten parameter
|
||||
* for overlapped writes, with the result we return zero bytes sent,
|
||||
* and after handling a single packet, receive is disabled for this
|
||||
* interface. */
|
||||
/* #define TUN_ASYNCHRONOUS_WRITES 1 */
|
||||
|
||||
#define TUN_BUFFER_SIZE 1560
|
||||
#define TUN_MAX_BUFFER_COUNT 32
|
||||
@ -356,7 +361,8 @@ static int get_device_guid(
|
||||
&len);
|
||||
|
||||
if (status != ERROR_SUCCESS || name_type != REG_SZ) {
|
||||
return -1;
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
if (is_tap_win32_dev(enum_name)) {
|
||||
@ -460,27 +466,48 @@ static int tap_win32_write(tap_win32_overlapped_t *overlapped,
|
||||
BOOL result;
|
||||
DWORD error;
|
||||
|
||||
#ifdef TUN_ASYNCHRONOUS_WRITES
|
||||
result = GetOverlappedResult( overlapped->handle, &overlapped->write_overlapped,
|
||||
&write_size, FALSE);
|
||||
|
||||
if (!result && GetLastError() == ERROR_IO_INCOMPLETE)
|
||||
WaitForSingleObject(overlapped->write_event, INFINITE);
|
||||
#endif
|
||||
|
||||
result = WriteFile(overlapped->handle, buffer, size,
|
||||
&write_size, &overlapped->write_overlapped);
|
||||
|
||||
#ifdef TUN_ASYNCHRONOUS_WRITES
|
||||
/* FIXME: we can't sensibly set write_size here, without waiting
|
||||
* for the IO to complete! Moreover, we can't return zero,
|
||||
* because that will disable receive on this interface, and we
|
||||
* also can't assume it will succeed and return the full size,
|
||||
* because that will result in the buffer being reclaimed while
|
||||
* the IO is in progress. */
|
||||
#error Async writes are broken. Please disable TUN_ASYNCHRONOUS_WRITES.
|
||||
#else /* !TUN_ASYNCHRONOUS_WRITES */
|
||||
if (!result) {
|
||||
switch (error = GetLastError())
|
||||
{
|
||||
case ERROR_IO_PENDING:
|
||||
#ifndef TUN_ASYNCHRONOUS_WRITES
|
||||
WaitForSingleObject(overlapped->write_event, INFINITE);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
error = GetLastError();
|
||||
if (error == ERROR_IO_PENDING) {
|
||||
result = GetOverlappedResult(overlapped->handle,
|
||||
&overlapped->write_overlapped,
|
||||
&write_size, TRUE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!result) {
|
||||
#ifdef DEBUG_TAP_WIN32
|
||||
LPTSTR msgbuf;
|
||||
error = GetLastError();
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
&msgbuf, 0, NULL);
|
||||
fprintf(stderr, "Tap-Win32: Error WriteFile %d - %s\n", error, msgbuf);
|
||||
LocalFree(msgbuf);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
return write_size;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user