From 3357232639b28555ba619d94e7593b884c54d73b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Mon, 13 Mar 2000 17:46:50 +0100
Subject: [PATCH] More DEBUG_MALLOC. Improved argument checking in connect().

Rev: src/modules/files/file.c:1.166
---
 src/modules/files/file.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index c4a7cb58ae..01515c4071 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: file.c,v 1.165 2000/01/30 20:58:17 per Exp $");
+RCSID("$Id: file.c,v 1.166 2000/03/13 16:46:50 grubba Exp $");
 #include "fdlib.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -920,6 +920,7 @@ static void file_write(INT32 args)
       push_constant_text("");
       o_multiply();
       sp--;
+      dmalloc_touch_svalue(sp);
       assign_svalue(sp-args, sp);
 
 #ifdef PIKE_DEBUG
@@ -2185,27 +2186,36 @@ static void file_set_keepalive(INT32 args)
 static void file_connect(INT32 args)
 {
   struct sockaddr_in addr;
-  int tmp;
-  if(args < 2)
-    error("Too few arguments to file->connect()\n");
+  struct pike_string *dest_addr = NULL;
+  struct pike_string *src_addr = NULL;
+  INT_TYPE dest_port = 0;
+  INT_TYPE src_port = 0;
 
-  if(sp[-args].type != T_STRING)
-    error("Bad argument 1 to file->connect()\n");
+  int tmp;
 
-  if(sp[1-args].type != T_INT)
-    error("Bad argument 2 to file->connect()\n");
+  if (args < 4) {
+    get_all_args("file->connect", args, "%S%i", &dest_addr, &dest_port);
+  } else {
+    get_all_args("file->connect", args, "%S%i%S%i",
+		 &dest_addr, &dest_port, &src_addr, &src_port);
+  }
 
   if(FD < 0)
   {
-    file_open_socket(0);
+    if (args < 4) {
+      file_open_socket(0);
+    } else {
+      push_int(src_port);
+      ref_push_string(src_addr);
+      file_open_socket(2);
+    }
     if(IS_ZERO(sp-1) || FD < 0)
       error("file->connect(): Failed to open socket.\n");
     pop_stack();
   }
 
-
-  get_inet_addr(&addr, sp[-args].u.string->str);
-  addr.sin_port = htons(((u_short)sp[1-args].u.integer));
+  get_inet_addr(&addr, dest_addr->str);
+  addr.sin_port = htons(((u_short)dest_port));
 
   tmp=FD;
   THREADS_ALLOW();
-- 
GitLab