mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			K64F EMAC: Fix TX error path leaks
							parent
							
								
									5da3cd9cce
								
							
						
					
					
						commit
						7ce098acb4
					
				| 
						 | 
					@ -410,36 +410,38 @@ void K64F_EMAC::packet_tx()
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
bool K64F_EMAC::link_out(emac_mem_buf_t *buf)
 | 
					bool K64F_EMAC::link_out(emac_mem_buf_t *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  emac_mem_buf_t *temp_pbuf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // If buffer is chained or not aligned then make a contiguous aligned copy of it
 | 
					  // If buffer is chained or not aligned then make a contiguous aligned copy of it
 | 
				
			||||||
  if (memory_manager->get_next(buf) ||
 | 
					  if (memory_manager->get_next(buf) ||
 | 
				
			||||||
      reinterpret_cast<uint32_t>(memory_manager->get_ptr(buf)) % ENET_BUFF_ALIGNMENT) {
 | 
					      reinterpret_cast<uint32_t>(memory_manager->get_ptr(buf)) % ENET_BUFF_ALIGNMENT) {
 | 
				
			||||||
      temp_pbuf = memory_manager->alloc_heap(memory_manager->get_total_len(buf), ENET_BUFF_ALIGNMENT);
 | 
					      emac_mem_buf_t *copy_buf;
 | 
				
			||||||
      if (NULL == temp_pbuf)
 | 
					      copy_buf = memory_manager->alloc_heap(memory_manager->get_total_len(buf), ENET_BUFF_ALIGNMENT);
 | 
				
			||||||
        return false;
 | 
					      if (NULL == copy_buf) {
 | 
				
			||||||
 | 
					          memory_manager->free(buf);
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Copy to new buffer and free original
 | 
					      // Copy to new buffer and free original
 | 
				
			||||||
      memory_manager->copy(temp_pbuf, buf);
 | 
					      memory_manager->copy(copy_buf, buf);
 | 
				
			||||||
      memory_manager->free(buf);
 | 
					      memory_manager->free(buf);
 | 
				
			||||||
  } else {
 | 
					      buf = copy_buf;
 | 
				
			||||||
      temp_pbuf = buf;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Check if a descriptor is available for the transfer. */
 | 
					  /* Check if a descriptor is available for the transfer. */
 | 
				
			||||||
  if (xTXDCountSem.wait(0) == 0)
 | 
					  if (xTXDCountSem.wait(0) == 0) {
 | 
				
			||||||
 | 
					    memory_manager->free(buf);
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Get exclusive access */
 | 
					  /* Get exclusive access */
 | 
				
			||||||
  TXLockMutex.lock();
 | 
					  TXLockMutex.lock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Save the buffer so that it can be freed when transmit is done */
 | 
					  /* Save the buffer so that it can be freed when transmit is done */
 | 
				
			||||||
  tx_buff[tx_produce_index % ENET_TX_RING_LEN] = temp_pbuf;
 | 
					  tx_buff[tx_produce_index % ENET_TX_RING_LEN] = buf;
 | 
				
			||||||
  tx_produce_index += 1;
 | 
					  tx_produce_index += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Setup transfers */
 | 
					  /* Setup transfers */
 | 
				
			||||||
  g_handle.txBdCurrent->buffer = static_cast<uint8_t *>(memory_manager->get_ptr(temp_pbuf));
 | 
					  g_handle.txBdCurrent->buffer = static_cast<uint8_t *>(memory_manager->get_ptr(buf));
 | 
				
			||||||
  g_handle.txBdCurrent->length = memory_manager->get_len(temp_pbuf);
 | 
					  g_handle.txBdCurrent->length = memory_manager->get_len(buf);
 | 
				
			||||||
  g_handle.txBdCurrent->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK);
 | 
					  g_handle.txBdCurrent->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Increase the buffer descriptor address. */
 | 
					  /* Increase the buffer descriptor address. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue