comparison src/util.c @ 11237:237d65590d2b

[gaim-migrate @ 13388] Fix a potential crash substituting AIM away message strings. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Fri, 12 Aug 2005 01:08:32 +0000
parents 6932df31225f
children e4868370c433
comparison
equal deleted inserted replaced
11236:fd6d96ef5c6d 11237:237d65590d2b
2299 2299
2300 gchar * 2300 gchar *
2301 gaim_str_sub_away_formatters(const char *str, const char *name) 2301 gaim_str_sub_away_formatters(const char *str, const char *name)
2302 { 2302 {
2303 char *c; 2303 char *c;
2304 gchar *cpy; 2304 GString *cpy;
2305 int cnt = 0;
2306 time_t t; 2305 time_t t;
2307 struct tm *tme; 2306 struct tm *tme;
2308 char tmp[20]; 2307 char tmp[20];
2309 2308
2310 g_return_val_if_fail(str != NULL, NULL); 2309 g_return_val_if_fail(str != NULL, NULL);
2311 g_return_val_if_fail(name != NULL, NULL); 2310 g_return_val_if_fail(name != NULL, NULL);
2312 2311
2313 cpy = g_malloc(BUF_LONG); 2312 /* Create an empty GString that is hopefully big enough for most messages */
2313 cpy = g_string_sized_new(1024);
2314 2314
2315 t = time(NULL); 2315 t = time(NULL);
2316 tme = localtime(&t); 2316 tme = localtime(&t);
2317 2317
2318 cpy[0] = '\0';
2319 c = (char *)str; 2318 c = (char *)str;
2320 while (*c) { 2319 while (*c) {
2321 switch (*c) { 2320 switch (*c) {
2322 case '%': 2321 case '%':
2323 if (*(c + 1)) { 2322 if (*(c + 1)) {
2324 switch (*(c + 1)) { 2323 switch (*(c + 1)) {
2325 case 'n': 2324 case 'n':
2326 /* append name */ 2325 /* append name */
2327 strcpy(cpy + cnt, name); 2326 g_string_append(cpy, name);
2328 cnt += strlen(name);
2329 c++; 2327 c++;
2330 break; 2328 break;
2331 case 'd': 2329 case 'd':
2332 /* append date */ 2330 /* append date */
2333 strftime(tmp, 20, "%m/%d/%Y", tme); 2331 strftime(tmp, 20, "%m/%d/%Y", tme);
2334 strcpy(cpy + cnt, tmp); 2332 g_string_append(cpy, tmp);
2335 cnt += strlen(tmp);
2336 c++; 2333 c++;
2337 break; 2334 break;
2338 case 't': 2335 case 't':
2339 /* append time */ 2336 /* append time */
2340 strftime(tmp, 20, "%I:%M:%S %p", tme); 2337 strftime(tmp, 20, "%I:%M:%S %p", tme);
2341 strcpy(cpy + cnt, tmp); 2338 g_string_append(cpy, tmp);
2342 cnt += strlen(tmp);
2343 c++; 2339 c++;
2344 break; 2340 break;
2345 default: 2341 default:
2346 cpy[cnt++] = *c; 2342 g_string_append_c(cpy, *c);
2347 } 2343 }
2348 } else { 2344 } else {
2349 cpy[cnt++] = *c; 2345 g_string_append_c(cpy, *c);
2350 } 2346 }
2351 break; 2347 break;
2352 default: 2348 default:
2353 cpy[cnt++] = *c; 2349 g_string_append_c(cpy, *c);
2354 } 2350 }
2355 c++; 2351 c++;
2356 } 2352 }
2357 cpy[cnt] = '\0'; 2353
2358 2354 return g_string_free(cpy, FALSE);
2359 return cpy;
2360 } 2355 }
2361 2356
2362 gchar * 2357 gchar *
2363 gaim_strdup_withhtml(const gchar *src) 2358 gaim_strdup_withhtml(const gchar *src)
2364 { 2359 {