Hello
I added empty line to apr_pools.c and there is new segfault:
(gdb) bt
#0 apr_palloc (pool=0x80f504028, in_size=Variable "in_size" is not
available.
) at memory/unix/apr_pools.c:253
#1 0x000000080113aa60 in apr_pstrcat (a=Variable "a" is not available.
) at strings/apr_strings.c:149
#2 0x0000000000449aab in pass_request (r=0x80f5040a0,
child=0x8005b3018) at peruser.c:1540
#3 0x0000000000449f3f in peruser_post_read (r=0x80f5040a0) at
peruser.c:3571
#4 0x0000000000429a6a in ap_run_post_read_request (r=0x80f5040a0) at
protocol.c:1671
#5 0x000000000042bdce in ap_read_request (conn=0x80f4fb298) at
protocol.c:1011
#6 0x00000000004410d3 in ap_process_http_connection (c=0x80f4fb298) at
http_core.c:183
#7 0x000000000043d9d2 in ap_run_process_connection (c=0x80f4fb298) at
connection.c:43
#8 0x000000000044ad20 in process_socket (p=0x80f4fb028,
sock=0x80f4fb0a0, conn_id=9, bucket_alloc=0x80f500028, pool=0x80f4f9028)
at peruser.c:1393
#9 0x000000000044bed8 in child_main (child_num_arg=Variable
"child_num_arg" is not available.
) at peruser.c:2242
#10 0x000000000044c6b4 in make_child (s=0x80181a868, slot=9) at
peruser.c:2563
#11 0x000000000044cd76 in ap_mpm_run (_pconf=Variable "_pconf" is not
available.
) at peruser.c:2681
#12 0x000000000042440a in main (argc=1, argv=0x7fffffffeb90) at main.c:739
As you can see the line number is 253. The patch dont change the number
of lines in file.
There is backtrace:
(gdb) bt full
#0 apr_palloc (pool=0x80f504028, in_size=Variable "in_size" is not
available.
) at memory/unix/apr_pools.c:253
active = (apr_memnode_t *) 0x80f504000
node = (apr_memnode_t *) 0x800000065
mem = Variable "mem" is not available.
(gdb) frame 0
#0 apr_palloc (pool=0x80f504028, in_size=Variable "in_size" is not
available.
) at memory/unix/apr_pools.c:253
253 if ((*ref = node->next) == NULL && i >= max_index) {
(gdb) list
248 * nodes waiting in line behind it _and_ we are on
249 * the highest available index, find the new highest
250 * available index
251 */
252
253 if ((*ref = node->next) == NULL && i >= max_index) {
254 do {
255 ref--;
256 max_index--;
257 }
(gdb) list -
238 max_index = allocator->max_index;
239 ref = &allocator->free[index];
240 i = index;
241 while (*ref == NULL && i < max_index) {
242 ref++;
243 i++;
244 }
245
246 if ((node = *ref) != NULL) {
247 /* If we have found a node and it doesn't have any
(gdb) list -
228 /* Walk the free list to see if there are
229 * any nodes on it of the requested size
230 *
231 * NOTE: an optimization would be to check
232 * allocator->free[index] first and if no
233 * node is present, directly use
234 * allocator->free[max_index]. This seems
235 * like overkill though and could cause
236 * memory waste.
237 */
(gdb) list -
218
219 /* First see if there are any nodes in the area we know
220 * our node will fit into.
221 */
222 if (index <= allocator->max_index) {
223 #if APR_HAS_THREADS
224 if (allocator->mutex)
225 apr_thread_mutex_lock(allocator->mutex);
226 #endif /* APR_HAS_THREADS */
227
(gdb) list -
208 size = MIN_ALLOC;
209
210 /* Find the index for this node size by
211 * dividing its size by the boundary size
212 */
213 index = (size >> BOUNDARY_INDEX) - 1;
214
215 if (index > APR_UINT32_MAX) {
216 return NULL;
217 }
(gdb)
And there is you see the patch was applied (line 263)
(gdb) frame 0
#0 apr_palloc (pool=0x80f504028, in_size=Variable "in_size" is not
available.
) at memory/unix/apr_pools.c:253
253 if ((*ref = node->next) == NULL && i >= max_index) {
(gdb) list
248 * nodes waiting in line behind it _and_ we are on
249 * the highest available index, find the new highest
250 * available index
251 */
252
253 if ((*ref = node->next) == NULL && i >= max_index) {
254 do {
255 ref--;
256 max_index--;
257 }
(gdb) list +
258 while (*ref == NULL && max_index > 0);
259
260 allocator->max_index = max_index;
261 }
262
263 allocator->current_free_index += node->index + 1;
264 if (allocator->current_free_index >
allocator->max_free_index)
265 allocator->current_free_index =
allocator->max_free_index;
266
267 #if APR_HAS_THREADS
(gdb)
Best regards
Michal Kumzak
Dne 26.1.2011 15:12, Marcelo Coelho napsal(a):
On Jan 26, 2011, at 11:57 AM, Michal Kumžák wrote:
What is "some frame with request struct"?
Some frame with (r=ADDRESS
Use "bt" command to get a list of frames. Post here and I will help you.
Are you sure that the patch has applied? Your segfault is happening in the same
line number (252).
You can try to put something (maybe an empty) line before 252 line and see if
the next segfault changes to 253.
_______________________________________________
Peruser mailing list
[email protected]
http://www.telana.com/mailman/listinfo/peruser
_______________________________________________
Peruser mailing list
[email protected]
http://www.telana.com/mailman/listinfo/peruser