@@ -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,7 +679,7 @@ 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
@@ -716,6 +720,7 @@ httpdOutput(request * r, const char *msg)
716
720
src = msg ;
717
721
dest = buf ;
718
722
count = 0 ;
723
+ memset (buf , 0 , HTTP_MAX_LEN );
719
724
while (* src && count < HTTP_MAX_LEN ) {
720
725
if (* src == '$' ) {
721
726
const char * tmp ;
@@ -732,18 +737,17 @@ httpdOutput(request * r, const char *msg)
732
737
}
733
738
* cp = 0 ;
734
739
curVar = httpdGetVariableByName (r , varName );
735
- if (curVar ) {
740
+ if (curVar && (( count + strlen ( curVar -> value )) < HTTP_MAX_LEN ) ) {
736
741
strcpy (dest , curVar -> value );
737
742
dest = dest + strlen (dest );
738
743
count += strlen (dest );
744
+ src = src + strlen (varName ) + 1 ;
745
+ continue ;
739
746
} else {
740
- * dest ++ = '$' ;
741
- strcpy (dest , varName );
742
- dest += strlen (varName );
743
- count += 1 + strlen (varName );
747
+ * dest ++ = * src ++ ;
748
+ count ++ ;
749
+ continue ;
744
750
}
745
- src = src + strlen (varName ) + 1 ;
746
- continue ;
747
751
}
748
752
* dest ++ = * src ++ ;
749
753
count ++ ;
@@ -780,6 +784,7 @@ va_dcl
780
784
if (r -> response .headersSent == 0 )
781
785
httpdSendHeaders (r );
782
786
vsnprintf (buf , HTTP_MAX_LEN , fmt , args );
787
+ va_end (args ); /* Works with both stdargs.h and varargs.h */
783
788
r -> response .responseLength += strlen (buf );
784
789
_httpd_net_write (r -> clientSock , buf , strlen (buf ));
785
790
}
0 commit comments