Brian D
Brian D

Reputation: 10133

Is there any reason this function call shouldn't work?

When executing the following, GDB says it's failing at the last line of data():

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x00000001000021ee in data (srvr=Cannot access memory at address 0x6567612d726572fd
 ) at /Users/Documents/w11/cs176b/mftp/data.c:121

Do you see any reason why it would fail?

global in control.c, eventually gets strcpy()'d an IP address x.x.x.x

char passive_ip[25] = ""; 

called within control.c

data(passive_ip, passive_port); 

data.c

void data(char* srvr, int prt) { 
    printf("In Data: connecting to %s:%i", srvr, prt);

    struct hostent *hp = gethostbyname(srvr);

    if (hp == NULL) {
        printf("gethostbyname() failed\n");
    } else {
        printf("%s = ", hp->h_name);
        unsigned int i=0;
        //  while ( hp -> h_addr_list[i] != NULL) {
        printf( "%i %s ",i, inet_ntoa( *( struct in_addr*)( hp -> h_addr_list[0])));
        //      i++;
        //  }
        printf("\n");
    }

    char hostname[15];
    strcpy(hostname, inet_ntoa( *( struct in_addr*)( hp -> h_addr_list[0])));


    int sockfd;
    int len;
    struct sockaddr_in address;
    int result;
    char* buffer;


    /*  Create a socket for the client.  */
    sockfd = socket(PF_INET, SOCK_STREAM, 0);

    /*  Name the socket, as agreed with the server.  */
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr(  hostname    );
    address.sin_port = htons(prt);
    len = sizeof(address);

    /*  Now connect our socket to the server's socket.  */
    result = connect(sockfd, (struct sockaddr *)&address, len);

    if(result == -1) {
        perror("oops (data): client3");
        exit(1);
    }

    read(sockfd, buffer, MY_BUFFER_SIZE);


} // this is line 121

Upvotes: 0

Views: 1129

Answers (2)

paxdiablo
paxdiablo

Reputation: 881113

The first thing I'd be doing is changing:

char hostname[15];

to:

char hostname[16];

You may well be overflowing the buffer, which would cause stack corruption. A full IPv4 address needs 16 characters: nnn.nnn.nnn.nnn plus a terminating \0. In reality, you probably shouldn't be using those calls if you're the least bit interested in handling IPv6 - I'm pretty certain they don't play well in that world. But that's a different issue.


The other problem you have (and this is almost certainly the cause of your crash) is that you do:

char *buffer;
:
read(sockfd, buffer, MY_BUFFER_SIZE);

without actually allocating memory for that buffer, so that buffer will point to some arbitrary location. Either use:

char buffer[MY_BUFFER_SIZE];

or:

char *buffer = malloc (MY_BUFFER_SIZE);

remembering to check for allocation failure and free it when no longer required.

Upvotes: 4

Jonathan Leffler
Jonathan Leffler

Reputation: 753455

The last line of the function data() is the read(). You are trying to read data into buffer; you have not allocated any storage for buffer, so the pointer is (luckily for you) NULL, leading to the crash.

Upvotes: 2

Related Questions