From 58a1ee0aeace5a6a9aea4cbdbfe8870d106409f6 Mon Sep 17 00:00:00 2001
From: Sam Moore <matches@ucc.asn.au>
Date: Sat, 17 Mar 2012 15:46:59 +0800
Subject: [PATCH] [PATCH] Attempted fix for occasional execv error

If there are no arguments passed to an AI, pass execv NULL for the arguments.
Passing it a pointer to an array of size zero... is not good.
---
 judge/manager/network_controller.cpp |  4 ++--
 judge/manager/program.cpp            | 16 +++++++++++-----
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/judge/manager/network_controller.cpp b/judge/manager/network_controller.cpp
index fcca84e..5a689a0 100644
--- a/judge/manager/network_controller.cpp
+++ b/judge/manager/network_controller.cpp
@@ -19,7 +19,7 @@ MovementResult NetworkReceiver::QuerySetup(const char * opponentName, string set
 	//fprintf(stderr,"	NetworkReceiver::QuerySetup... ");
 	for (int ii=0; ii < 4; ++ii)
 	{
-		assert(network->GetMessage(setup[ii], 20));
+		assert(network->GetMessage(setup[ii], 20000));
 	}
 	//fprintf(stderr,"Done!\n");
 	return MovementResult::OK;
@@ -34,6 +34,6 @@ MovementResult NetworkSender::QueryMove(string & buffer)
 
 MovementResult NetworkReceiver::QueryMove(string & buffer)
 {
-	assert(network->GetMessage(buffer, 20));
+	assert(network->GetMessage(buffer, 20000));
 	return MovementResult::OK;
 }
diff --git a/judge/manager/program.cpp b/judge/manager/program.cpp
index 2d09a51..02c9cb8 100644
--- a/judge/manager/program.cpp
+++ b/judge/manager/program.cpp
@@ -8,6 +8,7 @@
 #include "program.h"
 #include <vector>
 #include <string.h>
+#include <stdio.h>
 
 using namespace std;
 
@@ -56,10 +57,13 @@ Program::Program(const char * executablePath) : input(NULL), output(NULL), pid(0
 	}
 	while (token != NULL);
 
-	char **  arguments = new char*[args.size()+2];
-	for (unsigned int i=0; i < args.size(); ++i)
-		arguments[i] = args[i];
-
+	char **  arguments = NULL;
+        if (args.size() > 0)
+	{
+		arguments = new char*[args.size()+2];
+		for (unsigned int i=0; i < args.size(); ++i)
+			arguments[i] = args[i];
+	}
 	//See if file exists and is executable...
 	if (access(executablePath, X_OK) != 0)
 	{
@@ -89,8 +93,10 @@ Program::Program(const char * executablePath) : input(NULL), output(NULL), pid(0
 				
 
 		if (access(executablePath, X_OK) == 0) //Check we STILL have permissions to start the file
+		{
 			execv(executablePath,arguments); ///Replace process with desired executable
-		
+		}
+		perror("execv error:\n");
 		fprintf(stderr, "Program::Program - Could not run program \"%s\"!\n", executablePath);
 		exit(EXIT_FAILURE); //We will probably have to terminate the whole program if this happens
 	}
-- 
GitLab