Fixes for networking and tiny webserver from Max

This commit is contained in:
Gregory Nutt 2014-06-29 09:30:09 -06:00
parent a892171b04
commit 5ac94ff988
3 changed files with 42 additions and 15 deletions

View File

@ -148,26 +148,44 @@ static void work_process(FAR struct wqueue_s *wqueue)
*/
worker = work->worker;
arg = work->arg;
/* Mark the work as no longer being queued */
work->worker = NULL;
/* Do the work. Re-enable interrupts while the work is being
* performed... we don't have any idea how long that will take!
/* Check for a race condition where the work may be nullified
* before it is removed from the queue.
*/
irqrestore(flags);
worker(arg);
if (worker != NULL)
{
/* Extract the work argument (before re-enabling interrupts) */
/* Now, unfortunately, since we re-enabled interrupts we don't
* know the state of the work list and we will have to start
* back at the head of the list.
*/
arg = work->arg;
flags = irqsave();
work = (FAR struct work_s *)wqueue->q.head;
/* Mark the work as no longer being queued */
work->worker = NULL;
/* Do the work. Re-enable interrupts while the work is being
* performed... we don't have any idea how long that will take!
*/
irqrestore(flags);
worker(arg);
/* Now, unfortunately, since we re-enabled interrupts we don't
* know the state of the work list and we will have to start
* back at the head of the list.
*/
flags = irqsave();
work = (FAR struct work_s *)wqueue->q.head;
}
else
{
/* Cancelled.. Just move to the next work in the list with
* interrupts still disabled.
*/
work = (FAR struct work_s *)work->dq.flink;
}
}
else
{

View File

@ -60,10 +60,12 @@
#include <nuttx/fs/fs.h>
#include <nuttx/net/arp.h>
#include <nuttx/net/netdev.h>
#include <nuttx/net/tcp.h>
#include "socket/socket.h"
#include "netdev/netdev.h"
#include "devif/devif.h"
#include "tcp/tcp.h"
/****************************************************************************
* Definitions

View File

@ -126,6 +126,13 @@ static uint16_t upper_layer_chksum(FAR struct net_driver_s *dev, uint8_t proto)
upper_layer_len = (((uint16_t)(pbuf->len[0]) << 8) + pbuf->len[1]) - UIP_IPH_LEN;
#endif /* CONFIG_NET_IPv6 */
/* Verify some minimal assumptions */
if (upper_layer_len > CONFIG_NET_BUFSIZE)
{
return 0;
}
/* First sum pseudo-header. */
/* IP protocol and length fields. This addition cannot carry. */