diff src/util.c @ 7675:66d9440db6ec

[gaim-migrate @ 8319] marv writes: "This fixes some crashes on unusual long profile fields for yahoo, and probably msn. One test case is the yahoo [l]user "kent_nwo4life", which crashes without this patch." committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Sun, 30 Nov 2003 23:49:45 +0000
parents 42e5d2f4e4b1
children 1363f91da9cc
line wrap: on
line diff
--- a/src/util.c	Sun Nov 30 20:33:38 2003 +0000
+++ b/src/util.c	Sun Nov 30 23:49:45 2003 +0000
@@ -434,7 +434,7 @@
 }
 
 gboolean
-gaim_markup_extract_info_field(const char *str, char *dest_buffer,
+gaim_markup_extract_info_field(const char *str, int len, GString *dest,
 							   const char *start_token, int skip,
 							   const char *end_token, char check_value,
 							   const char *no_value_token,
@@ -442,10 +442,9 @@
 							   const char *link_prefix)
 {
 	const char *p, *q;
-	char buf[1024];
 
 	g_return_val_if_fail(str          != NULL, FALSE);
-	g_return_val_if_fail(dest_buffer  != NULL, FALSE);
+	g_return_val_if_fail(dest  != NULL, FALSE);
 	g_return_val_if_fail(start_token  != NULL, FALSE);
 	g_return_val_if_fail(end_token    != NULL, FALSE);
 	g_return_val_if_fail(display_name != NULL, FALSE);
@@ -457,6 +456,9 @@
 
 	p += strlen(start_token) + skip;
 
+	if (p >= str + len)
+		return FALSE;
+
 	if (check_value != '\0' && *p == check_value)
 		return FALSE;
 
@@ -466,36 +468,32 @@
 					  (no_value_token && strncmp(p, no_value_token,
 												 strlen(no_value_token)))))
 	{
-		strcat(dest_buffer, "<b>");
-		strcat(dest_buffer, display_name);
-		strcat(dest_buffer, ":</b> ");
+		g_string_append(dest, "<b>");
+		g_string_append(dest, display_name);
+		g_string_append(dest, ":</b> ");
 
 		if (is_link)
 		{
-			strcat(dest_buffer, "<br><a href=\"");
-			memcpy(buf, p, q - p);
-			buf[q - p] = '\0';
+			g_string_append(dest, "<br><a href=\"");
 
 			if (link_prefix)
-				strcat(dest_buffer, link_prefix);
+				g_string_append(dest, link_prefix);
 
-			strcat(dest_buffer, buf);
-			strcat(dest_buffer, "\">");
+			g_string_append_len(dest, p, q - p);
+			g_string_append(dest, "\">");
 
 			if (link_prefix)
-				strcat(dest_buffer, link_prefix);
+				g_string_append(dest, link_prefix);
 
-			strcat(dest_buffer, buf);
-			strcat(dest_buffer, "</a>");
+			g_string_append_len(dest, p, q - p);
+			g_string_append(dest, "</a>");
 		}
 		else
 		{
-			memcpy(buf, p, q - p);
-			buf[q - p] = '\0';
-			strcat(dest_buffer, buf);
+			g_string_append_len(dest, p, q - p);
 		}
 
-		strcat(dest_buffer, "<br>\n");
+		g_string_append(dest, "<br>\n");
 
 		return TRUE;
 	}