Mercurial > audlegacy-plugins
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, |