Thread overview
C -> D conversion segfault
Aug 03, 2004
teqDruid
Aug 03, 2004
Arcane Jill
Aug 03, 2004
teqDruid
Aug 03, 2004
teqDruid
August 03, 2004
I'm attempting to write some D bindings, however I'm having trouble
porting some code.  The output (correct output) from the C version is
this:
showEnv:   No Fault
showEnv:   XMLRPC-Fault: test (3)

Where as the output from the D Version is:
showEnv:   No Fault
Segmentation fault

In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults.  I'm not sure what I'm doing wrong... or perhaps it's not my bug?

I'm running DMD 0.97 on Linux

TIA
John

Here's the code:

 -----C Version---------
typedef signed int xmlrpc_int32;

typedef struct _xmlrpc_env {
    int   fault_occurred;
    xmlrpc_int32 fault_code;
    char* fault_string;
} xmlrpc_env;

extern void xmlrpc_env_init (xmlrpc_env* env);
extern void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string);

void showEnv(xmlrpc_env* env)
{
	printf("showEnv:   ");
	if (env->fault_occurred)
		printf("XMLRPC-Fault: %s (%d)\n", env->fault_string, env->fault_code);
	else
		printf("No Fault\n");
}

int main(void)
{
	xmlrpc_env env;
	xmlrpc_env_init(&env);
	showEnv(&env);
	xmlrpc_env_set_fault(&env, 3, "test");
	showEnv(&env);

	return 0;
}
--------End C Version-------------

--------D Version---------------
typedef int xmlrpc_int32;

struct xmlrpc_env {
    int   fault_occurred;
    xmlrpc_int32 fault_code;
    char* fault_string;
}

extern(C) void xmlrpc_env_init (xmlrpc_env* env);
extern(C) void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string);

void showEnv(xmlrpc_env* env)
{
	printf("showEnv:   \0");
	if (env.fault_occurred)
		printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code);
	else
		printf("No Fault\n\0");
}

void main()
{
	xmlrpc_env env;
	xmlrpc_env_init(&env);
	showEnv(&env);
	xmlrpc_env_set_fault(&env, 3, "test\0");
	showEnv(&env);
}
------------End D Version

August 03, 2004
In article <pan.2004.08.03.21.10.08.997592@teqdruid.com>, teqDruid says...

Just a thought, but maybe:

#    printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code);

should be

#    printf("XMLRPC-Fault: %s (%d)\n\0", env.fault_string, env.fault_code);

because env.fault_string is a (char*), not a (char[]).

(Fingers crossed)
Jill


August 03, 2004
Yeah... that did it.  Actually, I had hoped that this was a good test case for the other problems I've been having... but I guess not.  I don't think this'll be the end of this, but thanks... for now.

John

On Tue, 03 Aug 2004 21:22:10 +0000, Arcane Jill wrote:

> In article <pan.2004.08.03.21.10.08.997592@teqdruid.com>, teqDruid says...
> 
> Just a thought, but maybe:
> 
> #    printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code);
> 
> should be
> 
> #    printf("XMLRPC-Fault: %s (%d)\n\0", env.fault_string, env.fault_code);
> 
> because env.fault_string is a (char*), not a (char[]).
> 
> (Fingers crossed)
> Jill

August 03, 2004
I was hoping that the previous post was a shorted test case of something
like this.  Here, print_state_name_callback is a callback that the C
library calls.  The pointer to an xmlrpc_env struct is... not right.  I'm
not sure what's wrong with it, but the output (from the
die_if_fault_occurred function) is:
env.fault_occurred: 1886680168
Segmentation fault

I can post xmlrpcd.xmlrpcd and xmlrpcd.client if necessary, but they're rather long.  They're ports of xmlrpc.h and xmlrpc-client.h.  The D program below is a slightly modified port of: http://xmlrpc-c.sourceforge.net/examples/asynch_client.c

The C version works fine.

Any advice?

TIA
John



import xmlrpcd.xmlrpcd;
import xmlrpcd.client;

void die_if_fault_occurred (xmlrpc_env* env)
{
	printf("env.fault_occurred: %d\n\0", env.fault_occurred);
   	if (env.fault_occurred) {
	    printf("XML-RPC Fault:\0");
        printf("%s (%d)\n\0",
                env.fault_string, env.fault_code);
        throw new Exception("XML-RPC Fault");
    }
}

static void print_state_name_callback (char *server_url,
				       char *method_name,
				       xmlrpc_value *param_array,
				       void *user_data,
				       xmlrpc_env* env,
				       xmlrpc_value* result)
{
    int state_number;
    char *state_name;

    /* Check to see if a fault occurred. */
    die_if_fault_occurred(env);

    /* Get our state name. */
    xmlrpc_parse_value(env, result, "s", &state_name);
    die_if_fault_occurred(env);

    printf("State: %s\n", state_name);
}

void main()
{

    xmlrpc_value *result;
    char *state_name;
    int i;

    /* Start up our XML-RPC client library. */
    xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, "Name", "Version");

    /* Make a whole bunch of asynch calls. */
    for (i = 40; i < 45; i++) {
	xmlrpc_client_call_asynch("http://localhost:8080/RPC2",
				  "mirror.Random",
				  &print_state_name_callback, null,
				  "()");
    }

    /* Wait for all calls to complete. */
    xmlrpc_client_event_loop_finish_asynch();

    /* shutdown our XML-RPC client library. */
    xmlrpc_client_cleanup();
}

On Tue, 03 Aug 2004 17:10:09 -0400, teqDruid wrote:

> In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults.  I'm not sure what I'm doing wrong... or perhaps it's not my bug?
> 
> I'm running DMD 0.97 on Linux