From 4d198cb07025a8fc341a1e7fd7f9906b5fb714d6 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <garazdawi@gmail.com>
Date: Sun, 27 Nov 2011 17:24:04 +0100
Subject: Only allow tcp sockets as target for sendfile

---
 erts/preloaded/src/prim_file.erl | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

(limited to 'erts')

diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl
index fb19521382..6f35162feb 100644
--- a/erts/preloaded/src/prim_file.erl
+++ b/erts/preloaded/src/prim_file.erl
@@ -545,17 +545,24 @@ write_file(_, _) ->
 %sendfile(_,_,_,_,_,_,_,_,_,_) ->
 %    {error, enotsup};
 sendfile(#file_descriptor{module = ?MODULE, data = {Port, _}},
-	 DestFD, Offset, Bytes, ChunkSize, Headers, Trailers,
-	 Nodiskio, MNowait, Sync) ->
-    drv_command(Port, [<<?FILE_SENDFILE, DestFD:32,
-			 (get_bit(Nodiskio)):1,
-			 (get_bit(MNowait)):1,
-			 (get_bit(Sync)):1,0:5,
-			 Offset:64/unsigned,
-			 Bytes:64/unsigned,
-			 (iolist_size(Headers)):32/unsigned,
-			 (iolist_size(Trailers)):32/unsigned>>,
-		       Headers,Trailers]).
+	 Dest, Offset, Bytes, _ChunkSize, _Headers, _Trailers,
+	 _Nodiskio, _MNowait, _Sync) ->
+    case erlang:port_get_data(Dest) of
+	Data when Data == inet_tcp; Data == inet6_tcp ->
+	    ok = inet:lock_socket(Dest,true),
+	    {ok, DestFD} = prim_inet:getfd(Dest),
+	    try drv_command(Port, [<<?FILE_SENDFILE, DestFD:32,
+				     0:8,
+				     Offset:64/unsigned,
+				     Bytes:64/unsigned,
+				     0:32/unsigned,
+				     0:32/unsigned>>])
+	    after
+		ok = inet:lock_socket(Dest,false)
+	    end;
+	_Else ->
+	    {error,badarg}
+    end.
 
 get_bit(true) ->
     1;
-- 
cgit v1.2.3