diff options
-rw-r--r-- | sdpd/service.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/sdpd/service.c b/sdpd/service.c index 0bdc87fb..cd40541b 100644 --- a/sdpd/service.c +++ b/sdpd/service.c @@ -137,21 +137,25 @@ int service_register_req(sdp_req_t *req, sdp_buf_t *rsp) // save image of PDU: we need it when clients request this attribute rec = extract_pdu_server(&req->device, p, 0xffffffff, &scanned); - if (!rec) { - sdp_put_unaligned(htons(SDP_INVALID_SYNTAX), (uint16_t *)rsp->data); - rsp->data_size = sizeof(uint16_t); - return -1; - } + if (!rec) + goto invalid; - rec->handle = sdp_next_handle(); - if (rec->handle < 0x10000) - return -1; + if (rec->handle == 0xffffffff) { + rec->handle = sdp_next_handle(); + if (rec->handle < 0x10000) + goto invalid; + } else { + if (sdp_record_find(rec->handle)) + goto invalid; + } sdp_record_add(&req->device, rec); if (!(req->flags & SDP_RECORD_PERSIST)) sdp_svcdb_set_collectable(rec, req->sock); + handle = sdp_data_alloc(SDP_UINT32, &rec->handle); sdp_attr_replace(rec, SDP_ATTR_RECORD_HANDLE, handle); + /* * if the browse group descriptor is NULL, * ensure that the record belongs to the ROOT group @@ -161,12 +165,20 @@ int service_register_req(sdp_req_t *req, sdp_buf_t *rsp) sdp_uuid16_create(&uuid, PUBLIC_BROWSE_GROUP); sdp_pattern_add_uuid(rec, &uuid); } + update_db_timestamp(); /* Build a rsp buffer */ sdp_put_unaligned(htonl(rec->handle), (uint32_t *)rsp->data); rsp->data_size = sizeof(uint32_t); + return 0; + +invalid: + sdp_put_unaligned(htons(SDP_INVALID_SYNTAX), (uint16_t *) rsp->data); + rsp->data_size = sizeof(uint16_t); + + return -1; } /* |