comparison src/gio/gio.c @ 3084:e02b6092f70e

gio: handle ungetc() stack accesses larger than size (e.g. support size * nmemb as it should be)
author William Pitcock <nenolod@atheme.org>
date Wed, 29 Apr 2009 20:21:31 -0500
parents 01d2f931aeeb
children f333e6df5fa9
comparison
equal deleted inserted replaced
3083:01d2f931aeeb 3084:e02b6092f70e
107 size_t nmemb, 107 size_t nmemb,
108 VFSFile * file) 108 VFSFile * file)
109 { 109 {
110 VFSGIOHandle *handle; 110 VFSGIOHandle *handle;
111 goffset count = 0; 111 goffset count = 0;
112 gsize realsize = (size * nmemb);
112 113
113 g_return_val_if_fail(file != NULL, EOF); 114 g_return_val_if_fail(file != NULL, EOF);
114 g_return_val_if_fail(file->handle != NULL, EOF); 115 g_return_val_if_fail(file->handle != NULL, EOF);
115 116
116 handle = (VFSGIOHandle *) file->handle; 117 handle = (VFSGIOHandle *) file->handle;
117 118
118 /* handle ungetc() *grumble* --nenolod */ 119 /* handle ungetc() *grumble* --nenolod */
119 if (handle->stream_stack != NULL) 120 if (handle->stream_stack != NULL)
120 { 121 {
121 guchar uc; 122 guchar uc;
122 while ((count < size) && (handle->stream_stack != NULL)) 123 while ((count < realsize) && (handle->stream_stack != NULL))
123 { 124 {
124 uc = GPOINTER_TO_INT(handle->stream_stack->data); 125 uc = GPOINTER_TO_INT(handle->stream_stack->data);
125 handle->stream_stack = g_slist_delete_link(handle->stream_stack, handle->stream_stack); 126 handle->stream_stack = g_slist_delete_link(handle->stream_stack, handle->stream_stack);
126 memcpy(ptr + count, &uc, 1); 127 memcpy(ptr + count, &uc, 1);
127 count++; 128 count++;
128 } 129 }
129 } 130 }
130 131
131 return g_input_stream_read(G_INPUT_STREAM(handle->istream), (ptr + count), ((size * nmemb) - count), NULL, NULL); 132 return g_input_stream_read(G_INPUT_STREAM(handle->istream), (ptr + count), (realsize - count), NULL, NULL);
132 } 133 }
133 134
134 size_t 135 size_t
135 gio_aud_vfs_fwrite_impl(gconstpointer ptr, 136 gio_aud_vfs_fwrite_impl(gconstpointer ptr,
136 size_t size, 137 size_t size,