diff options
| author | Paul Eggert | 2011-07-28 13:31:29 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-07-28 13:31:29 -0700 |
| commit | 5d009b3a6a39627db04094e8164df6bb6231b991 (patch) | |
| tree | b580787e09e7a3270ba52fd4de861707622a6d7f /src/coding.c | |
| parent | 17828df2d81aef1c7886cddd881ad6f67f1e4abe (diff) | |
| download | emacs-5d009b3a6a39627db04094e8164df6bb6231b991.tar.gz emacs-5d009b3a6a39627db04094e8164df6bb6231b991.zip | |
* coding.c: Integer and memory overflow fixes.
(produce_chars): Redo buffer-overflow calculations to avoid
unnecessary integer overflow. Check for size overflow.
(encode_coding_object): Don't update size until xmalloc succeeds.
Diffstat (limited to 'src/coding.c')
| -rw-r--r-- | src/coding.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/coding.c b/src/coding.c index 73a4bbc5e25..5fd59d394d9 100644 --- a/src/coding.c +++ b/src/coding.c | |||
| @@ -6683,8 +6683,12 @@ produce_chars (struct coding_system *coding, Lisp_Object translation_table, | |||
| 6683 | break; | 6683 | break; |
| 6684 | } | 6684 | } |
| 6685 | 6685 | ||
| 6686 | if (dst + MAX_MULTIBYTE_LENGTH * to_nchars > dst_end) | 6686 | if ((dst_end - dst) / MAX_MULTIBYTE_LENGTH < to_nchars) |
| 6687 | { | 6687 | { |
| 6688 | if (((min (PTRDIFF_MAX, SIZE_MAX) - (buf_end - buf)) | ||
| 6689 | / MAX_MULTIBYTE_LENGTH) | ||
| 6690 | < to_nchars) | ||
| 6691 | memory_full (SIZE_MAX); | ||
| 6688 | dst = alloc_destination (coding, | 6692 | dst = alloc_destination (coding, |
| 6689 | buf_end - buf | 6693 | buf_end - buf |
| 6690 | + MAX_MULTIBYTE_LENGTH * to_nchars, | 6694 | + MAX_MULTIBYTE_LENGTH * to_nchars, |
| @@ -7888,11 +7892,10 @@ encode_coding_object (struct coding_system *coding, | |||
| 7888 | } | 7892 | } |
| 7889 | else if (EQ (dst_object, Qt)) | 7893 | else if (EQ (dst_object, Qt)) |
| 7890 | { | 7894 | { |
| 7895 | ptrdiff_t dst_bytes = max (1, coding->src_chars); | ||
| 7891 | coding->dst_object = Qnil; | 7896 | coding->dst_object = Qnil; |
| 7892 | coding->dst_bytes = coding->src_chars; | 7897 | coding->destination = (unsigned char *) xmalloc (dst_bytes); |
| 7893 | if (coding->dst_bytes == 0) | 7898 | coding->dst_bytes = dst_bytes; |
| 7894 | coding->dst_bytes = 1; | ||
| 7895 | coding->destination = (unsigned char *) xmalloc (coding->dst_bytes); | ||
| 7896 | coding->dst_multibyte = 0; | 7899 | coding->dst_multibyte = 0; |
| 7897 | } | 7900 | } |
| 7898 | else | 7901 | else |