@@ -338,37 +338,49 @@ def ql_syscall_bind(ql: Qiling, bind_fd, bind_addr, bind_addrlen):
338338 return regreturn
339339
340340
341- def ql_syscall_getsockname (ql : Qiling , sockfd , addr , addrlenptr ):
342- if 0 <= sockfd < NR_OPEN and ql .os .fd [sockfd ] != 0 :
343- host , port = ql .os .fd [sockfd ].getsockname ()
344- data = struct .pack ("<h" , int (ql .os .fd [sockfd ].family ))
345- data += struct .pack (">H" , port )
346- data += ipaddress .ip_address (host ).packed
347- addrlen = ql .mem .read (addrlenptr , 4 )
348- addrlen = ql .unpack32 (addrlen )
349- data = data [:addrlen ]
350- ql .mem .write (addr , data )
351- regreturn = 0
341+ def ql_syscall_getsockname (ql : Qiling , sockfd : int , addr : int , addrlenptr : int ):
342+ if 0 <= sockfd < NR_OPEN :
343+ socket = ql .os .fd [sockfd ]
344+
345+ if isinstance (socket , ql_socket ):
346+ host , port = socket .getpeername ()
347+
348+ data = struct .pack ("<h" , int (socket .family ))
349+ data += struct .pack (">H" , port )
350+ data += ipaddress .ip_address (host ).packed
351+
352+ addrlen = ql .mem .read_ptr (addrlenptr )
353+
354+ ql .mem .write (addr , data [:addrlen ])
355+ regreturn = 0
356+ else :
357+ regreturn = - EPERM
352358 else :
353- regreturn = - 1
359+ regreturn = - EPERM
354360
355361 ql .log .debug ("getsockname(%d, 0x%x, 0x%x) = %d" % (sockfd , addr , addrlenptr , regreturn ))
356362 return regreturn
357363
358364
359- def ql_syscall_getpeername (ql : Qiling , sockfd , addr , addrlenptr ):
360- if 0 <= sockfd < NR_OPEN and ql .os .fd [sockfd ] != 0 :
361- host , port = ql .os .fd [sockfd ].getpeername ()
362- data = struct .pack ("<h" , int (ql .os .fd [sockfd ].family ))
363- data += struct .pack (">H" , port )
364- data += ipaddress .ip_address (host ).packed
365- addrlen = ql .mem .read (addrlenptr , 4 )
366- addrlen = ql .unpack32 (addrlen )
367- data = data [:addrlen ]
368- ql .mem .write (addr , data )
369- regreturn = 0
365+ def ql_syscall_getpeername (ql : Qiling , sockfd : int , addr : int , addrlenptr : int ):
366+ if 0 <= sockfd < NR_OPEN :
367+ socket = ql .os .fd [sockfd ]
368+
369+ if isinstance (socket , ql_socket ):
370+ host , port = socket .getpeername ()
371+
372+ data = struct .pack ("<h" , int (socket .family ))
373+ data += struct .pack (">H" , port )
374+ data += ipaddress .ip_address (host ).packed
375+
376+ addrlen = ql .mem .read_ptr (addrlenptr )
377+
378+ ql .mem .write (addr , data [:addrlen ])
379+ regreturn = 0
380+ else :
381+ regreturn = - EPERM
370382 else :
371- regreturn = - 1
383+ regreturn = - EPERM
372384
373385 ql .log .debug ("getpeername(%d, 0x%x, 0x%x) = %d" % (sockfd , addr , addrlenptr , regreturn ))
374386 return regreturn
0 commit comments