All of lore.kernel.org
 help / color / mirror / Atom feed
From: "John T. Williams" <jowillia@vt.edu>
To: linux-c-programming <linux-c-programming@vger.kernel.org>
Subject: Nevermind, I'm stupid:  Memory Overright problem.
Date: Wed, 02 Jun 2004 00:18:26 -0400	[thread overview]
Message-ID: <1086149906.23026.2.camel@localhost> (raw)

Anyone who wondering, for some reason (probably blind habit) I was using the 
sizeof() function in my malloc call, when I shouldn't have been, consiquently i was
makeing a bunch of arrays 4 bytes long

>>shakes head, hits self on forhead


While trying to write a function to parse a http url, I ran accross a
strange problem, which is that when I malloc some memory, suddenly some
memory already allocated changes its contents.  I can't figure out where
the problem is so I was hoping someone might point me at it.  

I'm including the code here, and as an attachment 


The problem line is pointed out with at 

***************here********************
***************end here ***************
and its affecting the memory pointed at by http_addr->abspath

#####################################################
#include <string.h>

#ifndef NULL
#define NULL (void*) 0
#endif


typedef struct _http {
  char* query;	// query string
  int  port;	// port number if other then 80
  char* abspath;// absolute path of file on serve
  char* host; 	// domain ex: www.something.com

} http_url;

int parsehttp( http_url*, char* );
int initurl(http_url*);
int cleanurl(http_url*);

int
initurl( http_url* url)
{
  if( !url ) return -1;
  url->host = NULL;
  url->query = NULL;
  url->abspath = NULL;
  url->port = 80;
}

int cleanurl(http_url* url) {
  if( !url ) return -1;
  if(url->host) {
    free(url->host);
    url->host = NULL;
  }
  if(url->query) {
    free(url->query);
    url->query = NULL;
  }
  if(url->abspath) {
    free(url->abspath);
    url->abspath = NULL;
  }
  url->port = 80;
}

int
parsehttp( http_url* http_addr, char* urlstr )
{
  char* host_ptr;
  char* abspath_ptr;
  char* port_ptr;
  char* query_ptr;

  int host_len,
    abspath_len,
    port_len,
    query_len,
    total_len;


  //check for null parameters:
  if( !http_addr || !urlstr ) {
    perror("error called parsehttp with NULL\n");
    return -1;
  }

  //check for http:// head
  if( strncmp(urlstr, "http://", 7) ) {
    perror("url not propperly formatted: %s\n", urlstr);
    return -2;
  }

  // find the starting point for each string
  // if there indicating character is missing *ptr == NULL;
  port_ptr = abspath_ptr = query_ptr = host_ptr = &urlstr[7];
  while(port_ptr && *port_ptr != ':') port_ptr++; //search for ':'
indicating
  //					      		a port in this url
  while(abspath_ptr && *abspath_ptr != '/') abspath_ptr++;
  //					     	search for a '/' indicating
  //						a absolute path listed
  while(query_ptr && *query_ptr != '?') query_ptr++;
  //						search for a '?' indicating
  //						a query is listed

  // Parse out the query if any and record its length
  if(*query_ptr) {
    query_len = strlen(query_ptr);
    http_addr->query = (char*) malloc( sizeof( query_len + 128 ) );
    strncpy(http_addr->query, &query_ptr[1], query_len - 1 );
    http_addr->query[query_len - 1] = '\0';
  } else query_len = 0;

  // Parse out the abspath if any and record its length
  if(*abspath_ptr) {
    abspath_len = strlen(abspath_ptr) - query_len;
    http_addr->abspath = (char*) malloc( sizeof( abspath_len + 128 ) );
    strncpy(http_addr->abspath, abspath_ptr, abspath_len);
    http_addr->abspath[abspath_len] = '\0';
  } else abspath_len = 0;

  // Parse out the port number if any
  if(*port_ptr) {  // if a port was found
    port_len = strlen( port_ptr) - abspath_len - query_len;
    port_ptr++; //move past ':'
    http_addr->port = atoi(port_ptr);
  } else port_len = 0;
  printf("port length: %i\n", port_len);

  // Parse out the host str if any
  if(*host_ptr) {
    host_len = strlen(host_ptr) - port_len - abspath_len - query_len;

/***************here********************/
    http_addr->host = (char*) malloc( sizeof( host_len + 128 ) );
/***************end here ***************/

    strncpy(http_addr->host, host_ptr, host_len );
    http_addr->host[host_len] = '\0';
  }


  return 0;
}


int
main(int argC, char** argV, char** envp)
{
  http_url  url;

  initurl( &url );
  parsehttp( &url,
"http://www.vt.edu:23/users/jowillia/index.html?t=12");


  printf("http://");
  //  if(url.host) printf("%s", url.host);
  if(url.port != 80) printf(":%i", url.port);
  if(url.abspath) printf("%s", url.abspath);
  if(url.query) printf("?%s", url.query);
  printf("\n");

  cleanurl( &url );


  return 0;
}




             reply	other threads:[~2004-06-02  4:18 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-02  4:18 John T. Williams [this message]
2004-06-02 19:11 ` Nevermind, I'm stupid: Memory Overright problem Christoph Bussenius

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1086149906.23026.2.camel@localhost \
    --to=jowillia@vt.edu \
    --cc=jtwilliams@vt.edu \
    --cc=linux-c-programming@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.