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. */