RE: Program cores on subsequent downloads

Warren,

Check out the CVS tree for libwww. There appears to be a fix for this
problem (or at a minimum, a work around) but it is NOT in the mainline
branch. It is in the branch AMAYA and revision 1.186.2.1 has a check to
ensure that the http pointer is valid before accessing it.

Andy

> -----Original Message-----
> From: www-lib-request@w3.org [mailto:www-lib-request@w3.org]On Behalf Of
> Warren Ho
> Sent: Friday, May 12, 2000 4:45 PM
> To: www-lib@w3.org
> Subject: Program cores on subsequent downloads
>
>
> Hi,
>
> I have a GUI app which performs a file download from some URL.  I have a
> C++ class which wraps some of the libwww functions to perform the actual
> download.
>
> I am able to download the file successfully on the first try, or on
> subsequent tries.  However, the program will eventually core in the
> libwww code as followed:
>
> Program received signal SIGSEGV, Segmentation fault.
> HTTPCleanup (req=0x1175290, status=200) at HTTP.c:159
> 159         if (http->timer) {
> Current language:  auto; currently c
> (gdb) bt
> #0  HTTPCleanup (req=0x1175290, status=200) at HTTP.c:159
> #1  0x7e15e4 in HTTPEvent (soc=0, pVoid=0x11aabd0, type=HTEvent_CLOSE)
>     at HTTP.c:1277
> #2  0x802d24 in HTNet_kill (net=0x11782e8) at HTNet.c:989
> #3  0x802de4 in HTNet_killAll () at HTNet.c:1015
> #4  0x800b9c in HTLibTerminate () at HTLib.c:190
> #5  0x7cc784 in HTProfile_delete () at HTProfil.c:47
> #6  0x1825e4 in HRWWWTransferInterfaceImpl::cleanup (this=0x116ed78,
>     request=@0xefffeab4) at
> ../../../Interface/WWWTransferInterface.C:427
>
> The code in my download function is:
>
> HRError
> HRWWWTransferInterfaceImpl::getFile(
>     const RWCString & strURL,
>     const RWCString & strOutputFilename,
>     HRProgressMonitor *pProgress /* = NULL */)
> {
>     FILE* outputFile = NULL;
>     int   status =     0;
>
>     // Initialisation
>     HTSetTraceMessageMask("sop");       // Show all traces
>     HTRequest * request = HTRequest_new();
>     HTRequest_setOutputFormat(request, DEFAULT_FORMAT);
>     HTRequest_setContext (request, (void*)this);
>
>     HTProfile_newNoCacheClient(APP_NAME, HISTORISK_RELEASE_STRING);
>
>     // If we crap out before calling the terminate callback with a
> successful
>     // load, we want some sort of general failure
>     i_errStatus = HRERR_INIT_FAILURE;
>
>     i_pProgress = pProgress;
>
>     // Capture output and trace messages
>     HTPrint_setCallback(printerCB);
>     HTTrace_setCallback(tracerCB);
>
>     // Delete the default Username/password handler and replace it with
> our own.
>     HTAlert_deleteOpcode(HT_A_USER_PW);
>     HTAlert_add(usernameAndPasswordCB, HT_A_USER_PW);
>
>     // Add default content decoder. We insert a through line as it
> doesn't
>     // matter that we get an encoding that we don't know.
>     HTFormat_addCoding("*", HTIdentityCoding, HTIdentityCoding, 0.3);
>
>     HTParentAnchor * anchor = (HTParentAnchor *)
> HTAnchor_findAddress(strURL);
>
>     // Delete the default progress notification  handler and replace it
> with our own.
>     HTAlert_deleteOpcode(HT_A_PROGRESS);
>     HTAlert_add(progressNotifyCB, HT_A_PROGRESS);
>
>     outputFile = fopen(strOutputFilename, "wb");
>     if (outputFile == NULL)
>     {
>         cleanup(request);
>         i_errStatus = HRERR_CANT_OPEN_FILE;
>         i_errStatus << strOutputFilename;
>         i_errStatus.logError();
>         return i_errStatus;
>     }
>
>     HTRequest_setOutputStream(
>         request,
>         HTFWriter_new(request, outputFile, YES));
>
>     // Set event timeout
>     HTHost_setEventTimeout(i_timeoutSeconds * MILLI_PER_SEC);
>
>     // Make sure that the first request is flushed immediately and not
>     // buffered in the output buffer
>     // Note (marka) I'm not sure if this is necessary, it was copied
> straight
>     //              out of the libwww example
> //    HTRequest_setFlush(request, YES);
>
>     // Add our own filter to update the history list
>     HTNet_addAfter(terminateCB, NULL, NULL, HT_ALL, HT_FILTER_LAST);
>
>     // Start the request
>     status = HTLoadAnchor((HTAnchor *) anchor, request);
>
>
>     if (status != YES)
>     {
>         cleanup(request);
>         i_errStatus = HRERR_WWW_NO_SERVER;
>         i_errStatus.logError();
>         return i_errStatus;
>     }
>
>     // Go into the event loop...
>     HTEventList_loop(request);
>
>     HTEventList_unregisterAll();
>     cleanup(request);
>     return i_errStatus;
> }
>
> where my terminate handler is
>
> int
> HRWWWTransferInterfaceImpl::terminateCB(
>     HTRequest * request,
>     HTResponse * response,
>     void * param,
>     int status)
> {
>     ...
>     HTEventList_stopLoop();
>     return HT_OK;
> }
>
> and the cleanup function contains
>
> void
> HRWWWTransferInterfaceImpl::cleanup(HTRequest * & request)
> {
>     if (request != NULL)
>     {
>         HTRequest_delete(request);
>         request = NULL;
>     }
>     HTProfile_delete();
> }
>
> Does anyone know whether there is a bug in the library or whether I did
> something wrong?  I am using the wwwlib 5.2.8 source and the system is
> UNIX on Solaris 2.6.
>
> Thanks,
> Warren Ho
>
> --
> Warren Ho                                       Algorithmics Inc.
> Software Engineer                               185 Spadina Avenue
> email: warrenh@algorithmics.com                 Toronto, Ontario
> phone: (416)-217-4353                           Canada   M5T 2C6
>
>

Received on Wednesday, 17 May 2000 11:32:09 UTC