diff options
| author | Paul Eggert | 2011-07-28 18:59:57 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-07-28 18:59:57 -0700 |
| commit | a3d9c2a4ce11ea001c9ac97c8a6fb9a4f9a1d1ac (patch) | |
| tree | f03127ba5f01cc430e93b09d510de01c5631343b /src/xrdb.c | |
| parent | c26f25213a70687820290a58189e58e687ef498c (diff) | |
| download | emacs-a3d9c2a4ce11ea001c9ac97c8a6fb9a4f9a1d1ac.tar.gz emacs-a3d9c2a4ce11ea001c9ac97c8a6fb9a4f9a1d1ac.zip | |
* xrdb.c: Integer and memory overflow issues.
(magic_file_p): Plug memory leak on size overflow.
(get_environ_db): Don't assume path length fits in int,
as sprintf is limited to int lengths.
Diffstat (limited to 'src/xrdb.c')
| -rw-r--r-- | src/xrdb.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/xrdb.c b/src/xrdb.c index 6a16e3260bd..7c2cd586b09 100644 --- a/src/xrdb.c +++ b/src/xrdb.c | |||
| @@ -204,7 +204,10 @@ magic_file_p (const char *string, EMACS_INT string_len, const char *class, | |||
| 204 | if (path_size - path_len <= next_len) | 204 | if (path_size - path_len <= next_len) |
| 205 | { | 205 | { |
| 206 | if (min (PTRDIFF_MAX, SIZE_MAX) / 2 - 1 - path_len < next_len) | 206 | if (min (PTRDIFF_MAX, SIZE_MAX) / 2 - 1 - path_len < next_len) |
| 207 | memory_full (SIZE_MAX); | 207 | { |
| 208 | xfree (path); | ||
| 209 | memory_full (SIZE_MAX); | ||
| 210 | } | ||
| 208 | path_size = (path_len + next_len + 1) * 2; | 211 | path_size = (path_len + next_len + 1) * 2; |
| 209 | path = (char *) xrealloc (path, path_size); | 212 | path = (char *) xrealloc (path, path_size); |
| 210 | } | 213 | } |
| @@ -426,24 +429,22 @@ get_environ_db (void) | |||
| 426 | { | 429 | { |
| 427 | XrmDatabase db; | 430 | XrmDatabase db; |
| 428 | char *p; | 431 | char *p; |
| 429 | char *path = 0, *home = 0; | 432 | char *path = 0; |
| 430 | const char *host; | ||
| 431 | 433 | ||
| 432 | if ((p = getenv ("XENVIRONMENT")) == NULL) | 434 | if ((p = getenv ("XENVIRONMENT")) == NULL) |
| 433 | { | 435 | { |
| 434 | home = gethomedir (); | 436 | static char const xdefaults[] = ".Xdefaults-"; |
| 435 | host = get_system_name (); | 437 | char *home = gethomedir (); |
| 436 | path = (char *) xmalloc (strlen (home) | 438 | char const *host = get_system_name (); |
| 437 | + sizeof (".Xdefaults-") | 439 | ptrdiff_t pathsize = strlen (home) + sizeof xdefaults + strlen (host); |
| 438 | + strlen (host)); | 440 | path = (char *) xrealloc (home, pathsize); |
| 439 | sprintf (path, "%s%s%s", home, ".Xdefaults-", host); | 441 | strcat (strcat (path, xdefaults), host); |
| 440 | p = path; | 442 | p = path; |
| 441 | } | 443 | } |
| 442 | 444 | ||
| 443 | db = XrmGetFileDatabase (p); | 445 | db = XrmGetFileDatabase (p); |
| 444 | 446 | ||
| 445 | xfree (path); | 447 | xfree (path); |
| 446 | xfree (home); | ||
| 447 | 448 | ||
| 448 | return db; | 449 | return db; |
| 449 | } | 450 | } |