Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / libraries / nacl_io / socket / udp_node.cc
index 807529d..7caef65 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 
+#include "nacl_io/log.h"
 #include "nacl_io/pepper_interface.h"
 #include "nacl_io/socket/packet.h"
 #include "nacl_io/socket/udp_event_emitter.h"
@@ -95,11 +96,8 @@ class UdpRecvWork : public UdpWork {
  public:
   explicit UdpRecvWork(const ScopedUdpEventEmitter& emitter)
       : UdpWork(emitter) {
-    data_ = new char[kMaxPacketSize];
   }
 
-  ~UdpRecvWork() { delete[] data_; }
-
   virtual bool Start(int32_t val) {
     AUTO_LOCK(emitter_->GetLock());
     UdpNode* stream = static_cast<UdpNode*>(emitter_->stream());
@@ -136,6 +134,7 @@ class UdpRecvWork : public UdpWork {
     if (length_error > 0) {
       Packet* packet = new Packet(filesystem()->ppapi());
       packet->Copy(data_, length_error, addr_);
+      filesystem()->ppapi()->ReleaseResource(addr_);
       emitter_->WriteRXPacket_Locked(packet);
       stream->ClearStreamFlags(SSF_RECVING);
       stream->QueueInput();
@@ -145,7 +144,7 @@ class UdpRecvWork : public UdpWork {
   }
 
  private:
-  char* data_;
+  char data_[kMaxPacketSize];
   PP_Resource addr_;
 };
 
@@ -160,20 +159,26 @@ void UdpNode::Destroy() {
   SocketNode::Destroy();
 }
 
-UdpEventEmitter* UdpNode::GetEventEmitter() { return emitter_.get(); }
+UdpEventEmitter* UdpNode::GetEventEmitter() {
+  return emitter_.get();
+}
 
 Error UdpNode::Init(int open_flags) {
   Error err = SocketNode::Init(open_flags);
   if (err != 0)
     return err;
 
-  if (UDPInterface() == NULL)
+  if (UDPInterface() == NULL) {
+    LOG_ERROR("Got NULL interface: UDP");
     return EACCES;
+  }
 
   socket_resource_ =
       UDPInterface()->Create(filesystem_->ppapi()->GetInstance());
-  if (0 == socket_resource_)
+  if (0 == socket_resource_) {
+    LOG_ERROR("Unable to create UDP resource.");
     return EACCES;
+  }
 
   return 0;
 }