GTK+ 1.2.10 on Linux has valgrind error inside g_string_sprintf()



Eric M. Monsler wrote:

Attached is the full valgrind log file.

All of the warnings seem to relate to operations after the end of the same 1 byte allocation by g_string_sprintf().


Attached is another valgrind file. In this case the program terminated normally due to operator action, but the errors are shown to have occurred many times.

The malloc of size 1 apparently is due to g_printf_string_upper_bound() returning a length of 1. That can certainly happen when the format string is NULL, but if the format string is NULL then the other string operations should not read or write more than one character, should they?


Eric
==25139== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
==25139== Copyright (C) 2002, and GNU GPL'd, by Julian Seward.
==25139== Using valgrind-1.9.5, a program instrumentation system for x86-linux.
==25139== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward.
==25139== 
==25139== My PID = 25139, parent PID = 25138.  Prog and args are:
==25139==    /home/emonsler/usr/local/bin/avdisplay2.55
==25139==    -ip
==25139==    192.168.51.144
==25139== 
==25139== Startup, with flags:
==25139==    --suppressions=/home/emonsler/testing/lib/valgrind/default.supp
==25139==    --num-callers=8
==25139==    --logfile=/tmp/LindaCrash
==25139==    --workaround-gcc296-bugs=yes
==25139==    --leak-check=yes
==25139==    --run-libc-freeres=no
==25139==    -v
==25139== Reading suppressions file: /home/emonsler/testing/lib/valgrind/default.supp
==25139== Estimated CPU clock rate is 871 MHz
==25139== 
==25139== Reading syms from /home/emonsler/usr/local/bin/avdisplay2.55
==25139== Reading syms from /lib/ld-2.2.2.so
==25139== Reading syms from /home/emonsler/testing/lib/valgrind/vgskin_memcheck.so
==25139== Reading syms from /home/emonsler/testing/lib/valgrind/valgrind.so
==25139== Reading syms from /home/emonsler/usr/local/lib/libgtk-1.2.so.0.9.1
==25139== Reading syms from /home/emonsler/usr/local/lib/libgdk-1.2.so.0.9.1
==25139== Reading syms from /home/emonsler/usr/local/lib/libgtkextra-0.99.so.17.0.0
==25139== Reading syms from /home/emonsler/usr/local/lib/libglib-1.2.so.0.0.10
==25139== Reading syms from /lib/i686/libm-2.2.2.so
==25139== Reading syms from /home/emonsler/usr/local/lib/libgmodule-1.2.so.0.0.10
==25139== Reading syms from /lib/libdl-2.2.2.so
==25139== Reading syms from /usr/X11R6/lib/libXext.so.6.4
==25139==    object doesn't have any debug info
==25139== Reading syms from /usr/X11R6/lib/libX11.so.6.2
==25139==    object doesn't have any debug info
==25139== Reading syms from /lib/i686/libc-2.2.2.so
==25139== Reading syms from /usr/lib/gconv/ISO8859-1.so
==25139==    object doesn't have any debug info
==25139== Reading syms from /lib/libnss_compat-2.2.2.so
==25139== Reading syms from /lib/libnsl-2.2.2.so
==25139== Invalid write of size 1
==25139==    at 0x4063A114: _IO_default_xsputn (genops.c:429)
==25139==    by 0x406305D2: _IO_padn (iopadn.c:66)
==25139==    by 0x40619B0C: __printf_fp (printf_fp.c:1073)
==25139==    by 0x40614B84: _IO_vfprintf (_itoa.h:49)
==25139==    by 0x40631201: _IO_vsprintf (iovsprintf.c:47)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== Invalid write of size 1
==25139==    at 0x40619770: __printf_fp (printf_fp.c:1143)
==25139==    by 0x40614B84: _IO_vfprintf (_itoa.h:49)
==25139==    by 0x40631201: _IO_vsprintf (iovsprintf.c:47)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    Address 0x4177F081 is 4 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== Invalid write of size 1
==25139==    at 0x40631230: _IO_vsprintf (iovsprintf.c:50)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F086 is 9 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== Invalid read of size 1
==25139==    at 0x40169BF9: strlen (vg_clientfuncs.c:439)
==25139==    by 0x40492062: g_string_append (gstring.c:296)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== Invalid read of size 1
==25139==    at 0x40169C1E: strcpy (vg_clientfuncs.c:446)
==25139==    by 0x40492092: g_string_append (gstring.c:299)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== Invalid read of size 1
==25139==    at 0x40169C18: strcpy (vg_clientfuncs.c:446)
==25139==    by 0x40492092: g_string_append (gstring.c:299)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== ERROR SUMMARY: 1092 errors from 6 contexts (suppressed: 126 from 1)
==25139== 
==25139== 28 errors in context 1 of 6:
==25139== Invalid write of size 1
==25139==    at 0x40631230: _IO_vsprintf (iovsprintf.c:50)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F086 is 9 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== 112 errors in context 2 of 6:
==25139== Invalid write of size 1
==25139==    at 0x4063A114: _IO_default_xsputn (genops.c:429)
==25139==    by 0x406305D2: _IO_padn (iopadn.c:66)
==25139==    by 0x40619B0C: __printf_fp (printf_fp.c:1073)
==25139==    by 0x40614B84: _IO_vfprintf (_itoa.h:49)
==25139==    by 0x40631201: _IO_vsprintf (iovsprintf.c:47)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== 140 errors in context 3 of 6:
==25139== Invalid write of size 1
==25139==    at 0x40619770: __printf_fp (printf_fp.c:1143)
==25139==    by 0x40614B84: _IO_vfprintf (_itoa.h:49)
==25139==    by 0x40631201: _IO_vsprintf (iovsprintf.c:47)
==25139==    by 0x4048FF93: g_strdup_vprintf (gstrfuncs.c:158)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    Address 0x4177F081 is 4 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== 252 errors in context 4 of 6:
==25139== Invalid read of size 1
==25139==    at 0x40169C18: strcpy (vg_clientfuncs.c:446)
==25139==    by 0x40492092: g_string_append (gstring.c:299)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== 280 errors in context 5 of 6:
==25139== Invalid read of size 1
==25139==    at 0x40169C1E: strcpy (vg_clientfuncs.c:446)
==25139==    by 0x40492092: g_string_append (gstring.c:299)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139== 
==25139== 280 errors in context 6 of 6:
==25139== Invalid read of size 1
==25139==    at 0x40169BF9: strlen (vg_clientfuncs.c:439)
==25139==    by 0x40492062: g_string_append (gstring.c:296)
==25139==    by 0x40492996: g_string_sprintfa_int (gstring.c:484)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    Address 0x4177F07D is 0 bytes after a block of size 1 alloc'd
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x4048FF7C: g_strdup_vprintf (gstrfuncs.c:156)
==25139==    by 0x40492980: g_string_sprintfa_int (gstring.c:483)
==25139==    by 0x404929E9: g_string_sprintf (gstring.c:498)
==25139==    by 0x8057FBF: vGenMetDispMsgHandling (avd_genmet.c:2220)
==25139==    by 0x8062DF8: vPassMessageToDisplay (avd_disp_msgs.c:1033)
==25139==    by 0x806381B: vReadIncomingUDP (avd_disp_msgs.c:1496)
--25139-- 
--25139-- supp:  126 write(buf)/libc-2.2.4.so/libX11.so.6.2/libX11.so.6.2(Param)
==25139== 
==25139== IN SUMMARY: 1092 errors from 6 contexts (suppressed: 126 from 1)
==25139== 
==25139== malloc/free: in use at exit: 578305 bytes in 3759 blocks.
==25139== malloc/free: 1217837 allocs, 1214078 frees, 491643119 bytes allocated.
==25139== 
==25139== searching for pointers to 3759 not-freed blocks.
==25139== checked 8142012 bytes.
==25139== 
==25139== 260000 bytes in 4 blocks are possibly lost in loss record 73 of 73
==25139==    at 0x40169340: malloc (vg_clientfuncs.c:103)
==25139==    by 0x40485AF6: g_malloc (gmem.c:177)
==25139==    by 0x80636EE: vReadIncomingUDP (avd_disp_msgs.c:1439)
==25139==    by 0x403B6A1B: gdk_io_invoke (gdkevents.c:882)
==25139==    by 0x4048274B: g_io_unix_dispatch (giounix.c:137)
==25139==    by 0x4048453B: g_main_dispatch (gmain.c:656)
==25139==    by 0x40484D6D: g_main_iterate (gmain.c:877)
==25139==    by 0x40484F5B: g_main_run (gmain.c:935)
==25139== 
==25139== LEAK SUMMARY:
==25139==    definitely lost: 0 bytes in 0 blocks.
==25139==    possibly lost:   260000 bytes in 4 blocks.
==25139==    still reachable: 318305 bytes in 3755 blocks.
==25139==         suppressed: 0 bytes in 0 blocks.
==25139== Reachable blocks (those to which a pointer was found) are not shown.
==25139== To see them, rerun with: --show-reachable=yes
==25139== 
--25139--     TT/TC: 0 tc sectors discarded.
--25139--            25346 chainings, 0 unchainings.
--25139-- translate: new     31714 (509904 -> 7096684; ratio 139:10)
--25139--            discard 0 (0 -> 0; ratio 0:10).
--25139--  dispatch: 759300000 jumps (bb entries), of which 121664208 (16%) were unchained.
--25139--            15187/2883605 major/minor sched events.  281109 tt_fast misses.
--25139-- reg-alloc: 4868 t-req-spill, 1304178+30689 orig+spill uis, 157123 total-reg-r.
--25139--    sanity: 15188 cheap, 608 expensive checks.
--25139--    ccalls: 160045 C calls, 57% saves+restores avoided (539192 bytes)
--25139--            204061 args, avg 0.88 setup instrs each (45004 bytes)
--25139--            0% clear the stack (480135 bytes)
--25139--            63411 retvals, 35% of reg-reg movs avoided (43476 bytes)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]