$OpenBSD: patch-Http_cpp,v 1.3 2009/10/22 23:07:54 sthen Exp $ --- Http.cpp.orig Thu Oct 23 10:51:17 2008 +++ Http.cpp Thu Oct 15 17:59:28 2009 @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -41,7 +42,10 @@ static void http_begin_cb( const Response* r, void* us static void http_data_cb( const Response* r, void* userdata, const unsigned char* data, int numbytes ) { - fwrite( data, 1, numbytes, ((Http*)userdata)->m_file ); + size_t byteswritten; + if ( ( byteswritten = fwrite( data, 1, numbytes, ((Http*)userdata)->m_file ) ) != numbytes ) + fprintf(stderr, "Wrote %d, should have written %d, http status=%d %s\n", + byteswritten, numbytes, r->getstatus(), r->getreason()); ((Http*)userdata)->m_size += numbytes; } @@ -60,7 +64,11 @@ static bool parseUri( const char * uri, if ( strncmp(uri,"http://",strlen("http://"))==0 ) { uri += strlen("http://"); } - strcpy(outHost,uri); + if (strlcpy(outHost,uri,sizeof(outHost)) >= sizeof(outHost)) { + errno = ENAMETOOLONG; + perror("strlcpy"); + return false; + } char* e = strchr(outHost,'/'); *outPort = 80; @@ -72,7 +80,11 @@ static bool parseUri( const char * uri, *e = '\0'; *outPort=atoi(e+1); } - strcpy( outPath, strchr(uri,'/') ); + if (strlcpy( outPath, strchr(uri,'/'), sizeof(outPath)) >= sizeof(outPath)) { + errno = ENAMETOOLONG; + perror("strlcpy"); + return false; + } fprintf(stderr,"Http::get host=%s port=%d file=%s\n",outHost,*outPort,outPath); return true; } @@ -97,13 +109,12 @@ bool Http::get( const char* uri, fprintf(stderr,"http_get pump\n"); con.pump(); } - } catch ( Wobbly w ) { + } catch ( const Wobbly& w ) { fprintf(stderr,"http_get wobbly: %s\n",w.what()); } } fclose ( m_file ); - free( host ); return m_size > 0; } @@ -126,10 +137,12 @@ bool Http::post( const char* uri, const char*putname, fprintf(stderr,"http_get pump\n"); con.pump(); } - } catch ( Wobbly w ) { + } catch ( const Wobbly& w ) { fprintf(stderr,"http_get wobbly: %s\n",w.what()); + return false; } } + return true; }