Mercurial > pidgin
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 { |
