Mercurial > hg > xemacs-beta
comparison src/doc.c @ 3411:41c353ad2c74
[xemacs-hg @ 2006-05-21 18:35:30 by aidan]
Incorporate Fabrice's fix of my buffer overrun bug.
author | aidan |
---|---|
date | Sun, 21 May 2006 18:35:31 +0000 |
parents | 3583b965b1c5 |
children | 2ba8b7a25429 |
comparison
equal
deleted
inserted
replaced
3410:4af600509221 | 3411:41c353ad2c74 |
---|---|
47 Ibyte *name_nonreloc, Lisp_Object name_reloc, | 47 Ibyte *name_nonreloc, Lisp_Object name_reloc, |
48 int standard_doc_file) | 48 int standard_doc_file) |
49 { | 49 { |
50 Ibyte buf[DOC_MAX_FILENAME_LENGTH+1]; | 50 Ibyte buf[DOC_MAX_FILENAME_LENGTH+1]; |
51 Ibyte *buffer = buf; | 51 Ibyte *buffer = buf; |
52 int buffer_size = sizeof (buf), space_left; | 52 int buffer_size = sizeof (buf) - 1, space_left; |
53 Ibyte *from, *to; | 53 Ibyte *from, *to; |
54 REGISTER Ibyte *p = buffer; | 54 REGISTER Ibyte *p = buffer; |
55 Lisp_Object return_me; | 55 Lisp_Object return_me; |
56 Lisp_Object fdstream = Qnil, instream = Qnil; | 56 Lisp_Object fdstream = Qnil, instream = Qnil; |
57 struct gcpro gcpro1, gcpro2; | 57 struct gcpro gcpro1, gcpro2; |
58 EMACS_INT position, seenS = 0; | 58 EMACS_INT position, seenS = 0; |
59 | 59 |
60 GCPRO2 (fdstream, instream); | 60 GCPRO2 (fdstream, instream); |
61 | 61 |
62 position = doc_pos > DOC_MAX_FILENAME_LENGTH ? | 62 position = doc_pos > buffer_size ? |
63 doc_pos - DOC_MAX_FILENAME_LENGTH : 0; | 63 doc_pos - buffer_size : 0; |
64 | 64 |
65 if (0 > lseek (fd, position, 0)) | 65 if (0 > lseek (fd, position, 0)) |
66 { | 66 { |
67 if (name_nonreloc) | 67 if (name_nonreloc) |
68 name_reloc = build_intstring (name_nonreloc); | 68 name_reloc = build_intstring (name_nonreloc); |
166 Ibyte *name_nonreloc, Lisp_Object name_reloc, | 166 Ibyte *name_nonreloc, Lisp_Object name_reloc, |
167 int standard_doc_file) | 167 int standard_doc_file) |
168 { | 168 { |
169 Ibyte buf[512 * 32 + 1]; | 169 Ibyte buf[512 * 32 + 1]; |
170 Ibyte *buffer = buf; | 170 Ibyte *buffer = buf; |
171 int buffer_size = sizeof (buf); | 171 int buffer_size = sizeof (buf) - 1; |
172 Ibyte *from, *to; | 172 Ibyte *from, *to; |
173 REGISTER Ibyte *p = buffer; | 173 REGISTER Ibyte *p = buffer; |
174 Lisp_Object return_me; | 174 Lisp_Object return_me; |
175 Lisp_Object fdstream = Qnil, instream = Qnil; | 175 Lisp_Object fdstream = Qnil, instream = Qnil; |
176 struct gcpro gcpro1, gcpro2; | 176 struct gcpro gcpro1, gcpro2; |
213 | 213 |
214 /* Switch to a bigger buffer if we need one. */ | 214 /* Switch to a bigger buffer if we need one. */ |
215 if (space_left == 0) | 215 if (space_left == 0) |
216 { | 216 { |
217 Ibyte *old_buffer = buffer; | 217 Ibyte *old_buffer = buffer; |
218 buffer_size *= 2; | |
219 | |
218 if (buffer == buf) | 220 if (buffer == buf) |
219 { | 221 { |
220 buffer = xnew_ibytes (buffer_size *= 2); | 222 buffer = xnew_ibytes (buffer_size + 1); |
221 memcpy (buffer, old_buffer, p - old_buffer); | 223 memcpy (buffer, old_buffer, p - old_buffer); |
222 } | 224 } |
223 else | 225 else |
224 XREALLOC_ARRAY (buffer, Ibyte, buffer_size *= 2); | 226 XREALLOC_ARRAY (buffer, Ibyte, buffer_size + 1); |
225 p += buffer - old_buffer; | 227 p += buffer - old_buffer; |
226 space_left = buffer_size - (p - buffer); | 228 space_left = buffer_size - (p - buffer); |
227 } | 229 } |
228 | 230 |
229 /* Don't read too much at one go. */ | 231 /* Don't read too much at one go. */ |