Re: OT: Problems with strings



måndagen den 9 maj 2005 23.33 skrev Hongli Lai:
> Magnus Wirström wrote:
> > Hi.
> >
> > I'm a newbie so please don't fry me :)
> > I have a strange problem (at least i think it's strange ;) ). In my app i
> > set up a gchar like this
> >
> > 	gchar *post;
> >
> > 	entry_widget = lookup_widget(GTK_WIDGET(button), "text_bolag");
> > 	buffer = gtk_entry_get_text(GTK_ENTRY(entry_widget));
> > 	strcpy(post,buffer);
> > 	memset(buffer,0,100);
> >
> > When i run it I get segmentation fault and the debugger tell me this
> > error. post		(gchar *)0x12 <Address 0x12 out of bounds>
> >
> > What could generate a such runtime error ? I have no idea why i get this
> > and it have been working before. I'm thankful for any suggestion.
> >
> > If you wanna more info please email me.
>
> It seems you are a newbie to C. I suggest you to borrow a few books
> about C from your local library.
>
> Let us take a look at this piece of code:
>  > 	strcpy(post,buffer);
>
> The function strcpy copies the content of 'buffer' into the memory block
> pointed to by 'post'. However, 'post' is uninitialized, so it doesn't
> point to any memory block! (or actually, it points to random,
> uninitialized garbage memory blocks that you cannot use, because it's
> uninitialized).
>
> You must first allocate memory:
> post = malloc(100);
> strcpy(post, buffer);
>
> However, there are problems in this example! What if 'buffer' is larger
> than 100 bytes? You will get memory corruption. (in this case, it's a
> buffer overflow, so it's a security bug!) There are two ways to solve
> the problem.
> 1. Find out how much memory you need, and allocate that much.
>     gchar *post;
>     int len;
>     ...
>     len = strlen(buffer);
>     /* We allocate len+1 bytes, because strlen() returns the length of
> the string, excluding the trailing NUL */
>     post = malloc(len + 1);
>     strcpy(post, buffer);
>
> 2. Use strncpy(), which puts a limit into how many bytes it will copy at
> most.
>     post = malloc(100);
>     /* Fill the entire memory block full of zeroes. If 'buffer' is
> longer than 99 bytes then this ensures that 'post' is correctly
> NUL-terminated. */
>     memset(post, 0, 100);
>     strncpy(post, buffer, 99);
>
>
> I hope you've learned from what I wrote.
>
> But, there is a much simpler solution to your problem. You just want to
> duplicate a string. In that case, use strdup() (or the glib equivalent:
> g_strdup()):
>
> gchar *post;
>
> entry_widget = lookup_widget(GTK_WIDGET(button), "text_bolag");
> buffer = gtk_entry_get_text(GTK_ENTRY(entry_widget));
> post = g_strdup(buffer);
> memset(buffer,0,100);
> /* Don't forget to free 'post' when you don't need it anymore */

Yes ... much stuff i didn't know about ... I will improve my app with these 
changes. it solved my problem. Thanks... Now i have only one big problem left 
but i think i would be a GTK/GLADE question and i will try to ask it in the 
proper list (if i can find it). If someone is willing of helping me outside 
of this list you are welcome to contact me. 

Thanks again for your time :)
Magnus



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]