@@ -264,7 +264,11 @@ int port;
264
264
}
265
265
# ifdef SO_REUSEADDR
266
266
opt = 1 ;
267
- setsockopt (sock , SOL_SOCKET , SO_REUSEADDR , (char * )& opt , sizeof (int ));
267
+ if (setsockopt (sock , SOL_SOCKET , SO_REUSEADDR , (char * )& opt , sizeof (int )) < 0 ) {
268
+ close (sock );
269
+ free (new );
270
+ return NULL ;
271
+ }
268
272
# endif
269
273
new -> serverSock = sock ;
270
274
bzero (& addr , sizeof (addr ));
@@ -318,8 +322,8 @@ struct timeval *timeout;
318
322
return (NULL );
319
323
}
320
324
if (timeout != 0 && result == 0 ) {
321
- return (NULL );
322
325
server -> lastError = 0 ;
326
+ return (NULL );
323
327
}
324
328
if (result > 0 ) {
325
329
break ;
@@ -675,14 +679,15 @@ httpdSendHeaders(request * r)
675
679
void
676
680
httpdSetResponse (request * r , const char * msg )
677
681
{
678
- strncpy (r -> response .response , msg , HTTP_MAX_URL );
682
+ strncpy (r -> response .response , msg , HTTP_MAX_URL - 1 );
679
683
r -> response .response [HTTP_MAX_URL - 1 ] = 0 ;
680
684
}
681
685
682
686
void
683
687
httpdSetContentType (request * r , const char * type )
684
688
{
685
- strcpy (r -> response .contentType , type );
689
+ strncpy (r -> response .contentType , type , HTTP_MAX_URL - 1 );
690
+ r -> response .contentType [HTTP_MAX_URL - 1 ] = 0 ;
686
691
}
687
692
688
693
void
@@ -716,6 +721,7 @@ httpdOutput(request * r, const char *msg)
716
721
src = msg ;
717
722
dest = buf ;
718
723
count = 0 ;
724
+ memset (buf , 0 , HTTP_MAX_LEN );
719
725
while (* src && count < HTTP_MAX_LEN ) {
720
726
if (* src == '$' ) {
721
727
const char * tmp ;
@@ -732,18 +738,17 @@ httpdOutput(request * r, const char *msg)
732
738
}
733
739
* cp = 0 ;
734
740
curVar = httpdGetVariableByName (r , varName );
735
- if (curVar ) {
741
+ if (curVar && (( count + strlen ( curVar -> value )) < HTTP_MAX_LEN ) ) {
736
742
strcpy (dest , curVar -> value );
737
743
dest = dest + strlen (dest );
738
744
count += strlen (dest );
745
+ src = src + strlen (varName ) + 1 ;
746
+ continue ;
739
747
} else {
740
- * dest ++ = '$' ;
741
- strcpy (dest , varName );
742
- dest += strlen (varName );
743
- count += 1 + strlen (varName );
748
+ * dest ++ = * src ++ ;
749
+ count ++ ;
750
+ continue ;
744
751
}
745
- src = src + strlen (varName ) + 1 ;
746
- continue ;
747
752
}
748
753
* dest ++ = * src ++ ;
749
754
count ++ ;
@@ -780,6 +785,7 @@ va_dcl
780
785
if (r -> response .headersSent == 0 )
781
786
httpdSendHeaders (r );
782
787
vsnprintf (buf , HTTP_MAX_LEN , fmt , args );
788
+ va_end (args ); /* Works with both stdargs.h and varargs.h */
783
789
r -> response .responseLength += strlen (buf );
784
790
_httpd_net_write (r -> clientSock , buf , strlen (buf ));
785
791
}
0 commit comments