11#include "../new_common.h"
22#include "../new_pins.h"
33#include "../new_cfg.h"
4- // Commands register, execution API and cmd tokenizer
5- #include "../cmnds/cmd_public.h"
6- #include "../mqtt/new_mqtt.h"
74#include "../logging/logging.h"
8- #include "../hal/hal_pins.h"
95#include "../hal/hal_wifi.h"
10- #include "drv_public.h"
116#include "drv_local.h"
127#include "drv_ssdp.h"
138#include "../httpserver/new_http.h"
@@ -222,26 +217,6 @@ static const char *WEMO_FindHeader(http_request_t *request, const char *namePref
222217 return 0 ;
223218}
224219
225- static void WEMO_PostXMLSafe (http_request_t * request , const char * s ) {
226- const char * p ;
227- if (!s ) return ;
228- for (p = s ; * p ; p ++ ) {
229- switch (* p ) {
230- case '&' : poststr (request , "&" ); break ;
231- case '<' : poststr (request , "<" ); break ;
232- case '>' : poststr (request , ">" ); break ;
233- case '"' : poststr (request , """ ); break ;
234- case '\'' : poststr (request , "'" ); break ;
235- default : {
236- char c [2 ];
237- c [0 ] = * p ;
238- c [1 ] = 0 ;
239- poststr (request , c );
240- } break ;
241- }
242- }
243- }
244-
245220static int WEMO_FindMainChannel (void ) {
246221 int i ;
247222 // Prefer a relay-type channel; fallback to toggle type.
@@ -341,17 +316,20 @@ void DRV_WEMO_Send_Advert_To(int mode, struct sockaddr_in *addr) {
341316 }
342317
343318 stat_searchesReceived ++ ;
319+ if (buffer_out == 0 ) {
320+ outBufferLen = (int )strlen (g_wemo_msearch ) + 256 ;
321+ buffer_out = (char * )malloc (outBufferLen );
322+ if (buffer_out == 0 ) {
323+ addLogAdv (LOG_ERROR , LOG_FEATURE_HTTP , "WEMO failed to allocate SSDP response buffer" );
324+ return ;
325+ }
326+ }
344327
345328 // mode is decided by SSDP driver (historically: 1=Belkin device wildcard, 0=rootdevice).
346329 // For compatibility, when asked for Belkin wildcard, also reply for explicit controllee.
347330 if (mode == 1 ) {
348331 // 1) urn:Belkin:device:**
349332 useType = "urn:Belkin:device:**" ;
350-
351- if (buffer_out == 0 ) {
352- outBufferLen = (int )strlen (g_wemo_msearch ) + 256 ;
353- buffer_out = (char * )malloc (outBufferLen );
354- }
355333 snprintf (buffer_out , outBufferLen , g_wemo_msearch , HAL_GetMyIPString (), useType , g_uid , useType );
356334 DRV_SSDP_SendReply (addr , buffer_out );
357335
@@ -362,11 +340,6 @@ void DRV_WEMO_Send_Advert_To(int mode, struct sockaddr_in *addr) {
362340 }
363341 else {
364342 useType = "upnp:rootdevice" ;
365-
366- if (buffer_out == 0 ) {
367- outBufferLen = (int )strlen (g_wemo_msearch ) + 256 ;
368- buffer_out = (char * )malloc (outBufferLen );
369- }
370343 snprintf (buffer_out , outBufferLen , g_wemo_msearch , HAL_GetMyIPString (), useType , g_uid , useType );
371344 DRV_SSDP_SendReply (addr , buffer_out );
372345 }
@@ -486,7 +459,7 @@ static int WEMO_Setup(http_request_t* request) {
486459 }
487460
488461 poststr (request , g_wemo_setup_1 );
489- WEMO_PostXMLSafe (request , fname );
462+ poststr_escaped (request , ( char * ) fname );
490463 poststr (request , g_wemo_setup_2 );
491464 poststr (request , g_uid );
492465 poststr (request , g_wemo_setup_3 );
@@ -502,18 +475,41 @@ static int WEMO_Setup(http_request_t* request) {
502475}
503476
504477void WEMO_Init () {
505- // (Re)enable Wemo emulation.
506- g_wemo_enabled = 1 ;
507478 char uid [64 ];
508479 char serial [32 ];
509480 unsigned char mac [8 ];
481+ char * newSerial ;
482+ char * newUid ;
510483
511484 WiFI_GetMacAddress ((char * )mac );
512485 snprintf (serial , sizeof (serial ), "201612%02X%02X%02X%02X" , mac [2 ], mac [3 ], mac [4 ], mac [5 ]);
513486 snprintf (uid , sizeof (uid ), "Socket-1_0-%s" , serial );
514487
515- g_serial = strdup (serial );
516- g_uid = strdup (uid );
488+ newSerial = strdup (serial );
489+ newUid = strdup (uid );
490+ if (!newSerial || !newUid ) {
491+ addLogAdv (LOG_ERROR , LOG_FEATURE_HTTP , "WEMO_Init failed to allocate identity strings" );
492+ if (newSerial ) {
493+ free (newSerial );
494+ }
495+ if (newUid ) {
496+ free (newUid );
497+ }
498+ g_wemo_enabled = 0 ;
499+ return ;
500+ }
501+
502+ if (g_serial ) {
503+ free (g_serial );
504+ g_serial = 0 ;
505+ }
506+ if (g_uid ) {
507+ free (g_uid );
508+ g_uid = 0 ;
509+ }
510+ g_serial = newSerial ;
511+ g_uid = newUid ;
512+ g_wemo_enabled = 1 ;
517513
518514 HTTP_RegisterCallback ("/upnp/control/basicevent1" , HTTP_POST , WEMO_BasicEvent1 , 0 );
519515 HTTP_RegisterCallback ("/upnp/control/metainfo1" , HTTP_POST , WEMO_MetaInfo1 , 0 );
@@ -524,6 +520,19 @@ void WEMO_Init() {
524520
525521void WEMO_Shutdown (void ) {
526522 // OpenBeken cannot unregister HTTP callbacks at runtime.
527- // Disable responses/SSDP adverts without freeing identity strings (callbacks may still be hit) .
523+ // Disable responses/SSDP adverts and free runtime buffers .
528524 g_wemo_enabled = 0 ;
525+ if (g_serial ) {
526+ free (g_serial );
527+ g_serial = 0 ;
528+ }
529+ if (g_uid ) {
530+ free (g_uid );
531+ g_uid = 0 ;
532+ }
533+ if (buffer_out ) {
534+ free (buffer_out );
535+ buffer_out = 0 ;
536+ outBufferLen = 0 ;
537+ }
529538}
0 commit comments