diff --git a/lib/sdp.c b/lib/sdp.c
index 4b10d8f..dfc06b6 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
}
int sdp_get_string_attr(const sdp_record_t *rec, uint16_t attrid, char *value,
- int valuelen)
+ size_t valuelen)
{
sdp_data_t *sdpdata = sdp_data_get(rec, attrid);
- if (sdpdata)
- /* Verify that it is what the caller expects */
- if (SDP_IS_TEXT_STR(sdpdata->dtd))
- if ((int) strlen(sdpdata->val.str) < valuelen) {
- strcpy(value, sdpdata->val.str);
- return 0;
- }
+
+ /* Verify that it is what the caller expects */
+ if (!sdpdata || !SDP_IS_TEXT_STR(sdpdata->dtd))
+ goto fail;
+
+ /* Have to copy the NULL terminator too, so check len < valuelen. */
+ if (strlen(sdpdata->val.str) < valuelen) {
+ strcpy(value, sdpdata->val.str);
+ return 0;
+ }
+
+fail:
errno = EINVAL;
return -1;
}
diff --git a/lib/sdp_lib.h b/lib/sdp_lib.h
index 22776b6..aad664f 100644
--- a/lib/sdp_lib.h
+++ b/lib/sdp_lib.h
/* flexible extraction of basic attributes - Jean II */
int sdp_get_int_attr(const sdp_record_t *rec, uint16_t attr, int *value);
-int sdp_get_string_attr(const sdp_record_t *rec, uint16_t attr, char *value, int valuelen);
+int sdp_get_string_attr(const sdp_record_t *rec, uint16_t attr, char *value,
+ size_t valuelen);
/*
* Basic sdp data functions
int sdp_get_service_ttl(const sdp_record_t *rec, uint32_t *svcTTLInfo);
int sdp_get_database_state(const sdp_record_t *rec, uint32_t *svcDBState);
-static inline int sdp_get_service_name(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_service_name(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_SVCNAME_PRIMARY, str, len);
}
-static inline int sdp_get_service_desc(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_service_desc(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_SVCDESC_PRIMARY, str, len);
}
-static inline int sdp_get_provider_name(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_provider_name(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_PROVNAME_PRIMARY, str, len);
}
-static inline int sdp_get_doc_url(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_doc_url(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_DOC_URL, str, len);
}
-static inline int sdp_get_clnt_exec_url(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_clnt_exec_url(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_CLNT_EXEC_URL, str, len);
}
-static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str, int len)
+static inline int sdp_get_icon_url(const sdp_record_t *rec, char *str,
+ size_t len)
{
return sdp_get_string_attr(rec, SDP_ATTR_ICON_URL, str, len);
}