--- mqtt/src/Attic/conn.c 2011/12/13 10:12:36 1.1.2.13 +++ mqtt/src/Attic/conn.c 2011/12/16 02:09:20 1.1.2.15 @@ -8,6 +8,7 @@ * * @buf = Message buffer * @csConnID = ConnectID + * @kasec = Keep alive timeout * @csUser = Username if !=NULL * @csPass = Password for Username, only if csUser is set * @csWillTopic = Will Topic if !=NULL Will Flags set into message @@ -19,7 +20,7 @@ */ int mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const char *csConnID, - const char *csUser, const char *csPass, + u_short kasec, const char *csUser, const char *csPass, const char *csWillTopic, const char *csWillMessage, u_char ClrSess, u_char WillQOS, u_char WillRetain) { @@ -32,15 +33,15 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha if (!buf || !csConnID) return -1; - if (strlen(csConnID) > 24) { + if (strlen(csConnID) > 23) { mqtt_SetErr(EINVAL, "Error:: invalid argument ConnID is too long (max 23 bytes)"); return -1; } - if (csUser && strlen(csUser) > 13) { + if (csUser && strlen(csUser) > 12) { mqtt_SetErr(EINVAL, "Error:: invalid argument Username is too long (max 12 bytes)"); return -1; } - if (csPass && strlen(csPass) > 13) { + if (csPass && strlen(csPass) > 12) { mqtt_SetErr(EINVAL, "Error:: invalid argument Password is too long (max 12 bytes)"); return -1; } @@ -77,14 +78,14 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha /* CONNECT header */ flags->clean_sess = ClrSess ? 1 : 0; - if (csUser) { + if (csUser && *csUser) { flags->username = 1; flags->password = csPass ? 1 : 0; } else { flags->username = 0; flags->password = 0; } - if (csWillTopic) { + if (csWillTopic && *csWillTopic) { flags->will_flg = 1; flags->will_qos = WillQOS; flags->will_retain = WillRetain ? 1 : 0; @@ -94,7 +95,7 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha flags->will_retain = 0; } - ka->sb.l = MQTT_KEEPALIVE; + ka->val = kasec ? htons(kasec) : htons(MQTT_KEEPALIVE); /* ConnID */ cid = (mqtthdr_var_t*) (buf->msg_base + siz); @@ -103,14 +104,14 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val)); /* If Will Flags setup */ - if (csWillTopic) { + if (csWillTopic && *csWillTopic) { topic = (mqtthdr_var_t*) (buf->msg_base + siz); topic->var_sb.val = htons(strlen(csWillTopic)); memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val)); siz += MQTTHDR_VAR_SIZEOF(topic); wmsg = (mqtthdr_var_t*) (buf->msg_base + siz); - if (csWillMessage) { + if (csWillMessage && *csWillMessage) { wmsg->var_sb.val = htons(strlen(csWillMessage)); memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val)); } else @@ -119,13 +120,13 @@ mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const cha } /* If defined Username & Password */ - if (csUser) { + if (csUser && *csUser) { user = (mqtthdr_var_t*) (buf->msg_base + siz); user->var_sb.val = htons(strlen(csUser)); memcpy(user->var_data, csUser, ntohs(user->var_sb.val)); siz += MQTTHDR_VAR_SIZEOF(user); - if (csPass) { + if (csPass && *csPass) { pass = (mqtthdr_var_t*) (buf->msg_base + siz); pass->var_sb.val = htons(strlen(csPass)); memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val)); @@ -311,7 +312,7 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short /* get ConnID */ var = (mqtthdr_var_t*) pos; len -= MQTTHDR_VAR_SIZEOF(var); - if (len < 0) { + if (len < 0 || var->var_sb.sb.l > 23) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Connection ID %d", len); cack.retcode = MQTT_RETCODE_REFUSE_ID; return cack; @@ -368,7 +369,7 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short if (flg.username) { var = (mqtthdr_var_t*) pos; len -= MQTTHDR_VAR_SIZEOF(var); - if (len < 0) { + if (len < 0 || var->var_sb.sb.l > 12) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Username %d", len); cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; return cack; @@ -384,7 +385,7 @@ mqtt_readCONNECT(mqtt_msg_t * __restrict buf, u_short if (flg.password) { var = (mqtthdr_var_t*) pos; len -= MQTTHDR_VAR_SIZEOF(var); - if (len < 0) { + if (len < 0 || var->var_sb.sb.l > 12) { mqtt_SetErr(EINVAL, "Error:: unexpected EOM at Password %d", len); cack.retcode = MQTT_RETCODE_REFUSE_USERPASS; return cack;